#ifdef JP
-typedef struct sindarin2j sindarin2j;
+typedef struct convert_key convert_key;
-struct sindarin2j {
- char *sindarin;
- char *kana;
+struct convert_key
+{
+ cptr key1;
+ cptr key2;
};
-static const sindarin2j s2j_table[]= {
-{"mb","nb"},{"mp","np"},{"mv","nv"},{"mm","nm"},
-{"x","ks"},
-{"ar$","a-ru$"},{"ir$","ia$"},{"or$","o-ru$"},
-{"ra","¥é"},{"ri","¥ê"},{"ru","¥ë"},{"re","¥ì"},{"ro","¥í"},
-{"ir","ia"},{"ur","ua"},{"er","ea"},
-{"ar","a¥ë"},
-{"sha","¥·¥ã"},{"shi","¥·"},{"shu","¥·¥å"},{"she","¥·¥§"},{"sho","¥·¥ç"},
-{"tha","¥µ"},{"thi","¥·"},{"thu","¥¹"},{"the","¥»"},{"tho","¥½"},
-{"cha","¥Ï"},{"chi","¥Ò"},{"chu","¥Õ"},{"che","¥Ø"},{"cho","¥Û"},
-{"dha","¥¶"},{"dhi","¥¸"},{"dhu","¥º"},{"dhe","¥¼"},{"dho","¥¾"},
-{"ba","¥Ð"},{"bi","¥Ó"},{"bu","¥Ö"},{"be","¥Ù"},{"bo","¥Ü"},
-{"ca","¥«"},{"ci","¥"},{"cu","¥¯"},{"ce","¥±"},{"co","¥³"},
-{"da","¥À"},{"di","¥Ç¥£"},{"du","¥É¥¥"},{"de","¥Ç"},{"do","¥É"},
-{"fa","¥Õ¥¡"},{"fi","¥Õ¥£"},{"fu","¥Õ"},{"fe","¥Õ¥§"},{"fo","¥Õ¥©"},
-{"ga","¥¬"},{"gi","¥®"},{"gu","¥°"},{"ge","¥²"},{"go","¥´"},
-{"ha","¥Ï"},{"hi","¥Ò"},{"hu","¥Õ"},{"he","¥Ø"},{"ho","¥Û"},
-{"ja","¥¸¥ã"},{"ji","¥¸"},{"ju","¥¸¥å"},{"je","¥¸¥§"},{"jo","¥¸¥ç"},
-{"ka","¥«"},{"ki","¥"},{"ku","¥¯"},{"ke","¥±"},{"ko","¥³"},
-{"la","¥é"},{"li","¥ê"},{"lu","¥ë"},{"le","¥ì"},{"lo","¥í"},
-{"ma","¥Þ"},{"mi","¥ß"},{"mu","¥à"},{"me","¥á"},{"mo","¥â"},
-{"na","¥Ê"},{"ni","¥Ë"},{"nu","¥Ì"},{"ne","¥Í"},{"no","¥Î"},
-{"pa","¥Ñ"},{"pi","¥Ô"},{"pu","¥×"},{"pe","¥Ú"},{"po","¥Ý"},
-{"qu","¥¯"},
-{"sa","¥µ"},{"si","¥·"},{"su","¥¹"},{"se","¥»"},{"so","¥½"},
-{"ta","¥¿"},{"ti","¥Æ¥£"},{"tu","¥È¥¥"},{"te","¥Æ"},{"to","¥È"},
-{"va","¥ô¥¡"},{"vi","¥ô¥£"},{"vu","¥ô"},{"ve","¥ô¥§"},{"vo","¥ô¥©"},
-{"wa","¥ï"},{"wi","¥¦¥£"},{"wu","¥¦"},{"we","¥¦¥§"},{"wo","¥¦¥©"},
-{"ya","¥ä"},{"yu","¥æ"},{"yo","¥è"},
-{"za","¥¶"},{"zi","¥¸"},{"zu","¥º"},{"ze","¥¼"},{"zo","¥¾"},
-{"dh","¥º"},
-{"ch","¥Õ"},
-{"th","¥¹"},
-{"b","¥Ö"},
-{"c","¥¯"},
-{"d","¥É"},
-{"f","¥Õ"},
-{"g","¥°"},
-{"h","¥Õ"},
-{"j","¥¸¥å"},
-{"k","¥¯"},
-{"l","¥ë"},
-{"m","¥à"},
-{"n","¥ó"},
-{"p","¥×"},
-{"q","¥¯"},
-{"r","¥ë"},
-{"s","¥¹"},
-{"t","¥È"},
-{"v","¥ô"},
-{"w","¥¦"},
-{"y","¥¤"},
-{"a","¥¢"},
-{"i","¥¤"},
-{"u","¥¦"},
-{"e","¥¨"},
-{"o","¥ª"},
-{"-","¡¼"},
-{NULL,NULL}
+static const convert_key s2j_table[] = {
+ {"mb","nb"}, {"mp","np"}, {"mv","nv"}, {"mm","nm"},
+ {"x","ks"},
+ /* sindar:¥·¥ó¥À¡¼¥ë parantir:¥Ñ¥é¥ó¥Æ¥£¥¢ feanor:¥Õ¥§¥¢¥Î¡¼¥ë */
+ {"ar$","a-ru$"}, {"ir$","ia$"}, {"or$","o-ru$"},
+ {"ra","¥é"}, {"ri","¥ê"}, {"ru","¥ë"}, {"re","¥ì"}, {"ro","¥í"},
+ {"ir","ia"}, {"ur","ua"}, {"er","ea"}, {"ar","a¥ë"},
+ {"sha","¥·¥ã"}, {"shi","¥·"}, {"shu","¥·¥å"}, {"she","¥·¥§"}, {"sho","¥·¥ç"},
+ {"tha","¥µ"}, {"thi","¥·"}, {"thu","¥¹"}, {"the","¥»"}, {"tho","¥½"},
+ {"cha","¥Ï"}, {"chi","¥Ò"}, {"chu","¥Õ"}, {"che","¥Ø"}, {"cho","¥Û"},
+ {"dha","¥¶"}, {"dhi","¥¸"}, {"dhu","¥º"}, {"dhe","¥¼"}, {"dho","¥¾"},
+ {"ba","¥Ð"}, {"bi","¥Ó"}, {"bu","¥Ö"}, {"be","¥Ù"}, {"bo","¥Ü"},
+ {"ca","¥«"}, {"ci","¥"}, {"cu","¥¯"}, {"ce","¥±"}, {"co","¥³"},
+ {"da","¥À"}, {"di","¥Ç¥£"}, {"du","¥É¥¥"}, {"de","¥Ç"}, {"do","¥É"},
+ {"fa","¥Õ¥¡"}, {"fi","¥Õ¥£"}, {"fu","¥Õ"}, {"fe","¥Õ¥§"}, {"fo","¥Õ¥©"},
+ {"ga","¥¬"}, {"gi","¥®"}, {"gu","¥°"}, {"ge","¥²"}, {"go","¥´"},
+ {"ha","¥Ï"}, {"hi","¥Ò"}, {"hu","¥Õ"}, {"he","¥Ø"}, {"ho","¥Û"},
+ {"ja","¥¸¥ã"}, {"ji","¥¸"}, {"ju","¥¸¥å"}, {"je","¥¸¥§"}, {"jo","¥¸¥ç"},
+ {"ka","¥«"}, {"ki","¥"}, {"ku","¥¯"}, {"ke","¥±"}, {"ko","¥³"},
+ {"la","¥é"}, {"li","¥ê"}, {"lu","¥ë"}, {"le","¥ì"}, {"lo","¥í"},
+ {"ma","¥Þ"}, {"mi","¥ß"}, {"mu","¥à"}, {"me","¥á"}, {"mo","¥â"},
+ {"na","¥Ê"}, {"ni","¥Ë"}, {"nu","¥Ì"}, {"ne","¥Í"}, {"no","¥Î"},
+ {"pa","¥Ñ"}, {"pi","¥Ô"}, {"pu","¥×"}, {"pe","¥Ú"}, {"po","¥Ý"},
+ {"qu","¥¯"},
+ {"sa","¥µ"}, {"si","¥·"}, {"su","¥¹"}, {"se","¥»"}, {"so","¥½"},
+ {"ta","¥¿"}, {"ti","¥Æ¥£"}, {"tu","¥È¥¥"}, {"te","¥Æ"}, {"to","¥È"},
+ {"va","¥ô¥¡"}, {"vi","¥ô¥£"}, {"vu","¥ô"}, {"ve","¥ô¥§"}, {"vo","¥ô¥©"},
+ {"wa","¥ï"}, {"wi","¥¦¥£"}, {"wu","¥¦"}, {"we","¥¦¥§"}, {"wo","¥¦¥©"},
+ {"ya","¥ä"}, {"yu","¥æ"}, {"yo","¥è"},
+ {"za","¥¶"}, {"zi","¥¸"}, {"zu","¥º"}, {"ze","¥¼"}, {"zo","¥¾"},
+ {"dh","¥º"}, {"ch","¥Õ"}, {"th","¥¹"},
+ {"b","¥Ö"}, {"c","¥¯"}, {"d","¥É"}, {"f","¥Õ"}, {"g","¥°"},
+ {"h","¥Õ"}, {"j","¥¸¥å"}, {"k","¥¯"}, {"l","¥ë"}, {"m","¥à"},
+ {"n","¥ó"}, {"p","¥×"}, {"q","¥¯"}, {"r","¥ë"}, {"s","¥¹"},
+ {"t","¥È"}, {"v","¥ô"}, {"w","¥¦"}, {"y","¥¤"},
+ {"a","¥¢"}, {"i","¥¤"}, {"u","¥¦"}, {"e","¥¨"}, {"o","¥ª"},
+ {"-","¡¼"},
+ {NULL,NULL}
};
-unsigned char *sindarin_to_kana( unsigned char *sindarin ){
-static unsigned char buf1[256], buf2[256];
-int idx;
+/* ¥·¥ó¥À¥ê¥ó¤òÆüËܸì¤ÎÆɤߤËÊÑ´¹¤¹¤ë */
+void sindarin_to_kana(char *kana, const char *sindarin)
+{
+ char buf[256];
+ int idx;
+
+ sprintf(kana, "%s$", sindarin);
+ for (idx = 0; kana[idx]; idx++)
+ if (isupper(kana[idx])) kana[idx] = tolower(kana[idx]);
+
+ for (idx = 0; s2j_table[idx].key1 != NULL; idx++)
+ {
+ cptr pat1 = s2j_table[idx].key1;
+ cptr pat2 = s2j_table[idx].key2;
+ int len = strlen(pat1);
+ char *src = kana;
+ char *dest = buf;
+
+ while (*src)
+ {
+ if (strncmp(src, pat1, len) == 0)
+ {
+ strcpy(dest, pat2);
+ src += len;
+ dest += strlen(pat2);
+ }
+ else
+ {
+ if (iskanji(*src))
+ {
+ *dest = *src;
+ src++;
+ dest++;
+ }
+ *dest = *src;
+ src++;
+ dest++;
+ }
+ }
-sprintf(buf1,"%s$",sindarin);
-for(idx=0;buf1[idx];idx++) if( isupper(buf1[idx]))buf1[idx]=tolower(buf1[idx]);
+ *dest = 0;
+ strcpy(kana, buf);
+ }
-for(idx=0; s2j_table[idx].sindarin != NULL;idx++){
- unsigned char *pat1 = s2j_table[idx].sindarin;
- unsigned char *pat2 = s2j_table[idx].kana;
- int len=strlen(pat1);
- unsigned char *dest = buf2;
- unsigned char *src = buf1;
-
- for( ; *src ; ){
- if( strncmp( src, pat1, len)==0 ){
- strcpy( dest, pat2 );
- src+=len;
- dest+= strlen(pat2);
- }
- else
- if( iskanji(*src) ){
- *dest = *src;
- dest++; src++;
- *dest=*src;
- dest++; src++;
- }
- else{
- *dest=*src;
- dest++; src++;
- }
- }
- *dest=0;
- strcpy(buf1,buf2);
-}
-idx=0;
-while( buf1[idx] != '$' ) idx++;
-buf1[idx]=0;
-return(buf1);
+ idx = 0;
+
+ while (kana[idx] != '$') idx++;
+
+ kana[idx] = '\0';
}
+
/*ÆüËܸìÆ°»ì³èÍÑ (ÂǤġäÂǤäÆ,ÂǤÁ etc) */
+/* JVERB_AND: ²¥¤ë,½³¤ë > ²¥¤ê,½³¤ë */
+/* JVERB_TO: ²¥¤ë,½³¤ë > ²¥¤Ã¤Æ½³¤ë */
+/* JVERB_OR: ²¥¤ë,½³¤ë > ²¥¤Ã¤¿¤ê½³¤Ã¤¿¤ê */
+
+static const struct jverb_table_t {
+ const char* from;
+ const char* to[3];
+} jverb_table[] = {
+ { "¤¹¤ë", {"¤·", "¤·¤Æ", "¤·¤¿"}},
+ { "¤¤¤ë", {"¤¤¤Æ", "¤¤¤Æ", "¤¤¤¿"}},
+
+ { "¤¨¤ë", {"¤¨", "¤¨¤Æ", "¤¨¤¿"}},
+ { "¤±¤ë", {"¤±", "¤±¤Æ", "¤±¤¿"}},
+ { "¤²¤ë", {"¤²", "¤¨¤Æ", "¤²¤¿"}},
+ { "¤»¤ë", {"¤»", "¤»¤Æ", "¤»¤¿"}},
+ { "¤¼¤ë", {"¤¼", "¤¼¤Æ", "¤¼¤¿"}},
+ { "¤Æ¤ë", {"¤Æ", "¤Æ¤Ã¤Æ", "¤Æ¤Ã¤¿"}},
+ { "¤Ç¤ë", {"¤Ç", "¤Ç¤Æ", "¤Ç¤¿"}},
+ { "¤Í¤ë", {"¤Í", "¤Í¤Æ", "¤Í¤¿"}},
+ { "¤Ø¤ë", {"¤Ø", "¤Ø¤Æ", "¤Ø¤¿"}},
+ { "¤Ù¤ë", {"¤Ù", "¤Ù¤Æ", "¤Ù¤¿"}},
+ { "¤á¤ë", {"¤á", "¤á¤Æ", "¤á¤¿"}},
+ { "¤ì¤ë", {"¤ì", "¤ì¤Æ", "¤ì¤¿"}},
+
+ { "¤¦", {"¤¤", "¤Ã¤Æ", "¤Ã¤¿"}},
+ { "¤¯", {"¤", "¤¤¤Æ", "¤¤¤¿"}},
+ { "¤°", {"¤®", "¤¤¤Ç", "¤¤¤À"}},
+ { "¤¹", {"¤·", "¤·¤Æ", "¤·¤¿"}},
+ { "¤º", {"¤¸", "¤¸¤Æ", "¤¸¤¿"}},
+ { "¤Ä", {"¤Á", "¤Ã¤Æ", "¤Ã¤¿"}},
+ { "¤Å", {"¤Â", "¤Ã¤Æ", "¤Ã¤¿"}},
+ { "¤Ì", {"¤Ë", "¤Í¤Æ", "¤Í¤¿"}},
+ { "¤Õ", {"¤Ò", "¤Ø¤Æ", "¤Ø¤¿"}},
+ { "¤Ö", {"¤Ó", "¤ó¤Ç", "¤ó¤À"}},
+ { "¤à", {"¤ß", "¤ó¤Ç", "¤ó¤À"}},
+ { "¤ë", {"¤ê", "¤Ã¤Æ", "¤Ã¤¿"}},
+ { NULL, {"¤½¤·¤Æ", "¤³¤È¤Ë¤è¤ê", "¤³¤È¤ä"}},
+};
+
+void jverb(const char *in , char *out , int flag)
+{
+ const struct jverb_table_t * p;
+ int in_len = strlen(in);
+
+ strcpy(out, in);
+
+ for (p = jverb_table; p->from; p++) {
+ int from_len = strlen(p->from);
+ if (strncmp(&in[in_len-from_len], p->from, from_len) == 0) {
+ strcpy(&out[in_len - from_len], p->to[flag - 1]);
+ break;
+ }
+ }
-#define CMPTAIL(y) strncmp(&in[l-strlen(y)],y,strlen(y))
-
-/* ²¥¤ë,½³¤ë¡ä²¥¤ê,½³¤ë */
-void jverb1( const char *in , char *out){
-int l=strlen(in);
-strcpy(out,in);
-
-if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·");else
-if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤Æ");else
-
-if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨");else
-if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±");else
-if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²");else
-if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»");else
-if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼");else
-if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ");else
-if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç");else
-if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í");else
-if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø");else
-if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù");else
-if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á");else
-if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì");else
-
-if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤¤");else
-if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤");else
-if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤®");else
-if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·");else
-if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸");else
-if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Á");else
-if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Â");else
-if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Ë");else
-if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ò");else
-if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤Ó");else
-if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ß");else
-if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤ê");else
-
- sprintf(&out[l],"¤½¤·¤Æ");}
-
-/* ²¥¤ë,½³¤ë> ²¥¤Ã¤Æ½³¤ë */
-void jverb2( const char *in , char *out){
-int l=strlen(in);
-strcpy(out,in);
-
-if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·¤Æ");else
-if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤Æ");else
-
-if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨¤Æ");else
-if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±¤Æ");else
-if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²¤Æ");else
-if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»¤Æ");else
-if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼¤Æ");else
-if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ¤Ã¤Æ");else
-if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç¤Æ");else
-if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í¤Æ");else
-if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø¤Æ");else
-if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù¤Æ");else
-if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á¤Æ");else
-if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì¤Æ");else
-
-if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
-if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤¤¤Æ");else
-if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤¤¤Ç");else
-if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·¤Æ");else
-if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸¤Æ");else
-if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
-if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
-if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Í¤Æ");else
-if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ø¤Æ");else
-if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤ó¤Ç");else
-if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ó¤Ç");else
-if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤Ã¤Æ");else
- sprintf(&out[l],"¤³¤È¤Ë¤è¤ê");}
-
-/* ²¥¤ë,½³¤ë > ²¥¤Ã¤¿¤ê½³¤Ã¤¿¤ê */
-void jverb3( const char *in , char *out){
-int l=strlen(in);
-strcpy(out,in);
-
-if( CMPTAIL("¤¹¤ë")==0) sprintf(&out[l-4],"¤·¤¿");else
-if( CMPTAIL("¤¤¤ë")==0) sprintf(&out[l-4],"¤¤¤¿");else
-
-if( CMPTAIL("¤¨¤ë")==0) sprintf(&out[l-4],"¤¨¤¿");else
-if( CMPTAIL("¤±¤ë")==0) sprintf(&out[l-4],"¤±¤¿");else
-if( CMPTAIL("¤²¤ë")==0) sprintf(&out[l-4],"¤²¤¿");else
-if( CMPTAIL("¤»¤ë")==0) sprintf(&out[l-4],"¤»¤¿");else
-if( CMPTAIL("¤¼¤ë")==0) sprintf(&out[l-4],"¤¼¤¿");else
-if( CMPTAIL("¤Æ¤ë")==0) sprintf(&out[l-4],"¤Æ¤Ã¤¿");else
-if( CMPTAIL("¤Ç¤ë")==0) sprintf(&out[l-4],"¤Ç¤¿");else
-if( CMPTAIL("¤Í¤ë")==0) sprintf(&out[l-4],"¤Í¤¿");else
-if( CMPTAIL("¤Ø¤ë")==0) sprintf(&out[l-4],"¤Ø¤¿");else
-if( CMPTAIL("¤Ù¤ë")==0) sprintf(&out[l-4],"¤Ù¤¿");else
-if( CMPTAIL("¤á¤ë")==0) sprintf(&out[l-4],"¤á¤¿");else
-if( CMPTAIL("¤ì¤ë")==0) sprintf(&out[l-4],"¤ì¤¿");else
-
-if( CMPTAIL("¤¦")==0) sprintf(&out[l-2],"¤Ã¤¿");else
-if( CMPTAIL("¤¯")==0) sprintf(&out[l-2],"¤¤¤¿");else
-if( CMPTAIL("¤°")==0) sprintf(&out[l-2],"¤¤¤À");else
-if( CMPTAIL("¤¹")==0) sprintf(&out[l-2],"¤·¤¿");else
-if( CMPTAIL("¤º")==0) sprintf(&out[l-2],"¤¸¤¿");else
-if( CMPTAIL("¤Ä")==0) sprintf(&out[l-2],"¤Ã¤¿");else
-if( CMPTAIL("¤Å")==0) sprintf(&out[l-2],"¤Ã¤¿");else
-if( CMPTAIL("¤Ì")==0) sprintf(&out[l-2],"¤Í¤¿");else
-if( CMPTAIL("¤Õ")==0) sprintf(&out[l-2],"¤Ø¤¿");else
-if( CMPTAIL("¤Ö")==0) sprintf(&out[l-2],"¤ó¤À");else
-if( CMPTAIL("¤à")==0) sprintf(&out[l-2],"¤ó¤À");else
-if( CMPTAIL("¤ë")==0) sprintf(&out[l-2],"¤Ã¤¿");else
- sprintf(&out[l],"¤³¤È¤ä");}
-
-
-void jverb( const char *in , char *out , int flag){
- switch (flag){
- case JVERB_AND:jverb1(in , out);break;
- case JVERB_TO :jverb2(in , out);break;
- case JVERB_OR :jverb3(in , out);break;
- }
+ if (p->from == NULL)
+ strcpy(&out[in_len], p->to[flag - 1]);
}
-char* strstr_j(const char* s, const char* t)
+
+/*
+ * Convert SJIS string to EUC string
+ */
+void sjis2euc(char *str)
+{
+ int i;
+ unsigned char c1, c2;
+ unsigned char *tmp;
+
+ int len = strlen(str);
+
+ C_MAKE(tmp, len+1, byte);
+
+ for (i = 0; i < len; i++)
+ {
+ c1 = str[i];
+ if (c1 & 0x80)
+ {
+ i++;
+ c2 = str[i];
+ if (c2 >= 0x9f)
+ {
+ c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe0 : 0x60);
+ c2 += 2;
+ }
+ else
+ {
+ c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe1 : 0x61);
+ c2 += 0x60 + (c2 < 0x7f);
+ }
+ tmp[i - 1] = c1;
+ tmp[i] = c2;
+ }
+ else
+ tmp[i] = c1;
+ }
+ tmp[len] = 0;
+ strcpy(str, (char *)tmp);
+
+ C_KILL(tmp, len+1, byte);
+}
+
+
+/*
+ * Convert EUC string to SJIS string
+ */
+void euc2sjis(char *str)
{
- int i, l1, l2;
-
- l1 = strlen(s);
- l2 = strlen(t);
- if (l1 >= l2) {
- for(i = 0; i <= l1 - l2; i++) {
- if(!strncmp(s + i, t, l2))
- return (char *)s + i;
- if (iskanji(*(s + i)))
- i++;
+ int i;
+ unsigned char c1, c2;
+ unsigned char *tmp;
+
+ int len = strlen(str);
+
+ C_MAKE(tmp, len+1, byte);
+
+ for (i = 0; i < len; i++)
+ {
+ c1 = str[i];
+ if (c1 & 0x80)
+ {
+ i++;
+ c2 = str[i];
+ if (c1 % 2)
+ {
+ c1 = (c1 >> 1) + (c1 < 0xdf ? 0x31 : 0x71);
+ c2 -= 0x60 + (c2 < 0xe0);
+ }
+ else
+ {
+ c1 = (c1 >> 1) + (c1 < 0xdf ? 0x30 : 0x70);
+ c2 -= 2;
+ }
+
+ tmp[i - 1] = c1;
+ tmp[i] = c2;
+ }
+ else
+ tmp[i] = c1;
+ }
+ tmp[len] = 0;
+ strcpy(str, (char *)tmp);
+
+ C_KILL(tmp, len+1, byte);
+}
+
+
+/*
+ * str¤ò´Ä¶¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
+ * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
+ *
+ * 0: Unknown
+ * 1: ASCII (Never known to be ASCII in this function.)
+ * 2: EUC
+ * 3: SJIS
+ */
+byte codeconv(char *str)
+{
+ byte code = 0;
+ int i;
+
+ for (i = 0; str[i]; i++)
+ {
+ unsigned char c1;
+ unsigned char c2;
+
+ /* First byte */
+ c1 = str[i];
+
+ /* ASCII? */
+ if (!(c1 & 0x80)) continue;
+
+ /* Second byte */
+ i++;
+ c2 = str[i];
+
+ if (((0xa1 <= c1 && c1 <= 0xdf) || (0xfd <= c1 && c1 <= 0xfe)) &&
+ (0xa1 <= c2 && c2 <= 0xfe))
+ {
+ /* Only EUC is allowed */
+ if (!code)
+ {
+ /* EUC */
+ code = 2;
+ }
+
+ /* Broken string? */
+ else if (code != 2)
+ {
+ /* No conversion */
+ return 0;
+ }
+ }
+
+ else if (((0x81 <= c1 && c1 <= 0x9f) &&
+ ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) ||
+ ((0xe0 <= c1 && c1 <= 0xfc) &&
+ (0x40 <= c2 && c2 <= 0x7e)))
+ {
+ /* Only SJIS is allowed */
+ if (!code)
+ {
+ /* SJIS */
+ code = 3;
+ }
+
+ /* Broken string? */
+ else if (code != 3)
+ {
+ /* No conversion */
+ return 0;
+ }
}
}
- return NULL;
+
+
+ switch (code)
+ {
+#ifdef EUC
+ case 3:
+ /* SJIS -> EUC */
+ sjis2euc(str);
+ break;
+#endif
+
+#ifdef SJIS
+ case 2:
+ /* EUC -> SJIS */
+ euc2sjis(str);
+
+ break;
+#endif
+ }
+
+ /* Return kanji code */
+ return code;
+}
+
+/* ʸ»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
+bool iskanji2(cptr s, int x)
+{
+ int i;
+
+ for (i = 0; i < x; i++)
+ {
+ if (iskanji(s[i])) i++;
+ }
+ if ((x == i) && iskanji(s[x])) return TRUE;
+
+ return FALSE;
+}
+
+/*!
+ * @brief ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param str ȽÄꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @return ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ */
+static bool is_ascii_str(cptr str)
+{
+ for (;*str; str++) {
+ if (!(0x00 < *str && *str <= 0x7f))
+ return FALSE;
+ }
+ return TRUE;
}
-/* 2¥Ð¥¤¥Èʸ»ú¤ò¹Íθ¤·¤Ê¤¬¤éºÇÂç n ¥Ð¥¤¥Èʸ»úÎó¤ò¥³¥Ô¡¼¤¹¤ë */
-size_t mb_strlcpy(char *dst, const char *src, size_t size)
+/*!
+ * @brief ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param str ȽÄꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @return ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ */
+static bool is_utf8_str(cptr str)
{
- unsigned char *d = (unsigned char*)dst;
- const unsigned char *s = (unsigned char*)src;
- size_t n = 0;
-
- /* reserve for NUL termination */
- size--;
-
- /* Copy as many bytes as will fit */
- while(n < size) {
- if (iskanji(*d)) {
- if(n + 2 >= size || !*(d+1)) break;
- *d++ = *s++;
- *d++ = *s++;
- n += 2;
- } else {
- *d++ = *s++;
- n++;
+ const unsigned char* p;
+ for (p = (const unsigned char*)str; *p; p++) {
+ int subseq_num = 0;
+ if (0x00 < *p && *p <= 0x7f) continue;
+
+ if ((*p & 0xe0) == 0xc0) subseq_num = 1;
+ if ((*p & 0xf0) == 0xe0) subseq_num = 2;
+ if ((*p & 0xf8) == 0xf0) subseq_num = 3;
+
+ if (subseq_num == 0) return FALSE;
+ while (subseq_num--) {
+ p++;
+ if (!*p || (*p & 0xc0) != 0x80) return FALSE;
}
}
- *d = '\0';
- while(*s++) n++;
- return n;
+ return TRUE;
}
-#endif /* JP */
+/*!
+ * @brief ʸ»ú¥³¡¼¥É¤¬UTF-8¤Îʸ»úÎó¤ò¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë
+ * @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
+ * @return ¤Ê¤·
+ */
+#ifdef SJIS
+#ifdef WINDOWS
+#include <Windows.h>
+static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
+{
+ LPWSTR utf16buf;
+ int input_str_len = strlen(utf8_str);
+ int len;
+
+ C_MAKE(utf16buf, input_str_len, WCHAR);
+
+ MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8_str, input_str_len, (LPWSTR)utf16buf, input_str_len);
+
+ len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)utf16buf, -1, (LPSTR)sys_str_buffer, sys_str_buflen, NULL, NULL );
+ sys_str_buffer[len] = '\0';
+
+ C_KILL(utf16buf, input_str_len, WCHAR);
+}
+#endif
+#endif
+
+/*!
+ * @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
+ * @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
+ * ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
+ * @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
+ * @return ¤Ê¤·
+ */
+void guess_convert_to_system_encoding(char* strbuf, int buflen)
+{
+ if (is_ascii_str(strbuf)) return;
+
+ if (is_utf8_str(strbuf)) {
+ char* work;
+ C_MAKE(work, buflen, char);
+ strncpy(work, strbuf, buflen);
+ utf8_to_sys(work, strbuf, buflen);
+ C_KILL(work, buflen, char);
+ }
+}
+
+#endif /* JP */