00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
00029 {
00030 BYTE low,
high;
00031 }
HIGH_LOW;
00032
00033 typedef union tagWANSUNG
00034 {
00035 HIGH_LOW e;
00036 WORD
w;
00037 }
WANSUNG;
00038
00039
00040 CONST WORD
HMNTable[3][96] =
00041 {
00042
00043 {
00044 0xA1A1,
00045 0xA3A1,
00046 0xA1A8,
00047 0xA3A3,
00048 0xA3A4,
00049 0xA3A5,
00050 0xA3A6,
00051 0xA1AE,
00052 0xA3A8,
00053 0xA3A9,
00054 0xA3AA,
00055 0xA3AB,
00056 0xA3A7,
00057 0xA3AD,
00058 0xA3AE,
00059 0xA3AF,
00060 0xA3B0,
00061 0xA3B1,
00062 0xA3B2,
00063 0xA3B3,
00064 0xA3B4,
00065 0xA3B5,
00066 0xA3B6,
00067 0xA3B7,
00068 0xA3B8,
00069 0xA3B9,
00070 0xA3BA,
00071 0xA3BB,
00072 0xA3BC,
00073 0xA3BD,
00074 0xA3BE,
00075 0xA3BF,
00076 0xA3C0,
00077 0xA4B1,
00078 0xA4D0,
00079 0xA4BA,
00080 0xA4B7,
00081 0xA4A8,
00082 0xA4A9,
00083 0xA4BE,
00084 0xA4C7,
00085 0xA4C1,
00086 0xA4C3,
00087 0xA4BF,
00088 0xA4D3,
00089 0xA4D1,
00090 0xA4CC,
00091 0xA4C2,
00092 0xA4C6,
00093 0xA4B3,
00094 0xA4A2,
00095 0xA4A4,
00096 0xA4B6,
00097 0xA4C5,
00098 0xA4BD,
00099 0xA4B9,
00100 0xA4BC,
00101 0xA4CB,
00102 0xA4BB,
00103 0xA3DB,
00104 0xA1AC,
00105 0xA3DD,
00106 0xA3DE,
00107 0xA3DF,
00108 0xA1A2,
00109 0xA4B1,
00110 0xA4D0,
00111 0xA4BA,
00112 0xA4B7,
00113 0xA4A7,
00114 0xA4A9,
00115 0xA4BE,
00116 0xA4C7,
00117 0xA4C1,
00118 0xA4C3,
00119 0xA4BF,
00120 0xA4D3,
00121 0xA4D1,
00122 0xA4CC,
00123 0xA4C0,
00124 0xA4C4,
00125 0xA4B2,
00126 0xA4A1,
00127 0xA4A4,
00128 0xA4B5,
00129 0xA4C5,
00130 0xA4BD,
00131 0xA4B8,
00132 0xA4BC,
00133 0xA4CB,
00134 0xA4BB,
00135 0xA3FB,
00136 0xA3FC,
00137 0xA3FD,
00138 0xA1AD,
00139 0x0000
00140 },
00141
00142 {
00143
00144 0xA1A1,
00145 0xA4B8,
00146 0xA1A8,
00147 0xA3A3,
00148 0xA3A4,
00149 0xA3A5,
00150 0xA3A6,
00151 0xA1AE,
00152 0xA3A8,
00153 0xA3A9,
00154 0xA3AA,
00155 0xA3AB,
00156 0xA4BC,
00157 0xA3AD,
00158 0xA3AE,
00159 0xA4C7,
00160 0xA4BB,
00161 0xA4BE,
00162 0xA4B6,
00163 0xA4B2,
00164 0xA4CB,
00165 0xA4D0,
00166 0xA4C1,
00167 0xA4C6,
00168 0xA4D2,
00169 0xA4CC,
00170 0xA3BA,
00171 0xA4B2,
00172 0xA3B2,
00173 0xA3BD,
00174 0xA3B3,
00175 0xA3BF,
00176 0xA3C0,
00177 0xA4A7,
00178 0xA3A1,
00179 0xA4AB,
00180 0xA4AA,
00181 0xA4BB,
00182 0xA4A2,
00183 0xA3AF,
00184 0xA1AF,
00185 0xA3B8,
00186 0xA3B4,
00187 0xA3B5,
00188 0xA3B6,
00189 0xA3B1,
00190 0xA3B0,
00191 0xA3B9,
00192 0xA3BE,
00193 0xA4BD,
00194 0xA4C2,
00195 0xA4A6,
00196 0xA4C3,
00197 0xA3B7,
00198 0xA4B0,
00199 0xA4BC,
00200 0xA4B4,
00201 0xA3BC,
00202 0xA4BA,
00203 0xA3DB,
00204 0xA3DC,
00205 0xA3DD,
00206 0xA3DE,
00207 0xA3DF,
00208 0xA1AE,
00209 0xA4B7,
00210 0xA4CC,
00211 0xA4C4,
00212 0xA4D3,
00213 0xA4C5,
00214 0xA4BF,
00215 0xA4D1,
00216 0xA4A4,
00217 0xA4B1,
00218 0xA4B7,
00219 0xA4A1,
00220 0xA4B8,
00221 0xA4BE,
00222 0xA4B5,
00223 0xA4BA,
00224 0xA4BD,
00225 0xA4B5,
00226 0xA4C0,
00227 0xA4A4,
00228 0xA4C3,
00229 0xA4A7,
00230 0xA4C7,
00231 0xA4A9,
00232 0xA4A1,
00233 0xA4A9,
00234 0xA4B1,
00235 0xA3FB,
00236 0xA3FC,
00237 0xA3FD,
00238 0xA1AD,
00239 0x0000
00240 },
00241
00242 {
00243
00244 0xA1A1,
00245 0xA4A2,
00246 0xA3AE,
00247 0xA4B8,
00248 0xA4AF,
00249 0xA4AE,
00250 0xA1B0,
00251 0xA3AA,
00252 0xA1A2,
00253 0xA1AD,
00254 0xA1B1,
00255 0xA3AB,
00256 0xA4BC,
00257 0xA3A9,
00258 0xA3AE,
00259 0xA4C7,
00260 0xA4BB,
00261 0xA4BE,
00262 0xA4B6,
00263 0xA4B2,
00264 0xA4CB,
00265 0xA4D0,
00266 0xA4C1,
00267 0xA4C6,
00268 0xA4D2,
00269 0xA4CC,
00270 0xA3B4,
00271 0xA4B2,
00272 0xA3A7,
00273 0xA1B5,
00274 0xA3AE,
00275 0xA3A1,
00276 0xA4AA,
00277 0xA4A7,
00278 0xA3BF,
00279 0xA4BC,
00280 0xA4AC,
00281 0xA4A5,
00282 0xA4AB,
00283 0xA4C2,
00284 0xA3B0,
00285 0xA3B7,
00286 0xA3B1,
00287 0xA3B2,
00288 0xA3B3,
00289 0xA1A8,
00290 0xA3AD,
00291 0xA3B8,
00292 0xA3B9,
00293 0xA4BD,
00294 0xA4B0,
00295 0xA4A6,
00296 0xA4AD,
00297 0xA3B6,
00298 0xA4A3,
00299 0xA4BC,
00300 0xA4B4,
00301 0xA3B5,
00302 0xA4BA,
00303 0xA3A8,
00304 0xA3BA,
00305 0xA1B4,
00306 0xA3BD,
00307 0xA3BB,
00308 0xA3AA,
00309 0xA4B7,
00310 0xA4CC,
00311 0xA4C4,
00312 0xA4D3,
00313 0xA4C5,
00314 0xA4BF,
00315 0xA4D1,
00316 0xA4A4,
00317 0xA4B1,
00318 0xA4B7,
00319 0xA4A1,
00320 0xA4B8,
00321 0xA4BE,
00322 0xA4B5,
00323 0xA4BA,
00324 0xA4BD,
00325 0xA4B5,
00326 0xA4C0,
00327 0xA4A4,
00328 0xA4C3,
00329 0xA4A7,
00330 0xA4C7,
00331 0xA4A9,
00332 0xA4A1,
00333 0xA4B1,
00334 0xA4B1,
00335 0xA3A5,
00336 0xA3CC,
00337 0xA3AF,
00338 0xA1AD,
00339 0x0000
00340 }
00341 };
00342
00343 CONST WORD
wKSCompCode[51] =
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] =
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
00370
00371
00372
00373
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
00423
00424
00425
00426
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
00470
00471
00472
00473
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
00543
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
00574
00575
00576
00577
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
00655
00656
00657
00658
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
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 }