--- np2/win9x/oemtext.cpp 2005/03/19 20:46:07 1.3 +++ np2/win9x/oemtext.cpp 2005/05/15 18:26:47 1.7 @@ -1,7 +1,92 @@ #include "compiler.h" +#include "oemtext.h" +#include "textcnv.h" -#if defined(OSLANG_UTF8) -UINT oemtext_sjistooem(char *dst, UINT dcnt, const char *src, UINT scnt) { + +// Use WinAPI version + + +UINT oemtext_sjistoucs2(UINT16 *dst, UINT dcnt, const char *src, UINT scnt) { + + int srccnt; + int dstcnt; + int r; + + if (((SINT)scnt) > 0) { + srccnt = scnt; + } + else { + srccnt = -1; + } + if (((SINT)dcnt) > 0) { + dstcnt = dcnt; + if (srccnt < 0) { + dstcnt = dstcnt - 1; + if (dstcnt == 0) { + if (dst) { + dst[0] = '\0'; + } + return(1); + } + } + } + else { + dstcnt = 0; + } + r = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, srccnt, (WCHAR *)dst, dstcnt); + if ((r == 0) && (dstcnt != 0)) { + r = dstcnt; + if (srccnt < 0) { + if (dst) { + dst[r] = '\0'; + } + r++; + } + } + return(r); +} + +UINT oemtext_ucs2tosjis(char *dst, UINT dcnt, const UINT16 *src, UINT scnt) { + + int srccnt; + int dstcnt; + int r; + + if (((SINT)scnt) > 0) { + srccnt = scnt; + } + else { + srccnt = -1; + } + if (((SINT)dcnt) > 0) { + dstcnt = dcnt; + if (srccnt < 0) { + dstcnt = dstcnt - 1; + if (dstcnt == 0) { + if (dst) { + dst[0] = '\0'; + } + return(1); + } + } + } + else { + dstcnt = 0; + } + r = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)src, srccnt, dst, dstcnt, NULL, NULL); + if ((r == 0) && (dstcnt != 0)) { + r = dstcnt; + if (srccnt < 0) { + if (dst) { + dst[r] = '\0'; + } + r++; + } + } + return(r); +} + +UINT oemtext_sjistoutf8(char *dst, UINT dcnt, const char *src, UINT scnt) { UINT leng; UINT16 *ucs2; @@ -9,7 +94,7 @@ UINT oemtext_sjistooem(char *dst, UINT d (void)scnt; - leng = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, -1, NULL, 0); + leng = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, scnt, NULL, 0); if (leng == 0) { return(0); } @@ -17,13 +102,16 @@ UINT oemtext_sjistooem(char *dst, UINT d if (ucs2 == NULL) { return(0); } - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, -1, ucs2, leng); - ret = ucscnv_ucs2toutf8(dst, dcnt, ucs2, leng); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, scnt, (WCHAR *)ucs2, leng); + if (((SINT)scnt) < 0) { + leng = (UINT)-1; + } + ret = codecnv_ucs2toutf8(dst, dcnt, ucs2, leng); _MFREE(ucs2); return(ret); } -UINT oemtext_oemtosjis(char *dst, UINT dcnt, const char *src, UINT scnt) { +UINT oemtext_utf8tosjis(char *dst, UINT dcnt, const char *src, UINT scnt) { UINT leng; UINT16 *ucs2; @@ -31,7 +119,7 @@ UINT oemtext_oemtosjis(char *dst, UINT d (void)scnt; - leng = ucscnv_utf8toucs2(NULL, 0, src, (UINT)-1); + leng = codecnv_utf8toucs2(NULL, 0, src, scnt); if (leng == 0) { return(0); } @@ -39,10 +127,129 @@ UINT oemtext_oemtosjis(char *dst, UINT d if (ucs2 == NULL) { return(0); } - ucscnv_utf8toucs2(ucs2, leng, src, (UINT)-1); - ret = WideCharToMultiByte(CP_ACP, 0, ucs2, leng, dst, dcnt, NULL, NULL); + codecnv_utf8toucs2(ucs2, leng, src, scnt); + if (((SINT)scnt) < 0) { + leng = (UINT)-1; + } + ret = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)ucs2, leng, dst, dcnt, NULL, NULL); _MFREE(ucs2); return(ret); } + + +// ---- textcnv + +UINT textcnv_getinfo(TCINF *inf, const UINT8 *hdr, UINT hdrsize) { + + UINT textcode; + TCINF info; + + textcode = TEXTCNV_DEFAULT; + ZeroMemory(&info, sizeof(info)); + if ((hdrsize >= 3) && + (hdr[0] == 0xef) && (hdr[1] == 0xbb) && (hdr[2] == 0xbf)) { + // UTF-8 + textcode = TEXTCNV_UTF8; + info.width = 1; + info.hdrsize = 3; + } + else if ((hdrsize >= 2) && (hdr[0] == 0xff) && (hdr[1] == 0xfe)) { + // UCSLE + textcode = TEXTCNV_UCS2; +#if defined(BYTESEX_BIG) + info.xendian = 1; +#endif + info.width = 2; + info.hdrsize = 2; + } + else if ((hdrsize >= 2) && (hdr[0] == 0xfe) && (hdr[1] == 0xff)) { + // UCS2BE + // UCSLE + textcode = TEXTCNV_UCS2; +#if defined(BYTESEX_LITTLE) + info.xendian = 1; #endif + info.width = 2; + info.hdrsize = 2; + } + else { + info.width = 1; + } + +#if defined(OSLANG_SJIS) + switch(textcode) { + case TEXTCNV_DEFAULT: + case TEXTCNV_SJIS: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + break; + + case TEXTCNV_UTF8: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)oemtext_utf8tosjis; + info.fromoem = (TCFROMOEM)oemtext_sjistoutf8; + break; + + case TEXTCNV_UCS2: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)oemtext_ucs2tosjis; + info.fromoem = (TCFROMOEM)oemtext_sjistoucs2; + break; + } +#elif defined(OSLANG_EUC) + switch(textcode) { + case TEXTCNV_DEFAULT: + case TEXTCNV_EUC: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + break; + } +#elif defined(OSLANG_UTF8) + switch(textcode) { + case TEXTCNV_DEFAULT: + case TEXTCNV_SJIS: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)oemtext_sjistoutf8; + info.fromoem = (TCFROMOEM)oemtext_utf8tosjis; + break; + + case TEXTCNV_UTF8: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + break; + + case TEXTCNV_UCS2: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)codecnv_ucs2toutf8; + info.fromoem = (TCFROMOEM)codecnv_utf8toucs2; + break; + } +#elif defined(OSLANG_UCS2) + switch(textcode) { + case TEXTCNV_DEFAULT: + case TEXTCNV_SJIS: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)oemtext_sjistoucs2; + info.fromoem = (TCFROMOEM)oemtext_ucs2tosjis; + break; + + case TEXTCNV_UTF8: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + info.tooem = (TCTOOEM)codecnv_utf8toucs2; + info.fromoem = (TCFROMOEM)codecnv_ucs2toutf8; + break; + + case TEXTCNV_UCS2: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + break; + } +#else // defined(OSLANG_*) + switch(textcode) { + case TEXTCNV_DEFAULT: + info.caps = TEXTCNV_READ | TEXTCNV_WRITE; + break; + } +#endif // defined(OSLANG_*) + if (inf) { + *inf = info; + } + return(info.caps); +}