windows-nt/Source/XPSP1/NT/inetsrv/intlwb/kor/convert.cpp
2020-09-26 16:20:57 +08:00

304 lines
7.6 KiB
C++

//////////////////////////////////////////////////
//
// Copyright (C) 1997 - 1998, Microsoft Corporation. All Rights Reserved.
//
// File : CONVERT.CPP
// Project : Project SIK
//
//////////////////////////////////////////////////
#define _UNICODE
#include <string.h>
#include <windows.h>
#ifdef WIN32
#include <windowsx.h>
#endif
#include <stdlib.h>
#include <tchar.h>
#include <malloc.h>
#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;
}