|
|
| version 1.3, 2005/03/19 20:46:07 | version 1.6, 2005/04/01 15:35:49 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #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, 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, 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; | UINT leng; |
| UINT16 *ucs2; | UINT16 *ucs2; |
| Line 9 UINT oemtext_sjistooem(char *dst, UINT d | Line 94 UINT oemtext_sjistooem(char *dst, UINT d |
| (void)scnt; | (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) { | if (leng == 0) { |
| return(0); | return(0); |
| } | } |
| Line 17 UINT oemtext_sjistooem(char *dst, UINT d | Line 102 UINT oemtext_sjistooem(char *dst, UINT d |
| if (ucs2 == NULL) { | if (ucs2 == NULL) { |
| return(0); | return(0); |
| } | } |
| MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, -1, ucs2, leng); | MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, scnt, ucs2, leng); |
| ret = ucscnv_ucs2toutf8(dst, dcnt, ucs2, leng); | if (((SINT)scnt) < 0) { |
| leng = (UINT)-1; | |
| } | |
| ret = codecnv_ucs2toutf8(dst, dcnt, ucs2, leng); | |
| _MFREE(ucs2); | _MFREE(ucs2); |
| return(ret); | 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; | UINT leng; |
| UINT16 *ucs2; | UINT16 *ucs2; |
| Line 31 UINT oemtext_oemtosjis(char *dst, UINT d | Line 119 UINT oemtext_oemtosjis(char *dst, UINT d |
| (void)scnt; | (void)scnt; |
| leng = ucscnv_utf8toucs2(NULL, 0, src, (UINT)-1); | leng = codecnv_utf8toucs2(NULL, 0, src, scnt); |
| if (leng == 0) { | if (leng == 0) { |
| return(0); | return(0); |
| } | } |
| Line 39 UINT oemtext_oemtosjis(char *dst, UINT d | Line 127 UINT oemtext_oemtosjis(char *dst, UINT d |
| if (ucs2 == NULL) { | if (ucs2 == NULL) { |
| return(0); | return(0); |
| } | } |
| ucscnv_utf8toucs2(ucs2, leng, src, (UINT)-1); | codecnv_utf8toucs2(ucs2, leng, src, scnt); |
| if (((SINT)scnt) < 0) { | |
| leng = (UINT)-1; | |
| } | |
| ret = WideCharToMultiByte(CP_ACP, 0, ucs2, leng, dst, dcnt, NULL, NULL); | ret = WideCharToMultiByte(CP_ACP, 0, ucs2, leng, dst, dcnt, NULL, NULL); |
| _MFREE(ucs2); | _MFREE(ucs2); |
| return(ret); | 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 | #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); | |
| } | |