Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

162 lines
3.3 KiB

// =================================================================================
// Internet Character Set Conversion: Input from IS-2022-KR
// =================================================================================
#include "pch.hxx"
#include "KscIn.h"
#include "FEChrCnv.h"
int KSC_to_Hangeul (CONV_CONTEXT *pcontext, UCHAR *pKSC, int KSC_len, UCHAR *pHangeul, int Hangeul_len)
{
long lConvertedSize;
if (!Hangeul_len) {
// Wanted the converted size
if (!pcontext->pIncc0)
pcontext->pIncc0 = new CInccKscIn;
if (FAILED(((CInccKscIn*)pcontext->pIncc0)->GetStringSizeA(pKSC, KSC_len, &lConvertedSize)))
return -1;
} else {
if (!pcontext->pIncc)
pcontext->pIncc = new CInccKscIn;
if (FAILED(((CInccKscIn*)pcontext->pIncc)->ConvertStringA(pKSC, KSC_len, pHangeul, Hangeul_len, &lConvertedSize)))
return -1;
}
if (!pKSC) {
// Let's clean up our context here.
if (pcontext->pIncc0) {
delete pcontext->pIncc0;
pcontext->pIncc0 = NULL;
}
if (pcontext->pIncc) {
delete pcontext->pIncc;
pcontext->pIncc = NULL;
}
return 0;
}
return (int)lConvertedSize;
}
CInccKscIn::CInccKscIn()
{
pfnNextProc = ConvMain;
fIsoMode = FALSE;
fKscMode = FALSE;
}
HRESULT CInccKscIn::ConvertByte(BYTE by)
{
return (this->*pfnNextProc)(FALSE, by, lNextParam);
}
HRESULT CInccKscIn::CleanUp()
{
return (this->*pfnNextProc)(TRUE, 0, lNextParam);
}
HRESULT CInccKscIn::ConvMain(BOOL fCleanUp, BYTE by, long lParam)
{
HRESULT hr = S_OK;
if (!fCleanUp) {
if (by == ESC) {
pfnNextProc = ConvEsc;
} else {
if (fIsoMode) {
switch (by) {
case SO:
fKscMode = TRUE;
break;
case SI:
fKscMode = FALSE;
break;
default:
if (fKscMode) {
switch (by) {
case ' ':
case '\t':
case '\n':
hr = Output(by);
break;
default:
hr = Output(by | 0x80);
break;
}
} else {
hr = Output(by);
}
break;
}
} else {
hr = Output(by);
}
}
}
return hr;
}
HRESULT CInccKscIn::ConvEsc(BOOL fCleanUp, BYTE by, long lParam)
{
pfnNextProc = ConvMain;
if (!fCleanUp) {
if (by == IS2022_IN_CHAR) {
pfnNextProc = ConvIsoIn;
return ResultFromScode(S_OK);
} else {
(void)Output(ESC);
return ConvertByte(by);
}
} else {
return Output(ESC);
}
}
HRESULT CInccKscIn::ConvIsoIn(BOOL fCleanUp, BYTE by, long lParam)
{
pfnNextProc = ConvMain;
if (!fCleanUp) {
if (by == IS2022_IN_KSC_CHAR1) {
pfnNextProc = ConvKsc1st;
return ResultFromScode(S_OK);
} else {
(void)Output(ESC);
(void)ConvertByte(IS2022_IN_CHAR);
return ConvertByte(by);
}
} else {
(void)Output(ESC);
(void)ConvertByte(IS2022_IN_CHAR);
return CleanUp();
}
}
HRESULT CInccKscIn::ConvKsc1st(BOOL fCleanUp, BYTE by, long lParam)
{
pfnNextProc = ConvMain;
if (!fCleanUp) {
if (by == IS2022_IN_KSC_CHAR2) {
fIsoMode = TRUE;
return ResultFromScode(S_OK);
} else {
(void)Output(ESC);
(void)ConvertByte(IS2022_IN_CHAR);
(void)ConvertByte(IS2022_IN_KSC_CHAR1);
return ConvertByte(by);
}
} else {
(void)Output(ESC);
(void)ConvertByte(IS2022_IN_CHAR);
(void)ConvertByte(IS2022_IN_KSC_CHAR1);
return CleanUp();
}
}