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.
88 lines
1.8 KiB
88 lines
1.8 KiB
// =================================================================================
|
|
// Internet Character Set Conversion: Output to HZ-GB-2312
|
|
// =================================================================================
|
|
|
|
#include "pch.hxx"
|
|
#include "HzGbOut.h"
|
|
#include "FEChrCnv.h"
|
|
|
|
int GB2312_to_HZGB (CONV_CONTEXT *pcontext, UCHAR *pGB2312, int GB2312_len, UCHAR *pHZGB, int HZGB_len)
|
|
{
|
|
long lConvertedSize;
|
|
|
|
if (!HZGB_len) {
|
|
// Wanted the converted size
|
|
if (!pcontext->pIncc0)
|
|
pcontext->pIncc0 = new CInccHzGbOut;
|
|
|
|
if (FAILED(((CInccHzGbOut*)pcontext->pIncc0)->GetStringSizeA(pGB2312, GB2312_len, &lConvertedSize)))
|
|
return -1;
|
|
} else {
|
|
if (!pcontext->pIncc)
|
|
pcontext->pIncc = new CInccHzGbOut;
|
|
|
|
if (FAILED(((CInccHzGbOut*)pcontext->pIncc)->ConvertStringA(pGB2312, GB2312_len, pHZGB, HZGB_len, &lConvertedSize)))
|
|
return -1;
|
|
}
|
|
|
|
if (!pGB2312) {
|
|
// 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;
|
|
}
|
|
|
|
CInccHzGbOut::CInccHzGbOut()
|
|
{
|
|
fDoubleByte = FALSE;
|
|
fGBMode = FALSE;
|
|
}
|
|
|
|
HRESULT CInccHzGbOut::ConvertByte(BYTE by)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!fDoubleByte) {
|
|
if (by & 0x80) {
|
|
fDoubleByte = TRUE;
|
|
byLead = by;
|
|
} else {
|
|
if (fGBMode) {
|
|
(void)Output('~');
|
|
hr = Output('}');
|
|
fGBMode = FALSE;
|
|
}
|
|
hr = Output(by);
|
|
}
|
|
} else {
|
|
fDoubleByte = FALSE;
|
|
if (!fGBMode) {
|
|
(void)Output('~');
|
|
(void)Output('{');
|
|
fGBMode = TRUE;
|
|
}
|
|
(void)Output(byLead & 0x7f);
|
|
hr = Output(by & 0x7f);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CInccHzGbOut::CleanUp()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (fGBMode) {
|
|
(void)Output('~');
|
|
hr = Output('}');
|
|
}
|
|
return hr;
|
|
}
|