--- np2/common/Attic/codecnv.c 2003/10/16 17:57:16 1.1.1.1 +++ np2/common/Attic/codecnv.c 2004/01/15 06:20:42 1.4 @@ -2,20 +2,6 @@ #include "codecnv.h" -static const BYTE euctbl[0x80] = { - 0xa1, 0xa1, 0xa1, 0xa3, 0xa1, 0xd6, 0xa1, 0xd7, 0xa1, 0xa2, 0xa1, 0xa6, - 0xa5, 0xf2, 0xa5, 0xa1, 0xa5, 0xa3, 0xa5, 0xa5, 0xa5, 0xa7, 0xa5, 0xa9, - 0xa5, 0xe3, 0xa5, 0xe5, 0xa5, 0xe7, 0xa5, 0xc3, 0xa1, 0xbc, 0xa5, 0xa2, - 0xa5, 0xa4, 0xa5, 0xa6, 0xa5, 0xa8, 0xa5, 0xaa, 0xa5, 0xab, 0xa5, 0xad, - 0xa5, 0xaf, 0xa5, 0xb1, 0xa5, 0xb3, 0xa5, 0xb5, 0xa5, 0xb7, 0xa5, 0xb9, - 0xa5, 0xbb, 0xa5, 0xbd, 0xa5, 0xbf, 0xa5, 0xc1, 0xa5, 0xc4, 0xa5, 0xc6, - 0xa5, 0xc8, 0xa5, 0xca, 0xa5, 0xcb, 0xa5, 0xcc, 0xa5, 0xcd, 0xa5, 0xce, - 0xa5, 0xcf, 0xa5, 0xd2, 0xa5, 0xd5, 0xa5, 0xd8, 0xa5, 0xdb, 0xa5, 0xde, - 0xa5, 0xdf, 0xa5, 0xe0, 0xa5, 0xe1, 0xa5, 0xe2, 0xa5, 0xe4, 0xa5, 0xe6, - 0xa5, 0xe8, 0xa5, 0xe9, 0xa5, 0xea, 0xa5, 0xeb, 0xa5, 0xec, 0xa5, 0xed, - 0xa5, 0xef, 0xa5, 0xf3, 0xa1, 0xab, 0xa1, 0xac}; - - void codecnv_sjis2euc(char *euc, UINT ecnt, const char *sjis, UINT scnt) { int s; @@ -28,7 +14,7 @@ void codecnv_sjis2euc(char *euc, UINT ec } ecnt--; while(1) { - s = *sjis++; + s = (BYTE)*sjis++; if (s < 0x80) { // ascii if (!s) { break; @@ -40,7 +26,7 @@ void codecnv_sjis2euc(char *euc, UINT ec *euc++ = (char)s; } else if ((((s ^ 0x20) - 0xa1) & 0xff) < 0x2f) { - c = *sjis++; + c = (BYTE)*sjis++; if (!c) { break; } @@ -56,22 +42,69 @@ void codecnv_sjis2euc(char *euc, UINT ec *euc++ = (char)(((s & 0x3f) << 1) + (c >> 8)); *euc++ = (char)c; } - else { - s = (s - 0xa0) & 0xff; - if (s < 0x40) { - if (ecnt < 2) { - break; - } - ecnt -= 2; - s <<= 1; - *euc++ = (char)euctbl[s+0]; - *euc++ = (char)euctbl[s+1]; + else if (((s - 0xa0) & 0xff) < 0x40) { + if (ecnt < 2) { + break; } + ecnt -= 2; + *euc++ = (char)0x8e; + *euc++ = (char)s; } } *euc = '\0'; } +void codecnv_euc2sjis(char *sjis, UINT scnt, const char *euc, UINT ecnt) { + + UINT h; + UINT l; + + (void)ecnt; // 判定してないのかよ + + if ((sjis == NULL) || (scnt == 0) || (euc == NULL)) { + return; + } + scnt--; + while(scnt) { + h = (BYTE)*euc++; + if (h < 0x80) { // ascii + if (!h) { + break; + } + scnt--; + *sjis++ = (char)h; + } + else if (h == 0x8e) { + l = (BYTE)*euc++; + if (!l) { + break; + } + scnt--; + *sjis++ = (char)h; + } + else { + l = (BYTE)*euc++; + if ((!l) || (scnt < 2)) { + break; + } + h &= 0x7f; + l &= 0x7f; + l += ((h & 1) - 1) & 0x5e; + if (l >= 0x60) { + l++; + } + h += 0x121; + l += 0x1f; + h >>= 1; + h ^= 0x20; + *sjis++ = (char)h; + *sjis++ = (char)l; + scnt -= 2; + } + } + *sjis = '\0'; +} + // ----