8 typedef struct convert_key convert_key;
16 static const convert_key s2j_table[] = {
17 {"mb","nb"}, {"mp","np"}, {"mv","nv"}, {"mm","nm"},
19 /* sindar:¥·¥ó¥À¡¼¥ë parantir:¥Ñ¥é¥ó¥Æ¥£¥¢ feanor:¥Õ¥§¥¢¥Î¡¼¥ë */
20 {"ar$","a-ru$"}, {"ir$","ia$"}, {"or$","o-ru$"},
21 {"ra","¥é"}, {"ri","¥ê"}, {"ru","¥ë"}, {"re","¥ì"}, {"ro","¥í"},
22 {"ir","ia"}, {"ur","ua"}, {"er","ea"}, {"ar","a¥ë"},
23 {"sha","¥·¥ã"}, {"shi","¥·"}, {"shu","¥·¥å"}, {"she","¥·¥§"}, {"sho","¥·¥ç"},
24 {"tha","¥µ"}, {"thi","¥·"}, {"thu","¥¹"}, {"the","¥»"}, {"tho","¥½"},
25 {"cha","¥Ï"}, {"chi","¥Ò"}, {"chu","¥Õ"}, {"che","¥Ø"}, {"cho","¥Û"},
26 {"dha","¥¶"}, {"dhi","¥¸"}, {"dhu","¥º"}, {"dhe","¥¼"}, {"dho","¥¾"},
27 {"ba","¥Ð"}, {"bi","¥Ó"}, {"bu","¥Ö"}, {"be","¥Ù"}, {"bo","¥Ü"},
28 {"ca","¥«"}, {"ci","¥"}, {"cu","¥¯"}, {"ce","¥±"}, {"co","¥³"},
29 {"da","¥À"}, {"di","¥Ç¥£"}, {"du","¥É¥¥"}, {"de","¥Ç"}, {"do","¥É"},
30 {"fa","¥Õ¥¡"}, {"fi","¥Õ¥£"}, {"fu","¥Õ"}, {"fe","¥Õ¥§"}, {"fo","¥Õ¥©"},
31 {"ga","¥¬"}, {"gi","¥®"}, {"gu","¥°"}, {"ge","¥²"}, {"go","¥´"},
32 {"ha","¥Ï"}, {"hi","¥Ò"}, {"hu","¥Õ"}, {"he","¥Ø"}, {"ho","¥Û"},
33 {"ja","¥¸¥ã"}, {"ji","¥¸"}, {"ju","¥¸¥å"}, {"je","¥¸¥§"}, {"jo","¥¸¥ç"},
34 {"ka","¥«"}, {"ki","¥"}, {"ku","¥¯"}, {"ke","¥±"}, {"ko","¥³"},
35 {"la","¥é"}, {"li","¥ê"}, {"lu","¥ë"}, {"le","¥ì"}, {"lo","¥í"},
36 {"ma","¥Þ"}, {"mi","¥ß"}, {"mu","¥à"}, {"me","¥á"}, {"mo","¥â"},
37 {"na","¥Ê"}, {"ni","¥Ë"}, {"nu","¥Ì"}, {"ne","¥Í"}, {"no","¥Î"},
38 {"pa","¥Ñ"}, {"pi","¥Ô"}, {"pu","¥×"}, {"pe","¥Ú"}, {"po","¥Ý"},
40 {"sa","¥µ"}, {"si","¥·"}, {"su","¥¹"}, {"se","¥»"}, {"so","¥½"},
41 {"ta","¥¿"}, {"ti","¥Æ¥£"}, {"tu","¥È¥¥"}, {"te","¥Æ"}, {"to","¥È"},
42 {"va","¥ô¥¡"}, {"vi","¥ô¥£"}, {"vu","¥ô"}, {"ve","¥ô¥§"}, {"vo","¥ô¥©"},
43 {"wa","¥ï"}, {"wi","¥¦¥£"}, {"wu","¥¦"}, {"we","¥¦¥§"}, {"wo","¥¦¥©"},
44 {"ya","¥ä"}, {"yu","¥æ"}, {"yo","¥è"},
45 {"za","¥¶"}, {"zi","¥¸"}, {"zu","¥º"}, {"ze","¥¼"}, {"zo","¥¾"},
46 {"dh","¥º"}, {"ch","¥Õ"}, {"th","¥¹"},
47 {"b","¥Ö"}, {"c","¥¯"}, {"d","¥É"}, {"f","¥Õ"}, {"g","¥°"},
48 {"h","¥Õ"}, {"j","¥¸¥å"}, {"k","¥¯"}, {"l","¥ë"}, {"m","¥à"},
49 {"n","¥ó"}, {"p","¥×"}, {"q","¥¯"}, {"r","¥ë"}, {"s","¥¹"},
50 {"t","¥È"}, {"v","¥ô"}, {"w","¥¦"}, {"y","¥¤"},
51 {"a","¥¢"}, {"i","¥¤"}, {"u","¥¦"}, {"e","¥¨"}, {"o","¥ª"},
56 /* ¥·¥ó¥À¥ê¥ó¤òÆüËܸì¤ÎÆɤߤËÊÑ´¹¤¹¤ë */
57 void sindarin_to_kana(char *kana, const char *sindarin)
62 sprintf(kana, "%s$", sindarin);
63 for (idx = 0; kana[idx]; idx++)
64 if (isupper(kana[idx])) kana[idx] = tolower(kana[idx]);
66 for (idx = 0; s2j_table[idx].key1 != NULL; idx++)
68 cptr pat1 = s2j_table[idx].key1;
69 cptr pat2 = s2j_table[idx].key2;
70 int len = strlen(pat1);
76 if (strncmp(src, pat1, len) == 0)
102 while (kana[idx] != '$') idx++;
108 /*ÆüËܸìÆ°»ì³èÍÑ (ÂǤġäÂǤäÆ,ÂǤÁ etc) */
109 /* JVERB_AND: ²¥¤ë,½³¤ë > ²¥¤ê,½³¤ë */
110 /* JVERB_TO: ²¥¤ë,½³¤ë > ²¥¤Ã¤Æ½³¤ë */
111 /* JVERB_OR: ²¥¤ë,½³¤ë > ²¥¤Ã¤¿¤ê½³¤Ã¤¿¤ê */
113 static const struct jverb_table_t {
117 { "¤¹¤ë", {"¤·", "¤·¤Æ", "¤·¤¿"}},
118 { "¤¤¤ë", {"¤¤¤Æ", "¤¤¤Æ", "¤¤¤¿"}},
120 { "¤¨¤ë", {"¤¨", "¤¨¤Æ", "¤¨¤¿"}},
121 { "¤±¤ë", {"¤±", "¤±¤Æ", "¤±¤¿"}},
122 { "¤²¤ë", {"¤²", "¤¨¤Æ", "¤²¤¿"}},
123 { "¤»¤ë", {"¤»", "¤»¤Æ", "¤»¤¿"}},
124 { "¤¼¤ë", {"¤¼", "¤¼¤Æ", "¤¼¤¿"}},
125 { "¤Æ¤ë", {"¤Æ", "¤Æ¤Ã¤Æ", "¤Æ¤Ã¤¿"}},
126 { "¤Ç¤ë", {"¤Ç", "¤Ç¤Æ", "¤Ç¤¿"}},
127 { "¤Í¤ë", {"¤Í", "¤Í¤Æ", "¤Í¤¿"}},
128 { "¤Ø¤ë", {"¤Ø", "¤Ø¤Æ", "¤Ø¤¿"}},
129 { "¤Ù¤ë", {"¤Ù", "¤Ù¤Æ", "¤Ù¤¿"}},
130 { "¤á¤ë", {"¤á", "¤á¤Æ", "¤á¤¿"}},
131 { "¤ì¤ë", {"¤ì", "¤ì¤Æ", "¤ì¤¿"}},
133 { "¤¦", {"¤¤", "¤Ã¤Æ", "¤Ã¤¿"}},
134 { "¤¯", {"¤", "¤¤¤Æ", "¤¤¤¿"}},
135 { "¤°", {"¤®", "¤¤¤Ç", "¤¤¤À"}},
136 { "¤¹", {"¤·", "¤·¤Æ", "¤·¤¿"}},
137 { "¤º", {"¤¸", "¤¸¤Æ", "¤¸¤¿"}},
138 { "¤Ä", {"¤Á", "¤Ã¤Æ", "¤Ã¤¿"}},
139 { "¤Å", {"¤Â", "¤Ã¤Æ", "¤Ã¤¿"}},
140 { "¤Ì", {"¤Ë", "¤Í¤Æ", "¤Í¤¿"}},
141 { "¤Õ", {"¤Ò", "¤Ø¤Æ", "¤Ø¤¿"}},
142 { "¤Ö", {"¤Ó", "¤ó¤Ç", "¤ó¤À"}},
143 { "¤à", {"¤ß", "¤ó¤Ç", "¤ó¤À"}},
144 { "¤ë", {"¤ê", "¤Ã¤Æ", "¤Ã¤¿"}},
145 { NULL, {"¤½¤·¤Æ", "¤³¤È¤Ë¤è¤ê", "¤³¤È¤ä"}},
148 void jverb(const char *in , char *out , int flag)
150 const struct jverb_table_t * p;
151 int in_len = strlen(in);
155 for (p = jverb_table; p->from; p++) {
156 int from_len = strlen(p->from);
157 if (strncmp(&in[in_len-from_len], p->from, from_len) == 0) {
158 strcpy(&out[in_len - from_len], p->to[flag - 1]);
164 strcpy(&out[in_len], p->to[flag - 1]);
169 * Convert SJIS string to EUC string
171 void sjis2euc(char *str)
174 unsigned char c1, c2;
177 int len = strlen(str);
179 C_MAKE(tmp, len+1, byte);
181 for (i = 0; i < len; i++)
190 c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe0 : 0x60);
195 c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe1 : 0x61);
196 c2 += 0x60 + (c2 < 0x7f);
205 strcpy(str, (char *)tmp);
207 C_KILL(tmp, len+1, byte);
212 * Convert EUC string to SJIS string
214 void euc2sjis(char *str)
217 unsigned char c1, c2;
220 int len = strlen(str);
222 C_MAKE(tmp, len+1, byte);
224 for (i = 0; i < len; i++)
233 c1 = (c1 >> 1) + (c1 < 0xdf ? 0x31 : 0x71);
234 c2 -= 0x60 + (c2 < 0xe0);
238 c1 = (c1 >> 1) + (c1 < 0xdf ? 0x30 : 0x70);
249 strcpy(str, (char *)tmp);
251 C_KILL(tmp, len+1, byte);
256 * str¤ò´Ä¶¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
257 * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
260 * 1: ASCII (Never known to be ASCII in this function.)
264 byte codeconv(char *str)
269 for (i = 0; str[i]; i++)
278 if (!(c1 & 0x80)) continue;
284 if (((0xa1 <= c1 && c1 <= 0xdf) || (0xfd <= c1 && c1 <= 0xfe)) &&
285 (0xa1 <= c2 && c2 <= 0xfe))
287 /* Only EUC is allowed */
302 else if (((0x81 <= c1 && c1 <= 0x9f) &&
303 ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) ||
304 ((0xe0 <= c1 && c1 <= 0xfc) &&
305 (0x40 <= c2 && c2 <= 0x7e)))
307 /* Only SJIS is allowed */
342 /* Return kanji code */
346 /* ʸ»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
347 bool iskanji2(cptr s, int x)
351 for (i = 0; i < x; i++)
353 if (iskanji(s[i])) i++;
355 if ((x == i) && iskanji(s[x])) return TRUE;
361 * @brief ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤«¤É¤¦¤«¤òȽÄꤹ¤ë
362 * @param str ȽÄꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
363 * @return ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
365 static bool is_ascii_str(cptr str)
368 if (!(0x00 < *str && *str <= 0x7f))
375 * @brief ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤«¤É¤¦¤«¤òȽÄꤹ¤ë
376 * @param str ȽÄꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
377 * @return ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
379 static bool is_utf8_str(cptr str)
381 const unsigned char* p;
382 for (p = (const unsigned char*)str; *p; p++) {
384 if (0x00 < *p && *p <= 0x7f) continue;
386 if ((*p & 0xe0) == 0xc0) subseq_num = 1;
387 if ((*p & 0xf0) == 0xe0) subseq_num = 2;
388 if ((*p & 0xf8) == 0xf0) subseq_num = 3;
390 if (subseq_num == 0) return FALSE;
391 while (subseq_num--) {
393 if (!*p || (*p & 0xc0) != 0x80) return FALSE;
401 #elif defined(SJIS) && defined(WINDOWS)
405 * @brief ʸ»ú¥³¡¼¥É¤¬UTF-8¤Îʸ»úÎó¤ò¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë
406 * @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
407 * @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
408 * @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
409 * @return ÊÑ´¹¤ËÀ®¸ù¤·¤¿¾ì¹çTRUE¡¢¼ºÇÔ¤·¤¿¾ì¹çFALSE¤òÊÖ¤¹
411 static bool utf8_to_sys(char* utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
415 iconv_t cd = iconv_open("EUC-JP", "UTF-8");
416 size_t utf8_len = strlen(utf8_str) + 1; /* include termination character */
417 char *from = utf8_str;
418 int ret = iconv(cd, &from, &utf8_len, &sys_str_buffer, &sys_str_buflen);
422 #elif defined(SJIS) && defined(WINDOWS)
425 int input_len = strlen(utf8_str) + 1; /* include termination character */
427 C_MAKE(utf16buf, input_len, WCHAR);
429 /* UTF-8 -> UTF-16 */
430 if (MultiByteToWideChar( CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
431 C_KILL(utf16buf, input_len, WCHAR);
435 /* UTF-8 -> SJIS(CP932) */
436 if (WideCharToMultiByte( CP_ACP, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, NULL, NULL ) == 0) {
437 C_KILL(utf16buf, input_len, WCHAR);
441 C_KILL(utf16buf, input_len, WCHAR);
448 * @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
449 * @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
450 * ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
451 * UTF-8¤«¤éSJIS¤â¤·¤¯¤ÏEUC¤Ø¤ÎÊÑ´¹¤òÁÛÄꤷ¤Æ¤¤¤ë¤Î¤Ç¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤¬Â¤ê¤Ê¤¯¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¡£
452 * @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
455 void guess_convert_to_system_encoding(char* strbuf, int buflen)
457 if (is_ascii_str(strbuf)) return;
459 if (is_utf8_str(strbuf)) {
461 C_MAKE(work, buflen, char);
462 my_strcpy(work, strbuf, buflen);
463 if (!utf8_to_sys(work, strbuf, buflen)) {
464 msg_print("·Ù¹ð:ʸ»ú¥³¡¼¥É¤ÎÊÑ´¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
467 C_KILL(work, buflen, char);