OSDN Git Service

漢字コード判別の使い方を間違っていたので訂正。さらに漢字コード判別処理自体も厳密化した。
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Tue, 9 Sep 2003 16:28:43 +0000 (16:28 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Tue, 9 Sep 2003 16:28:43 +0000 (16:28 +0000)
src/externs.h
src/japanese.c
src/load.c

index bcea9bd..fbedd5b 100644 (file)
@@ -1543,7 +1543,7 @@ extern void jverb( const char *in , char *out , int flag);
 extern char* strstr_j(cptr str1, cptr str2);
 extern void sjis2euc(char *str);
 extern void euc2sjis(char *str);
-extern bool codeconv(char *str);
+extern byte codeconv(char *str);
 extern bool iskanji2(cptr s, int x);
 #endif
 
index 76b003f..cfdb037 100644 (file)
@@ -230,42 +230,94 @@ void euc2sjis(char *str)
 
 
 /*
- * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë¡£
+ * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
  * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
+ *
+ * 0: Unknown
+ * 1: ASCII (Never known to be ASCII in this function.)
+ * 2: EUC
+ * 3: SJIS
  */
-bool codeconv(char *str)
+byte codeconv(char *str)
 {
+       byte code = 0;
        int i;
-       int kanji = 0, iseuc = 1;
 
-       /* ´Á»ú¤¬Â¸ºß¤·¡¢¤½¤Î´Á»ú¥³¡¼¥É¤¬EUC¤«¤É¤¦¤«Ä´¤Ù¤ë¡£*/
        for (i = 0; str[i]; i++)
        {
-               unsigned char c1 = str[i];
+               unsigned char c1;
+               unsigned char c2;
 
-               if (c1 & 0x80)  kanji = 1;
-               if ( c1>=0x80 && (c1 < 0xa1 || c1 > 0xfe)) iseuc = 0;
+               /* 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;
+                       }
+               }
        }
 
-#ifdef EUC
-       if (kanji && !iseuc)     /* SJIS -> EUC */
+
+       switch (code)
        {
+#ifdef EUC
+       case 3:
+               /* SJIS -> EUC */
                sjis2euc(str);
-
-               return TRUE;
-       }
+               break;
 #endif
 
 #ifdef SJIS
-       if (kanji && iseuc)     /* EUC -> SJIS */
-       {
+       case 2:
+               /* EUC -> SJIS */
                euc2sjis(str);
 
-               return TRUE;
-       }
+               break;
 #endif
+       }
 
-       return FALSE;
+       /* Return kanji code */
+       return code;
 }
 
 /* Ê¸»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
index 2f2d287..61431e2 100644 (file)
@@ -248,20 +248,15 @@ static void rd_string(char *str, int max)
 #endif
 
        case 0:
-               /* Unknown kanji code */
-               if (codeconv(str))
-               {
-#ifdef EUC
-                       /* This save file is written in SJIS */
-                       kanji_code = 3;
-#endif
-#ifdef SJIS
-                       /* This save file is written in EUC */
-                       kanji_code = 2;
-#endif
-               }
-               break;
+       {
+               /* ÉÔÌÀ¤Î´Á»ú¥³¡¼¥É¤«¤é¥·¥¹¥Æ¥à¤Î´Á»ú¥³¡¼¥É¤ËÊÑ´¹ */
+               byte code = codeconv(str);
+
+               /* ´Á»ú¥³¡¼¥É¤¬È½ÌÀ¤·¤¿¤é¡¢¤½¤ì¤òµ­Ï¿ */
+               if (code) kanji_code = code;
 
+               break;
+       }
        default:
                /* No conversion needed */
                break;
@@ -3695,23 +3690,6 @@ note("
 
 #endif
 
-       /*
-        * Use system depended kanji code for saved floors
-        */
-#ifdef JP
-# ifdef EUC
-       /* EUC kanji code */
-       kanji_code = 2;
-# endif
-# ifdef SJIS
-       /* SJIS kanji code */
-       kanji_code = 3;
-# endif
-#else
-       /* ASCII */
-       kanji_code = 1;
-#endif
-
        /* Success */
        return (0);
 }
@@ -3824,10 +3802,31 @@ bool load_floor(saved_floor_type *sf_ptr, u32b mode)
        byte old_h_ver_minor = 0;
        byte old_h_ver_patch = 0;
        byte old_h_ver_extra = 0;
-
        bool ok = TRUE;
        char floor_savefile[1024];
 
+       byte old_kanji_code = kanji_code;
+
+       /*
+        * Temporal files are always written in system depended kanji
+        * code.
+        */
+#ifdef JP
+# ifdef EUC
+       /* EUC kanji code */
+       kanji_code = 2;
+# endif
+# ifdef SJIS
+       /* SJIS kanji code */
+       kanji_code = 3;
+# endif
+#else
+       /* ASCII */
+       kanji_code = 1;
+#endif
+
+
        /* We have one file already opened */
        if (mode & SLF_SECOND)
        {
@@ -3893,6 +3892,9 @@ bool load_floor(saved_floor_type *sf_ptr, u32b mode)
                h_ver_extra = old_h_ver_extra;
        }
 
+       /* Restore old knowledge */
+       kanji_code = old_kanji_code;
+
        /* Result */
        return ok;
 }