304 lines
7.6 KiB
C++
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;
|
|
}
|