}
}
-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¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */