return FALSE;
}
-#endif /* JP */
+/*!
+ * @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;
+}
+
+/*!
+ * @brief ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param str ȽÄꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @return ʸ»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ */
+static bool is_utf8_str(cptr str)
+{
+ 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;
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ * @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 */