////////////////////////////////////////////////// // // Copyright (C) 1997 - 1998, Microsoft Corporation. All Rights Reserved. // // File : CONVERT.CPP // Project : Project SIK // ////////////////////////////////////////////////// #define _UNICODE #include #include #ifdef WIN32 #include #endif #include #include #include #include "convert.hpp" #include "cho2in.hpp" #include "basedef.hpp" #include "stemkor.h" #include "unitoint.h" void CODECONVERT::AppendIN(char *s, char *d, int &wordptr) { for (int j = 0; s[j] != 0; j++) d[wordptr++] = s[j]; d[wordptr] = NULLCHAR; } void CODECONVERT::ReverseIN(char *w, char *rw) { int i = lstrlen(w) - 1; for (int j = 0; j <= i; j++) rw[j] = w[i-j]; rw[j] = NULLCHAR; } void CODECONVERT::AppendHAN(WCHAR s, WCHAR *d, int &wordptr) { d[wordptr++] = s; d[wordptr] = NULLCHAR; } void CODECONVERT::ReverseHAN(WCHAR *w, WCHAR *rw) { int i = wcslen(w) - 1; for (int j = 0; j <= i; j++) { rw[j] = w[i-j]; } rw[j] = NULLCHAR; } int CODECONVERT::HAN2INS(char *wansung, char *internal, int code) { if(code == codeWanSeong) { LPWSTR unicode; int len; len = MultiByteToWideChar(UWANSUNG_CODE_PAGE, 0, wansung, -1, NULL, 0); unicode = (LPWSTR)LocalAlloc(LPTR, sizeof(WCHAR) * len); // add a check for this point if (unicode == NULL ) { return FALSE; } len = MultiByteToWideChar (UWANSUNG_CODE_PAGE, 0, wansung, -1, unicode, len); UniToInternal(unicode, internal, len-1); // we must free the memory. LocalFree(unicode); } else return FALSE; return SUCCESS; } int CODECONVERT::HAN2INR(char *h, char *rc, int code) { char c[80]; _fmemset(c, NULL, 80); if (HAN2INS(h, c, code) == SUCCESS) { ReverseIN(c, rc); return SUCCESS; } else { return FAIL; } } // Commented by hjw int CODECONVERT::INR2HAN(char *c, char *h, int code) { char flag=NULLCHAR; char incode[5], rcode[5]; WCHAR rh[80], hcode, unicode [80]; _fmemset(incode, NULL, 5); _fmemset(rcode, NULL, 5); rh [0] = 0; int WP = 0, i = 0; int wordptr = 0; while (c[WP] != NULLCHAR) { incode[i] = c[WP++]; if (incode[i] < __V_k) { if ((flag == 1) || (c[WP] == 0)) { incode[i+1] = NULLCHAR; i = 0; flag = 0; } else { i++; } } else { if ((c[WP] == 0) || (c[WP] >= __V_k)) { incode[i+1] = NULLCHAR; i = 0; flag = 0; } else { flag = 1; i++; } } if (i == 0) { ReverseIN(incode, rcode); IN2UNI(rcode, &hcode); AppendHAN(hcode, rh, wordptr); } } ReverseHAN(rh, unicode); if (code == codeWanSeong) { WideCharToMultiByte (UWANSUNG_CODE_PAGE, 0, unicode, -1, h, wcslen (unicode)*2+1, NULL, NULL); } return SUCCESS; } int CODECONVERT::INS2HAN(char *c, char *h, int code) { char rc[80]; _fmemset(rc, NULL, 80); ReverseIN(c, rc); if(INR2HAN(rc, h, code) == FAIL) { return FAIL; } return SUCCESS; } // Cho sung mapping table static WORD ChoSungUniTable[] = { 0x0000, // Fill code 0xAC00, // KIYEOK 1 0xAE4C, // SSANGKIYEOK 2 0xB098, // NIEUN 3 0x0000, // SSANGNIEUN 4 // not used 0xB2E4, // TIKEUT 5 0xB530, // SSANGTIKEUT 6 0xB77C, // RIEUL 7 0x0000, // SSANGRIEUL 8 // not used 0x0000, // not defined 9 0xB9C8, // MIEUM 10 0xBC14, // PIEUP 11 0xBE60, // SSANGPIEUP 12 0xC0AC, // SIOS 13 0xC2F8, // SSANGSIOS 14 0xC544, // IEUNG 15 0xC790, // CIEUC 16 0xC9DC, // SSANGCIEUC 17 0xCC28, // CHIEUCH 18 0xCE74, // KHIEUKH 19 0xD0C0, // THIEUTH 20 0xD30C, // PHIEUPH 21 0xD558, // HIEUH 22 }; // Cho sung mapping table static WORD JamoUniTable[] = { 0x0000, // Fill code 0x3131, // KIYEOK 1 0x3132, // SSANGKIYEOK 2 0x3134, // NIEUN 3 0x0000, // SSANGNIEUN 4 // not used 0x3137, // TIKEUT 5 0x3138, // SSANGTIKEUT 6 0x3139, // RIEUL 7 0x0000, // SSANGRIEUL 8 // not used 0x0000, // not defined 9 0x3141, // MIEUM 10 0x3142, // PIEUP 11 0x3143, // SSANGPIEUP 12 0x3145, // SIOS 13 0x3146, // SSANGSIOS 14 0x3147, // IEUNG 15 0x3148, // CIEUC 16 0x3149, // SSANGCIEUC 17 0x314A, // CHIEUCH 18 0x314B, // KHIEUKH 19 0x314C, // THIEUTH 20 0x314D, // PHIEUPH 21 0x314E, // HIEUH 22 0x314F, // A 23 0x3150, // AE 24 0x3151, // YA 25 0x3152, // YAE 26 0x3153, // EO 27 0x3154, // E 28 0x3155, // YEO 29 0x3156, // YE 30 0x3157, // O 31 0x3158, // WA 33 0x3159, // WAE 34 0x315A, // OE 35 0x315B, // YO 36 0x315C, // U 37 0x315D, // WEO 38 0x315E, // WE 39 0x315F, // WI 40 0x3160, // YU 41 0x3161, // EU 42 0x3162, // YI 43 0x3163 // I 44 }; int CODECONVERT::IN2UNI(char *c, WORD *wch) { if (lstrlen(c) > 1 && c [0] < __V_k && c [1] >= __V_k) { *wch = ChoSungUniTable [(int) c [0]]; char stTmp [3]; for (int i2 = 0; i2 < CHUNG; i2++) if (MapI2 [i2] == c [1]) break; *wch += (i2 - 1) * CHONG; if (lstrlen(c) > 2) { stTmp[0]=c[2]; stTmp[1]=c[3]; stTmp[2]='\0'; for(int i3 = 0;i3 < CHONG;i3 ++) if (! (strcmp(MapI3[i3], stTmp))) { *wch += (WORD)i3; break; } } } else if (lstrlen (c) == 1) *wch = JamoUniTable [(int) c [0]]; // BUG : SSANGJAMO return SUCCESS; }