OSDN Git Service

中立でないモンスターに乗馬して, 乗馬に向かない武器を装備していると,
[hengband/hengband.git] / src / japanese.c
index 7e923e2..e864d84 100644 (file)
@@ -124,142 +124,183 @@ void jverb( const char *in , char *out , int flag){
   }
 }
 
-char* strstr_j(const char* s, const char* t)
+
+/*
+ * Convert SJIS string to EUC string
+ */
+void sjis2euc(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 (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;
        }
-       return NULL;
-}
+       tmp[len] = 0;
+       strcpy(str, (char *)tmp);
 
-/* 2¥Ð¥¤¥Èʸ»ú¤ò¹Íθ¤·¤Ê¤¬¤éºÇÂç n ¥Ð¥¤¥Èʸ»úÎó¤ò¥³¥Ô¡¼¤¹¤ë */
-size_t mb_strlcpy(char *dst, const char *src, size_t size)
+       C_KILL(tmp, len+1, byte);
+}  
+
+
+/*
+ * Convert EUC string to SJIS string
+ */
+void euc2sjis(char *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(*s)) {
-                       if(n + 2 >= size || !*(s+1)) break;
-                       *d++ = *s++;
-                       *d++ = *s++;
-                       n += 2;
-               } else {
-                       *d++ = *s++;
-                       n++;
+       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;
        }
-       *d = '\0';
-       while(*s++) n++;
-       return n;
-}
+       tmp[len] = 0;
+       strcpy(str, (char *)tmp);
+
+       C_KILL(tmp, len+1, byte);
+}  
+
 
 /*
- * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë¡£
+ * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
  * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
+ *
+ * 0: Unknown
+ * 1: ASCII (Never known to be ASCII in this function.)
+ * 2: EUC
+ * 3: SJIS
  */
-void codeconv(char *str)
+byte codeconv(char *str)
 {
+       byte code = 0;
        int i;
-       int kanji = 0, iseuc = 1;
-       int len;
-       unsigned char c1, c2;
-       unsigned char *tmp;
 
-       /* ´Á»ú¤¬Â¸ºß¤·¡¢¤½¤Î´Á»ú¥³¡¼¥É¤¬EUC¤«¤É¤¦¤«Ä´¤Ù¤ë¡£*/
        for (i = 0; str[i]; i++)
        {
+               unsigned char c1;
+               unsigned char c2;
+
+               /* First byte */
                c1 = str[i];
-               if (c1 & 0x80)  kanji = 1;
-               if ( c1>=0x80 && (c1 < 0xa1 || c1 > 0xfe)) iseuc = 0;
-       }
 
-       /* str¤ÎŤµ+1(tmp³ÎÊÝÍÑ) */
-       len = i + 1;
+               /* ASCII? */
+               if (!(c1 & 0x80)) continue;
 
-#ifdef EUC
-       if (kanji && !iseuc)     /* SJIS -> EUC */
-       {
-               C_MAKE(tmp, len, byte);
+               /* Second byte */
+               i++;
+               c2 = str[i];
 
-               for (i = 0; str[i]; i++)
+               if (((0xa1 <= c1 && c1 <= 0xdf) || (0xfd <= c1 && c1 <= 0xfe)) &&
+                   (0xa1 <= c2 && c2 <= 0xfe))
                {
-                       c1 = str[i];
-                       if (c1 & 0x80)
+                       /* Only EUC is allowed */
+                       if (!code)
                        {
-                               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;
+                               /* EUC */
+                               code = 2;
                        }
-                       else
-                               tmp[i] = c1;
-               }
-               tmp[i] = '\0';
-               strcpy(str, (char *)tmp);
 
-               C_KILL(tmp, len, byte);
-       }
-#endif
-
-#ifdef SJIS
-       if (kanji && iseuc)     /* EUC -> SJIS */
-       {
-               C_MAKE(tmp, len, byte);
+                       /* Broken string? */
+                       else if (code != 2)
+                       {
+                               /* No conversion */
+                               return 0;
+                       }
+               }
 
-               for (i = 0; str[i]; i++)
+               else if (((0x81 <= c1 && c1 <= 0x9f) &&
+                         ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) ||
+                        ((0xe0 <= c1 && c1 <= 0xfc) &&
+                         (0x40 <= c2 && c2 <= 0x7e)))
                {
-                       c1 = str[i];
-                       if (c1 & 0x80)
+                       /* Only SJIS is allowed */
+                       if (!code)
                        {
-                               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;
+                               /* SJIS */
+                               code = 3;
                        }
-                       else
-                               tmp[i] = c1;
-               }
-               tmp[i] = '\0';
-               strcpy(str, tmp);
 
-               C_KILL(tmp, len, byte);
+                       /* Broken string? */
+                       else if (code != 3)
+                       {
+                               /* No conversion */
+                               return 0;
+                       }
+               }
        }
+
+
+       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¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */