109 lines
2.9 KiB
C++
109 lines
2.9 KiB
C++
#include "stdafx.h"
|
|
|
|
|
|
void gb_2_big (unsigned char *in_str, unsigned chg_length, unsigned char *out_str ,unsigned *outstr_size,unsigned char *big_str) {
|
|
unsigned chg_start;
|
|
unsigned pos_of_big;
|
|
unsigned char rh1, rh2;
|
|
|
|
chg_start = 0;
|
|
out_str[0] = '\0';
|
|
*outstr_size = 0;
|
|
|
|
while ( chg_start < chg_length ){
|
|
rh1 = in_str[chg_start];
|
|
chg_start = chg_start + 1;
|
|
if ( rh1 >= 161 && rh1 < 251 && chg_start < chg_length ) {
|
|
rh2 = in_str[chg_start];
|
|
chg_start = chg_start + 1;
|
|
if ( rh2 >= 160 && chg_start <= chg_length ) {
|
|
pos_of_big = (rh1 - 161) * 96 * 2 + (rh2 - 160) * 2;
|
|
out_str[(*outstr_size)++] = big_str[pos_of_big];
|
|
out_str[(*outstr_size)++] = big_str[pos_of_big+1];
|
|
}
|
|
else {
|
|
if (chg_start <= chg_length){
|
|
out_str[(*outstr_size)++] = rh1;
|
|
chg_start = chg_start - 1;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ( rh1 < 161 || rh1 >= 251 )
|
|
out_str[(*outstr_size)++] = rh1;
|
|
}
|
|
}
|
|
|
|
void big_2_gb (unsigned char *in_str, unsigned chg_length, unsigned char *out_str, unsigned *outstr_size, unsigned char *gb_str){
|
|
unsigned chg_start;
|
|
unsigned pos_of_gb;
|
|
unsigned char rh1,rh2;
|
|
|
|
chg_start = 0;
|
|
out_str[0] = '\0';
|
|
(*outstr_size) = 0;
|
|
while (chg_start < chg_length){
|
|
rh1 = in_str[chg_start];
|
|
chg_start = chg_start + 1;
|
|
if (rh1 >= 161 && rh1 <= 251 && chg_start < chg_length) {
|
|
rh2 = in_str[chg_start];
|
|
chg_start = chg_start + 1;
|
|
if (rh2 >= 64 && rh2 < 128 && chg_start <= chg_length ) {
|
|
pos_of_gb = (rh1 - 161) * 160 * 2 + (rh2 - 64) * 2;
|
|
out_str[(*outstr_size)++] = gb_str[pos_of_gb];
|
|
out_str[(*outstr_size)++] = gb_str[pos_of_gb+1];
|
|
}
|
|
else {
|
|
if ( chg_start <= chg_length ) {
|
|
if ( rh2 >= 160 ) {
|
|
pos_of_gb = (rh1 - 161) * 160 * 2 + (rh2 - 160) * 2 + 64 * 2;
|
|
out_str[(*outstr_size)++] = gb_str[pos_of_gb];
|
|
out_str[(*outstr_size)++] = gb_str[pos_of_gb+1];
|
|
}
|
|
else {
|
|
out_str[(*outstr_size)++] = rh1;
|
|
chg_start = chg_start - 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ( rh1 < 161 || rh1 > 251 )
|
|
out_str[(*outstr_size)++] = rh1;
|
|
}
|
|
}
|
|
|
|
|
|
int GBToBig5(const TCHAR *szSrc0, XString &sDest, void *pCodeTable)
|
|
{
|
|
AString szSrc1(szSrc0);
|
|
const char* szSrc=(const char*)szSrc1;
|
|
unsigned nLen=(unsigned)strlen(szSrc);
|
|
unsigned nOut=0;
|
|
char *szDest=strnew(szSrc);
|
|
gb_2_big((unsigned char *)szSrc, nLen, (unsigned char *)szDest, &nOut, (unsigned char *)pCodeTable);
|
|
ASSERT(nOut==nLen);
|
|
|
|
sDest=(LPCTSTR)TString(szDest);
|
|
delete[] szDest;
|
|
|
|
return RTNORM;
|
|
}
|
|
|
|
int Big5ToGB(const TCHAR *szSrc0, XString &sDest, void *pCodeTable)
|
|
{
|
|
AString szSrc1(szSrc0);
|
|
const char* szSrc=(const char*)szSrc1;
|
|
|
|
unsigned nLen=(unsigned)strlen(szSrc);
|
|
unsigned nOut=0;
|
|
char *szDest=strnew(szSrc);
|
|
big_2_gb((unsigned char *)szSrc, nLen, (unsigned char *)szDest, &nOut, (unsigned char *)pCodeTable);
|
|
ASSERT(nOut==nLen);
|
|
|
|
sDest=(LPCTSTR)TString(szDest);
|
|
delete[] szDest;
|
|
|
|
return RTNORM;
|
|
}
|