Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

kcodecnv.c

Go to the documentation of this file.
00001 00002 /**************************************************************************\ 00003 * Module Name: kcodecnv.c 00004 * 00005 * Copyright (c) 1985 - 1999, Microsoft Corporation 00006 * 00007 * This module contains all the code for the Korean code conversion functions. 00008 * 00009 * History: 00010 * 15-Jul-1995 00011 * 22-Feb-1996 bklee 00012 \**************************************************************************/ 00013 #include "precomp.h" 00014 #pragma hdrstop 00015 00016 #define IDD_2BEOL 100 00017 #define IDD_3BEOL1 101 00018 #define IDD_3BEOL2 102 00019 00020 #define lpSource(lpks) (LPSTR)((LPSTR)lpks+lpks->dchSource) 00021 #define lpDest(lpks) (LPSTR)((LPSTR)lpks+lpks->dchDest) 00022 00023 #define JOHAB_CP 1361 00024 #define WANSUNG_CP 949 00025 #define TWO_BYTE 2 00026 #define ONE_WORD 1 00027 00028 typedef struct tagHIGH_LOW // For high byte and low byte 00029 { 00030 BYTE low, high; 00031 } HIGH_LOW; 00032 00033 typedef union tagWANSUNG // For Wansung character code 00034 { 00035 HIGH_LOW e; 00036 WORD w; 00037 } WANSUNG; 00038 00039 /* Hanguel Mnemonic Table for 2 BeolSik and 3 BeolSik */ 00040 CONST WORD HMNTable[3][96] = 00041 { 00042 // For 2 Beolsik. 00043 { 00044 /* 20 SP */ 0xA1A1, 00045 /* 21 ! */ 0xA3A1, 00046 /* 22 " */ 0xA1A8, 00047 /* 23 # */ 0xA3A3, 00048 /* 24 $ */ 0xA3A4, 00049 /* 25 % */ 0xA3A5, 00050 /* 26 & */ 0xA3A6, 00051 /* 27 ` */ 0xA1AE, /* A1AE ? AiA2 */ 00052 /* 28 ( */ 0xA3A8, 00053 /* 29 ) */ 0xA3A9, 00054 /* 2A * */ 0xA3AA, 00055 /* 2B + */ 0xA3AB, 00056 /* 2C ' */ 0xA3A7, 00057 /* 2D - */ 0xA3AD, 00058 /* 2E . */ 0xA3AE, 00059 /* 2F / */ 0xA3AF, 00060 /* 30 0 */ 0xA3B0, 00061 /* 31 1 */ 0xA3B1, 00062 /* 32 2 */ 0xA3B2, 00063 /* 33 3 */ 0xA3B3, 00064 /* 34 4 */ 0xA3B4, 00065 /* 35 5 */ 0xA3B5, 00066 /* 36 6 */ 0xA3B6, 00067 /* 37 7 */ 0xA3B7, 00068 /* 38 8 */ 0xA3B8, 00069 /* 39 9 */ 0xA3B9, 00070 /* 3A : */ 0xA3BA, 00071 /* 3B ; */ 0xA3BB, 00072 /* 3C < */ 0xA3BC, 00073 /* 3D = */ 0xA3BD, 00074 /* 3E > */ 0xA3BE, 00075 /* 3F ? */ 0xA3BF, 00076 /* 40 @ */ 0xA3C0, 00077 /* 41 A */ 0xA4B1, 00078 /* 42 B */ 0xA4D0, 00079 /* 43 C */ 0xA4BA, 00080 /* 44 D */ 0xA4B7, 00081 /* 45 E */ 0xA4A8, 00082 /* 46 F */ 0xA4A9, 00083 /* 47 G */ 0xA4BE, 00084 /* 48 H */ 0xA4C7, 00085 /* 49 I */ 0xA4C1, 00086 /* 4A J */ 0xA4C3, 00087 /* 4B K */ 0xA4BF, 00088 /* 4C L */ 0xA4D3, 00089 /* 4D M */ 0xA4D1, 00090 /* 4E N */ 0xA4CC, 00091 /* 4F O */ 0xA4C2, 00092 /* 50 P */ 0xA4C6, 00093 /* 51 Q */ 0xA4B3, 00094 /* 52 R */ 0xA4A2, 00095 /* 53 S */ 0xA4A4, 00096 /* 54 T */ 0xA4B6, 00097 /* 55 U */ 0xA4C5, 00098 /* 56 V */ 0xA4BD, 00099 /* 57 W */ 0xA4B9, 00100 /* 58 X */ 0xA4BC, 00101 /* 59 Y */ 0xA4CB, 00102 /* 5A Z */ 0xA4BB, 00103 /* 5B [ */ 0xA3DB, 00104 /* 5C \ */ 0xA1AC, 00105 /* 5D ] */ 0xA3DD, 00106 /* 5E ^ */ 0xA3DE, 00107 /* 5F _ */ 0xA3DF, 00108 /* 60 ` */ 0xA1A2, /* A1AE ? AiA2 */ 00109 /* 61 a */ 0xA4B1, 00110 /* 62 b */ 0xA4D0, 00111 /* 63 c */ 0xA4BA, 00112 /* 64 d */ 0xA4B7, 00113 /* 65 e */ 0xA4A7, 00114 /* 66 f */ 0xA4A9, 00115 /* 67 g */ 0xA4BE, 00116 /* 68 h */ 0xA4C7, 00117 /* 69 i */ 0xA4C1, 00118 /* 6A j */ 0xA4C3, 00119 /* 6B k */ 0xA4BF, 00120 /* 6C l */ 0xA4D3, 00121 /* 6D m */ 0xA4D1, 00122 /* 6E n */ 0xA4CC, 00123 /* 6F o */ 0xA4C0, 00124 /* 70 p */ 0xA4C4, 00125 /* 71 q */ 0xA4B2, 00126 /* 72 r */ 0xA4A1, 00127 /* 73 s */ 0xA4A4, 00128 /* 74 t */ 0xA4B5, 00129 /* 75 u */ 0xA4C5, 00130 /* 76 v */ 0xA4BD, 00131 /* 77 w */ 0xA4B8, 00132 /* 78 x */ 0xA4BC, 00133 /* 79 y */ 0xA4CB, 00134 /* 7A z */ 0xA4BB, 00135 /* 7B { */ 0xA3FB, 00136 /* 7C | */ 0xA3FC, 00137 /* 7D } */ 0xA3FD, 00138 /* 7E ~ */ 0xA1AD, 00139 0x0000 00140 }, 00141 // For KT390. 00142 { 00143 /* Hex Code KSC Code */ 00144 /* 20 SP */ 0xA1A1, 00145 /* 21 ! */ 0xA4B8, 00146 /* 22 " */ 0xA1A8, 00147 /* 23 # */ 0xA3A3, 00148 /* 24 $ */ 0xA3A4, 00149 /* 25 % */ 0xA3A5, 00150 /* 26 & */ 0xA3A6, 00151 /* 27 ` */ 0xA1AE, 00152 /* 28 ( */ 0xA3A8, 00153 /* 29 ) */ 0xA3A9, 00154 /* 2A * */ 0xA3AA, 00155 /* 2B + */ 0xA3AB, 00156 /* 2C ' */ 0xA4BC, 00157 /* 2D - */ 0xA3AD, 00158 /* 2E . */ 0xA3AE, 00159 /* 2F / */ 0xA4C7, 00160 /* 30 0 */ 0xA4BB, 00161 /* 31 1 */ 0xA4BE, 00162 /* 32 2 */ 0xA4B6, 00163 /* 33 3 */ 0xA4B2, 00164 /* 34 4 */ 0xA4CB, 00165 /* 35 5 */ 0xA4D0, 00166 /* 36 6 */ 0xA4C1, 00167 /* 37 7 */ 0xA4C6, 00168 /* 38 8 */ 0xA4D2, 00169 /* 39 9 */ 0xA4CC, 00170 /* 3A : */ 0xA3BA, 00171 /* 3B ; */ 0xA4B2, 00172 /* 3C < */ 0xA3B2, 00173 /* 3D = */ 0xA3BD, 00174 /* 3E > */ 0xA3B3, 00175 /* 3F ? */ 0xA3BF, 00176 /* 40 @ */ 0xA3C0, 00177 /* 41 A */ 0xA4A7, 00178 /* 42 B */ 0xA3A1, 00179 /* 43 C */ 0xA4AB, 00180 /* 44 D */ 0xA4AA, 00181 /* 45 E */ 0xA4BB, 00182 /* 46 F */ 0xA4A2, 00183 /* 47 G */ 0xA3AF, 00184 /* 48 H */ 0xA1AF, 00185 /* 49 I */ 0xA3B8, 00186 /* 4A J */ 0xA3B4, 00187 /* 4B K */ 0xA3B5, 00188 /* 4C L */ 0xA3B6, 00189 /* 4D M */ 0xA3B1, 00190 /* 4E N */ 0xA3B0, 00191 /* 4F O */ 0xA3B9, 00192 /* 50 P */ 0xA3BE, 00193 /* 51 Q */ 0xA4BD, 00194 /* 52 R */ 0xA4C2, 00195 /* 53 S */ 0xA4A6, 00196 /* 54 T */ 0xA4C3, 00197 /* 55 U */ 0xA3B7, 00198 /* 56 V */ 0xA4B0, 00199 /* 57 W */ 0xA4BC, 00200 /* 58 X */ 0xA4B4, 00201 /* 59 Y */ 0xA3BC, 00202 /* 5A Z */ 0xA4BA, 00203 /* 5B [ */ 0xA3DB, 00204 /* 5C \ */ 0xA3DC, 00205 /* 5D ] */ 0xA3DD, 00206 /* 5E ^ */ 0xA3DE, 00207 /* 5F _ */ 0xA3DF, 00208 /* 60 ` */ 0xA1AE, 00209 /* 61 a */ 0xA4B7, 00210 /* 62 b */ 0xA4CC, 00211 /* 63 c */ 0xA4C4, 00212 /* 64 d */ 0xA4D3, 00213 /* 65 e */ 0xA4C5, 00214 /* 66 f */ 0xA4BF, 00215 /* 67 g */ 0xA4D1, 00216 /* 68 h */ 0xA4A4, 00217 /* 69 i */ 0xA4B1, 00218 /* 6A j */ 0xA4B7, 00219 /* 6B k */ 0xA4A1, 00220 /* 6C l */ 0xA4B8, 00221 /* 6D m */ 0xA4BE, 00222 /* 6E n */ 0xA4B5, 00223 /* 6F o */ 0xA4BA, 00224 /* 70 p */ 0xA4BD, 00225 /* 71 q */ 0xA4B5, 00226 /* 72 r */ 0xA4C0, 00227 /* 73 s */ 0xA4A4, 00228 /* 74 t */ 0xA4C3, 00229 /* 75 u */ 0xA4A7, 00230 /* 76 v */ 0xA4C7, 00231 /* 77 w */ 0xA4A9, 00232 /* 78 x */ 0xA4A1, 00233 /* 79 y */ 0xA4A9, 00234 /* 7A z */ 0xA4B1, 00235 /* 7B { */ 0xA3FB, 00236 /* 7C | */ 0xA3FC, 00237 /* 7D } */ 0xA3FD, 00238 /* 7E ~ */ 0xA1AD, 00239 0x0000 00240 }, 00241 // For 3 Beolsik Final. 00242 { 00243 /* Hex Code KSC Code */ 00244 /* 20 SP */ 0xA1A1, 00245 /* 21 ! */ 0xA4A2, 00246 /* 22 " */ 0xA3AE, 00247 /* 23 # */ 0xA4B8, 00248 /* 24 $ */ 0xA4AF, 00249 /* 25 % */ 0xA4AE, 00250 /* 26 & */ 0xA1B0, 00251 /* 27 ` */ 0xA3AA, 00252 /* 28 ( */ 0xA1A2, 00253 /* 29 ) */ 0xA1AD, 00254 /* 2A * */ 0xA1B1, 00255 /* 2B + */ 0xA3AB, 00256 /* 2C ' */ 0xA4BC, 00257 /* 2D - */ 0xA3A9, 00258 /* 2E . */ 0xA3AE, 00259 /* 2F / */ 0xA4C7, 00260 /* 30 0 */ 0xA4BB, 00261 /* 31 1 */ 0xA4BE, 00262 /* 32 2 */ 0xA4B6, 00263 /* 33 3 */ 0xA4B2, 00264 /* 34 4 */ 0xA4CB, 00265 /* 35 5 */ 0xA4D0, 00266 /* 36 6 */ 0xA4C1, 00267 /* 37 7 */ 0xA4C6, 00268 /* 38 8 */ 0xA4D2, 00269 /* 39 9 */ 0xA4CC, //0x0000 00270 /* 3A : */ 0xA3B4, 00271 /* 3B ; */ 0xA4B2, 00272 /* 3C < */ 0xA3A7, 00273 /* 3D = */ 0xA1B5, 00274 /* 3E > */ 0xA3AE, 00275 /* 3F ? */ 0xA3A1, 00276 /* 40 @ */ 0xA4AA, 00277 /* 41 A */ 0xA4A7, 00278 /* 42 B */ 0xA3BF, 00279 /* 43 C */ 0xA4BC, 00280 /* 44 D */ 0xA4AC, 00281 /* 45 E */ 0xA4A5, 00282 /* 46 F */ 0xA4AB, 00283 /* 47 G */ 0xA4C2, 00284 /* 48 H */ 0xA3B0, 00285 /* 49 I */ 0xA3B7, 00286 /* 4A J */ 0xA3B1, 00287 /* 4B K */ 0xA3B2, 00288 /* 4C L */ 0xA3B3, 00289 /* 4D M */ 0xA1A8, 00290 /* 4E N */ 0xA3AD, 00291 /* 4F O */ 0xA3B8, 00292 /* 50 P */ 0xA3B9, 00293 /* 51 Q */ 0xA4BD, 00294 /* 52 R */ 0xA4B0, 00295 /* 53 S */ 0xA4A6, 00296 /* 54 T */ 0xA4AD, 00297 /* 55 U */ 0xA3B6, 00298 /* 56 V */ 0xA4A3, 00299 /* 57 W */ 0xA4BC, 00300 /* 58 X */ 0xA4B4, 00301 /* 59 Y */ 0xA3B5, 00302 /* 5A Z */ 0xA4BA, 00303 /* 5B [ */ 0xA3A8, 00304 /* 5C \ */ 0xA3BA, 00305 /* 5D ] */ 0xA1B4, 00306 /* 5E ^ */ 0xA3BD, 00307 /* 5F _ */ 0xA3BB, 00308 /* 60 ` */ 0xA3AA, 00309 /* 61 a */ 0xA4B7, 00310 /* 62 b */ 0xA4CC, 00311 /* 63 c */ 0xA4C4, 00312 /* 64 d */ 0xA4D3, 00313 /* 65 e */ 0xA4C5, 00314 /* 66 f */ 0xA4BF, 00315 /* 67 g */ 0xA4D1, 00316 /* 68 h */ 0xA4A4, 00317 /* 69 i */ 0xA4B1, 00318 /* 6A j */ 0xA4B7, 00319 /* 6B k */ 0xA4A1, 00320 /* 6C l */ 0xA4B8, 00321 /* 6D m */ 0xA4BE, 00322 /* 6E n */ 0xA4B5, 00323 /* 6F o */ 0xA4BA, 00324 /* 70 p */ 0xA4BD, 00325 /* 71 q */ 0xA4B5, 00326 /* 72 r */ 0xA4C0, 00327 /* 73 s */ 0xA4A4, 00328 /* 74 t */ 0xA4C3, 00329 /* 75 u */ 0xA4A7, 00330 /* 76 v */ 0xA4C7, 00331 /* 77 w */ 0xA4A9, 00332 /* 78 x */ 0xA4A1, 00333 /* 79 y */ 0xA4B1, 00334 /* 7A z */ 0xA4B1, 00335 /* 7B { */ 0xA3A5, 00336 /* 7C | */ 0xA3CC, 00337 /* 7D } */ 0xA3AF, 00338 /* 7E ~ */ 0xA1AD, 00339 0x0000 00340 } 00341 }; 00342 00343 CONST WORD wKSCompCode[51] = // from 'GiYuk' to 'Yi'. 00344 { 00345 0x8841,0x8C41,0x8444,0x9041,0x8446,0x8447,0x9441,0x9841,0x9C41,0x844A, 00346 0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,0xA041,0xA441,0xA841,0x8454, 00347 0xAC41,0xB041,0xB441,0xB841,0xBC41,0xC041,0xC441,0xC841,0xCC41,0xD041, 00348 0x8461,0x8481,0x84A1,0x84C1,0x84E1,0x8541,0x8561,0x8581,0x85A1,0x85C1, 00349 0x85E1,0x8641,0x8661,0x8681,0x86A1,0x86C1,0x86E1,0x8741,0x8761,0x8781, 00350 0x87A1 00351 }; 00352 00353 CONST WORD wKSCompCode2[30] = // from 'GiYuk' to 'HiEut'. 00354 { 00355 0x8442,0x8443,0x8444,0x8445,0x8446,0x8447,0x8448,0x9841,0x8449,0x844A, 00356 0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,0x8451,0x8453,0xA841,0x8454, 00357 0x8455,0x8456,0x8457,0x8458,0xBC41,0x8459,0x845A,0x845B,0x845C,0x845D 00358 }; 00359 00360 00361 WORD 00362 JunjaToBanja( 00363 LPSTR lpSrc, 00364 LPSTR lpDest 00365 ) 00366 00367 /*++ 00368 00369 Routine Description: 00370 00371 Arguments: 00372 00373 Return Value: 00374 00375 --*/ 00376 00377 { 00378 WANSUNG wsCode; 00379 WORD wCount = 0; 00380 00381 while (*lpSrc) 00382 { 00383 if ((BYTE)(*lpSrc) < (BYTE)0x80) 00384 { 00385 *lpDest++ = *lpSrc++; 00386 wCount++; 00387 } 00388 else 00389 { 00390 wsCode.e.high = *lpSrc++; 00391 wsCode.e.low = *lpSrc++; 00392 if (wsCode.w == 0xA1A1) 00393 { 00394 *lpDest++ = ' '; 00395 wCount++; 00396 } 00397 else if (wsCode.w >= 0xA3A1 && wsCode.w <= 0xA3FE) 00398 { 00399 *lpDest++ = wsCode.e.low - (BYTE)0x80; 00400 wCount++; 00401 } 00402 else 00403 { 00404 *lpDest++ = wsCode.e.high; 00405 *lpDest++ = wsCode.e.low; 00406 wCount += 2; 00407 } 00408 } 00409 } 00410 *lpDest = '\0'; 00411 return (wCount); 00412 } 00413 00414 WORD 00415 BanjaToJunja( 00416 LPSTR lpSrc, 00417 LPSTR lpDest 00418 ) 00419 00420 /*++ 00421 00422 Routine Description: 00423 00424 Arguments: 00425 00426 Return Value: 00427 00428 --*/ 00429 00430 { 00431 WORD wCount = 0; 00432 00433 while (*lpSrc) 00434 { 00435 if ((BYTE)(*lpSrc) < (BYTE)0x80) 00436 { 00437 if (*lpSrc++ == ' ') 00438 { 00439 *lpDest++ = (BYTE)0xA1; 00440 *lpDest++ = (BYTE)0xA1; 00441 wCount += 2; 00442 } 00443 else 00444 { 00445 *lpDest++ = (BYTE)0xA3; 00446 *lpDest++ = *(lpSrc - 1) + (BYTE)0x80; 00447 wCount += 2; 00448 } 00449 } 00450 else 00451 { 00452 *lpDest++ = *lpSrc++; 00453 *lpDest++ = *lpSrc++; 00454 wCount += 2; 00455 } 00456 } 00457 *lpDest = '\0'; 00458 return (wCount); 00459 } 00460 00461 WORD 00462 JohabToKs( 00463 LPSTR lpSrc, 00464 LPSTR lpDest 00465 ) 00466 00467 /*++ 00468 00469 Routine Description: 00470 00471 Arguments: 00472 00473 Return Value: 00474 00475 --*/ 00476 00477 { 00478 WORD wCount = 0; 00479 #if defined(OLD_CONV) 00480 WANSUNG wsSCode, wsDCode; 00481 int iHead = 0, iTail = 2349, iMid; 00482 BYTE bCount; 00483 #endif 00484 00485 while (*lpSrc) 00486 { 00487 if ((BYTE)(*lpSrc) < (BYTE)0x80) 00488 { 00489 *lpDest++ = *lpSrc++; 00490 wCount++; 00491 } 00492 else 00493 #if defined(OLD_CONV) 00494 { 00495 wsSCode.e.high = *lpSrc++; 00496 wsSCode.e.low = *lpSrc++; 00497 for (bCount = 0; bCount < 51 && wKSCompCode[bCount] != wsSCode.w; bCount++) 00498 ; 00499 wsDCode.w = (bCount == 51)? 0: bCount + 0xA4A1; 00500 if (wsDCode.w) 00501 { 00502 *lpDest++ = wsDCode.e.high; 00503 *lpDest++ = wsDCode.e.low; 00504 wCount += 2; 00505 continue; 00506 } 00507 for (bCount = 0; bCount < 30 && wKSCompCode2[bCount] != wsSCode.w; bCount++) 00508 ; 00509 wsDCode.w = (bCount == 30)? 0: bCount + 0xA4A1; 00510 if (wsDCode.w) 00511 { 00512 *lpDest++ = wsDCode.e.high; 00513 *lpDest++ = wsDCode.e.low; 00514 wCount += 2; 00515 continue; 00516 } 00517 while (iHead <= iTail && !wsDCode.w) 00518 { 00519 iMid = (iHead + iTail) / 2; 00520 if (wKSCharCode[iMid] > wsSCode.w) 00521 iTail = iMid - 1; 00522 else if (wKSCharCode[iMid] < wsSCode.w) 00523 iHead = iMid + 1; 00524 else 00525 wsDCode.w = ((iMid / 94 + 0xB0) << 8) | (iMid % 94 + 0xA1); 00526 } 00527 if (wsDCode.w) 00528 { 00529 *lpDest++ = wsDCode.e.high; 00530 *lpDest++ = wsDCode.e.low; 00531 wCount += 2; 00532 } 00533 else 00534 { 00535 *lpDest++ = wsSCode.e.high; 00536 *lpDest++ = wsSCode.e.low; 00537 wCount += 2; 00538 } 00539 } 00540 #else 00541 { 00542 // for simple implementation, converting one character by character 00543 // we have to change it string to string conversion. 00544 WCHAR wUni; 00545 CHAR chTmp[2]; 00546 00547 chTmp[0] = *lpSrc++; 00548 chTmp[1] = *lpSrc++; 00549 00550 MultiByteToWideChar(JOHAB_CP, MB_PRECOMPOSED, chTmp, TWO_BYTE, &wUni, ONE_WORD); 00551 00552 WideCharToMultiByte(WANSUNG_CP, 0, &wUni, ONE_WORD, chTmp, TWO_BYTE, NULL, NULL); 00553 00554 *lpDest++ = chTmp[0]; 00555 *lpDest++ = chTmp[1]; 00556 00557 wCount += 2; 00558 } 00559 #endif 00560 } 00561 *lpDest = '\0'; 00562 return (wCount); 00563 } 00564 00565 WORD 00566 KsToJohab( 00567 LPSTR lpSrc, 00568 LPSTR lpDest 00569 ) 00570 00571 /*++ 00572 00573 Routine Description: 00574 00575 Arguments: 00576 00577 Return Value: 00578 00579 --*/ 00580 00581 { 00582 #if defined(OLD_CONV) 00583 WANSUNG wsSCode, wsDCode; 00584 WORD wCount = 0, wLoc; 00585 #else 00586 WORD wCount = 0; 00587 #endif 00588 00589 while (*lpSrc) 00590 { 00591 if ((BYTE)(*lpSrc) < (BYTE)0x80) 00592 { 00593 *lpDest++ = *lpSrc++; 00594 wCount++; 00595 } 00596 else 00597 #if defined(OLD_CONV) 00598 { 00599 wsSCode.e.high = *lpSrc++; 00600 wsSCode.e.low = *lpSrc++; 00601 if (wsSCode.w >= (WORD)0xA4A1 && wsSCode.w <= (WORD)0xA4D3) 00602 { 00603 wsDCode.w = wKSCompCode[wsSCode.w - 0xA4A1]; 00604 *lpDest++ = wsDCode.e.high; 00605 *lpDest++ = wsDCode.e.low; 00606 } 00607 else if (wsSCode.w >= (WORD)0xB0A1 && wsSCode.w <= (WORD)0xC8FE 00608 && wsSCode.e.low != (BYTE)0xFF) 00609 { 00610 wLoc = (wsSCode.e.high - 176) * 94; 00611 wLoc += wsSCode.e.low - 161; 00612 wsDCode.w = wKSCharCode[wLoc]; 00613 *lpDest++ = wsDCode.e.high; 00614 *lpDest++ = wsDCode.e.low; 00615 } 00616 else 00617 { 00618 *lpDest++ = wsSCode.e.high; 00619 *lpDest++ = wsSCode.e.low; 00620 } 00621 wCount += 2; 00622 } 00623 #else 00624 { 00625 WCHAR wUni; 00626 CHAR chTmp[2]; 00627 00628 chTmp[0] = *lpSrc++; 00629 chTmp[1] = *lpSrc++; 00630 00631 MultiByteToWideChar(WANSUNG_CP, MB_PRECOMPOSED, chTmp, TWO_BYTE, &wUni, ONE_WORD); 00632 00633 WideCharToMultiByte(JOHAB_CP, 0, &wUni, ONE_WORD, chTmp, TWO_BYTE, NULL, NULL); 00634 00635 *lpDest++ = chTmp[0]; 00636 *lpDest++ = chTmp[1]; 00637 00638 wCount += 2; 00639 } 00640 #endif 00641 } 00642 *lpDest = '\0'; 00643 return (wCount); 00644 } 00645 00646 LRESULT 00647 TransCodeConvert( 00648 HIMC hIMC, 00649 LPIMESTRUCT lpIme 00650 ) 00651 00652 /*++ 00653 00654 Routine Description: 00655 00656 Arguments: 00657 00658 Return Value: 00659 00660 --*/ 00661 00662 { 00663 UNREFERENCED_PARAMETER(hIMC); 00664 00665 switch (lpIme->wParam) 00666 { 00667 case IME_JUNJAtoBANJA: 00668 lpIme->wCount = JunjaToBanja(lpSource(lpIme), lpDest(lpIme)); 00669 break; 00670 00671 case IME_BANJAtoJUNJA: 00672 lpIme->wCount = BanjaToJunja(lpSource(lpIme), lpDest(lpIme)); 00673 break; 00674 00675 case IME_JOHABtoKS: 00676 lpIme->wCount = JohabToKs(lpSource(lpIme), lpDest(lpIme)); 00677 break; 00678 00679 case IME_KStoJOHAB: 00680 lpIme->wCount = KsToJohab(lpSource(lpIme), lpDest(lpIme)); 00681 break; 00682 00683 default: 00684 lpIme->wCount = 0; 00685 } 00686 return (lpIme->wCount); 00687 } 00688 00689 LRESULT TransConvertList( HIMC hImc, LPIMESTRUCT lpIme) 00690 { 00691 LPSTR lpSrc; 00692 LPSTR lpDst; 00693 HGLOBAL hCandList; 00694 LPCANDIDATELIST lpCandList; 00695 LPSTR lpCandStr; 00696 UINT i, uBufLen; 00697 LRESULT lRet = 0; 00698 00699 lpSrc = lpSource(lpIme); 00700 lpDst = lpDest(lpIme); 00701 uBufLen = ImmGetConversionListA(GetKeyboardLayout(0), hImc, (LPCSTR)lpSrc, 00702 NULL, 0, GCL_CONVERSION); 00703 if (uBufLen) 00704 { 00705 hCandList = GlobalAlloc(GHND, uBufLen); 00706 lpCandList = (LPCANDIDATELIST)GlobalLock(hCandList); 00707 lRet = ImmGetConversionListA(GetKeyboardLayout(0), hImc, (LPCSTR)lpSrc, 00708 lpCandList, uBufLen, GCL_CONVERSION); 00709 for (i = 0; i < lpCandList->dwCount; i++) 00710 { 00711 lpCandStr = (LPSTR)lpCandList + lpCandList->dwOffset[i]; 00712 *lpDst++ = *lpCandStr++; 00713 *lpDst++ = *lpCandStr++; 00714 } 00715 *lpDst = '\0'; 00716 lpIme->wCount = (WORD)lpCandList->dwCount * 2; 00717 GlobalUnlock(hCandList); 00718 GlobalFree(hCandList); 00719 } 00720 return (lRet); 00721 } 00722 00723 LRESULT TransGetMNTable( HIMC hImc, LPIMESTRUCT lpIme) 00724 { 00725 LPSTR lpMnemonic; 00726 int iCount, iCIM; 00727 00728 UNREFERENCED_PARAMETER(hImc); 00729 00730 lpMnemonic = (LPSTR)(lpIme->lParam1); 00731 // BUGBUG: Will be changed to use Registry instead of WIN.INI 00732 iCIM = GetProfileInt(L"WANSUNG", L"InputMethod", IDD_2BEOL) - IDD_2BEOL; 00733 for (iCount = 0; iCount < 96; iCount++, lpMnemonic += 2) 00734 { 00735 *lpMnemonic = LOBYTE(HMNTable[iCIM][iCount]); 00736 *(lpMnemonic+1) = HIBYTE(HMNTable[iCIM][iCount]); 00737 } 00738 return TRUE; 00739 }

Generated on Sat May 15 19:40:33 2004 for test by doxygen 1.3.7