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
/*
- * 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¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
#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;
#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);
}
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)
{
h_ver_extra = old_h_ver_extra;
}
+ /* Restore old knowledge */
+ kanji_code = old_kanji_code;
+
/* Result */
return ok;
}