📄 chnconv_dll.cpp
字号:
char szBuffer [ STREAM_UNREAD_BUFFER_SIZE ] ;
int nLength = snprintf ( szBuffer, STREAM_UNREAD_BUFFER_SIZE, "%c", 0xFE ) ;
if ( nLength < 0 || nLength > STREAM_UNREAD_BUFFER_SIZE - 1 ) return CONV_ERROR_UNKNOWN ;
int nResult = CompareFileStart ( pData->StreamIn, szBuffer ) ;
if ( nResult < 0 ) return CONV_ERROR_UNKNOWN ;
if ( ! nResult ) IsTec = 1 ;
}
// 幚峴
if ( IsTec ) nError = Tm2rtfTec ( pData ) ;
else nError = Tm2rtfTxt ( pData ) ;
}
else {
int IsRtf = 0 ;
if ( pData->dwConversionMode & CONVMODE_CONVERT_TXT ) IsRtf = 0 ;
else if ( pData->dwConversionMode & CONVMODE_CONVERT_RTF ) IsRtf = 1 ;
else {
char szBuffer [ STREAM_UNREAD_BUFFER_SIZE ] ;
int nLength = snprintf ( szBuffer, STREAM_UNREAD_BUFFER_SIZE, "%c%c%s", BRACE_START, ESCAPE, szRtfTag ) ;
if ( nLength < 0 || nLength > STREAM_UNREAD_BUFFER_SIZE - 1 ) return CONV_ERROR_UNKNOWN ;
int nResult = CompareFileStart ( pData->StreamIn, szBuffer ) ;
if ( nResult < 0 ) return CONV_ERROR_UNKNOWN ;
if ( ! nResult ) IsRtf = 1 ;
}
// 幚峴
if ( pData->nSrcCodePage == CP_HZ_CHINESE_SIMPLIFIED ) {
if ( IsRtf ) nError = CONV_ERROR_FORMAT ;
else nError = ChnconvTxt ( pData ) ;
}
else {
if ( IsRtf ) nError = ChnconvRtf ( pData ) ;
else nError = ChnconvTxt ( pData ) ;
}
}
return nError ;
}
// 堦抳偟偨傜 0 傪丄晄堦抳側傜惓悢傪丄僄儔乕側傜晧悢傪曉偡
int CompareFileStart ( STREAM *Stream, const char *szString ) {
size_t nLength = strlen ( szString ) ;
if ( nLength >= STREAM_UNREAD_BUFFER_SIZE ) return -1 ;
char szBuffer [ STREAM_UNREAD_BUFFER_SIZE ] ;
size_t nCharRead ;
for ( size_t nCount = 0 ; nCount < nLength ; nCount ++ ) {
int C = StreamRead ( Stream ) ;
if ( C == EOF ) break ;
szBuffer [ nCount ] = C ;
nCharRead = nCount + 1 ;
}
int nResult ;
if ( nCharRead == nLength ) nResult = ( strncmp ( szBuffer, szString, nLength ) ) ? 1 : 0 ;
else nResult = 1 ;
for ( size_t nCount = nCharRead ; nCount ; nCount -- ) {
int C = (unsigned char) szBuffer [ nCount - 1 ] ;
if ( StreamUnread ( C, Stream ) == EOF ) return -1 ;
}
return nResult ;
}
////////////////////////////////////////////
// 曄姺偺慜張棟 //
////////////////////////////////////////////
int InitPeekMessage ( CHNCONVDATA *pData ) ;
// 曄姺僨乕僞傪弶婜壔
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜偦傟埲奜傪曉偡
int InitChnconvData ( CHNCONVDATA *pData, int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pInfo ) {
pData->nSrcCodePage = nSrcCodePage ;
pData->nDstCodePage = nDstCodePage ;
if ( pInfo ) {
pData->dwConversionMode = pInfo->dwConversionMode ;
pData->dwAdditionalMode = pInfo->dwAdditionalMode ;
pData->pSrcToDst = pInfo->pSrcToDst ;
pData->nNumberOfSrcToDst = pInfo->nNumberOfSrcToDst ;
if ( pData->nNumberOfSrcToDst >=INT_MAX ) return 1 ;
if ( ( nDstCodePage & CP_DEFINE_CODEPAGE ) != CP_JAPANESE ) {
pData->pSrcToUc = pInfo->pSrcToUc ;
pData->nNumberOfSrcToUc = pInfo->nNumberOfSrcToUc ;
if ( pData->nNumberOfSrcToUc >=INT_MAX ) return 1 ;
}
// 僼僅儞僩柤偺弶婜壔
pData->szGbFont = DEFAULT_GB_FONT ;
pData->szGbGothicFont = DEFAULT_GB_GOTHIC_FONT ;
pData->szBig5Font = DEFAULT_BIG5_FONT ;
pData->szBig5GothicFont = DEFAULT_BIG5_GOTHIC_FONT ;
pData->szPinyinFont = DEFAULT_PINYIN_FONT ;
pData->szPinyinGothicFont = DEFAULT_PINYIN_GOTHIC_FONT ;
if ( nOsCodePage == CP_CHINESE_SIMPLIFIED ) {
pData->szGbFont = DEFAULT_GB_FONT_L ;
pData->szGbGothicFont = DEFAULT_GB_GOTHIC_FONT_L ;
}
if ( nOsCodePage == CP_CHINESE_TRADITIONAL ) {
pData->szBig5Font = DEFAULT_BIG5_FONT_L ;
pData->szBig5GothicFont = DEFAULT_BIG5_GOTHIC_FONT_L ;
}
if ( pInfo->pFontInfo ) {
const CHNFONTINFO *pFontInfo = pInfo->pFontInfo ;
if ( pFontInfo->pGbFont && *pFontInfo->pGbFont ) pData->szGbFont = pFontInfo->pGbFont ;
if ( pFontInfo->pGbGothicFont && *pFontInfo->pGbGothicFont ) pData->szGbGothicFont = pFontInfo->pGbGothicFont ;
if ( pFontInfo->pBig5Font && *pFontInfo->pBig5Font ) pData->szBig5Font = pFontInfo->pBig5Font ;
if ( pFontInfo->pBig5GothicFont && *pFontInfo->pBig5GothicFont ) pData->szBig5GothicFont = pFontInfo->pBig5GothicFont ;
if ( pFontInfo->pPinyinFont && *pFontInfo->pPinyinFont ) pData->szPinyinFont = pFontInfo->pPinyinFont ;
if ( pFontInfo->pPinyinGothicFont && *pFontInfo->pPinyinGothicFont ) pData->szPinyinGothicFont = pFontInfo->pPinyinGothicFont ;
}
// TechnoMate 娭楢偺僆僾僔儑儞
if ( pInfo->pReserved ) {
const RESERVEDINFO *pReserved = (const RESERVEDINFO*) pInfo->pReserved ;
if ( pReserved ) {
if ( pReserved->cbSize != sizeof(RESERVEDINFO) ) return 1 ;
pData->dwReserved = pReserved->dwMode ;
if ( ! IsNecChineseCodePage ( pData->nSrcCodePage ) && pData->dwReserved ) return 1 ;
}
}
}
return 0 ;
}
int InitFontNumber ( CHNCONVDATA *pData ) ;
// 彂偒崬傒梡僨乕僞偺儊儌儕乕傪妋曐偟弶婜抣傪戙擖
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜偦傟埲奜傪曉偡
int AllocWritingData ( CHNCONVDATA *pData, const CHNCONVEXINFO *pInfo ) {
if ( IsNecChineseCodePage ( pData->nSrcCodePage ) ) {
TMDATA *tm = (TMDATA*) malloc ( sizeof(TMDATA) ) ;
if ( ! tm ) return 1 ;
memzero ( tm, sizeof(TMDATA) ) ;
pData->tm = tm ;
pData->tm->nFontSize = pInfo->nFontSize ;
if ( ! pData->tm->nFontSize ) pData->tm->nFontSize = DEFAULT_FONT_SIZE ;
if ( pData->tm->nFontSize < 0 ) pData->tm->nFontSize = 0 ;
InitFontNumber ( pData ) ;
}
return 0 ;
}
// 彂偒崬傒梡僨乕僞偺儊儌儕乕傪夝曻
int FreeWritingData ( CHNCONVDATA *pData ) {
free ( pData->tm ) ;
return 0 ;
}
// 擖弌椡僐乕僪儁乕僕偲僆僾僔儑儞偺挷惍
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 1 傪曉偡
int InitConversionMode ( CHNCONVDATA *pData ) {
int nSrcCodePage = pData->nSrcCodePage ;
int nDstCodePage = pData->nDstCodePage ;
unsigned long dwConversionMode = pData->dwConversionMode ;
// 媽斉偲偺屳姺惈
if ( nSrcCodePage == CP_CHINESE_HZ ) nSrcCodePage = CP_HZ_CHINESE_SIMPLIFIED ;
// 僆僾僔儑儞
if ( dwConversionMode & CONVMODE_NO_USE_UNICODE ) dwConversionMode &= ~ CONVMODE_CHNCONV_NO_VARIANT ;
// GB/BIG5埲奜
if ( ( nDstCodePage & CP_DEFINE_CODEPAGE ) == CP_JAPANESE ) dwConversionMode &= ~ CONVMODE_PINYIN_BY_ASCII ;
// PeekMessage
if ( dwConversionMode & CONVMODE_PEEKMESSAGE ) {
if ( InitPeekMessage ( pData ) ) dwConversionMode &= ~ CONVMODE_PEEKMESSAGE ;
}
// 抣傪奿擺
pData->nSrcCodePage = nSrcCodePage ;
pData->nDstCodePage = nDstCodePage ;
pData->dwConversionMode = dwConversionMode ;
return 0 ;
}
////////////////////////////////////////////
// 曄姺儖乕僥傿儞 //
////////////////////////////////////////////
typedef int ( CONVERTCHARACTER ) ( int C, unsigned long dwConversionMode ) ;
CONVERTCHARACTER *GetConvertFunction ( int nSrcCodePage, int nDstCodePage, int IsCwFanti ) ;
int ConvertByUserDefinition ( int C, int *pUnicode, CHNCONVDATA *pData ) ;
const char *GetCodeName ( int nCodePage ) ;
int SjisNec2ibm ( int cSjis ) ;
int ConvertCharacterEx ( int C, int nSrcCodePage, int nDstCodePage ) ;
const char *GetMultiCharString ( int C, int nSrcCodePage, int nDstCodePage , char *szBuffer ) ;
int PeekMessageProc ( CHNCONVDATA *pData ) ;
////////////////////////////////////////////
// TXT 曄姺儖乕僥傿儞 //
////////////////////////////////////////////
int Getc ( int C1, CHNCONVDATA *pData ) ;
int GetcHz ( int C1, CHNCONVDATA *pData ) ;
#define GETC_ONLY_ESCAPE (EOF-1)
// nEncodeMode
#define EM_ASCII 0
#define EM_LOCAL 1
int Putc ( int C, STREAM *StreamOut ) ;
int Putwc ( int cUnicode, STREAM *StreamOut ) ;
int PutUnmappableChar ( int C, CHNCONVDATA *pData ) ;
int DecodeCharRef ( int C, CHNCONVDATA *pData ) ;
int UnreadDecodeCharRefBuffer ( int C, CHNCONVDATA *pData ) ;
// 僥僉僗僩僼傽僀儖傪曄姺偡傞
// 惉岟偟偨偲偒偼 0 傪曉偡
// 幐攕偟偨偲偒偼 1 埲忋偺巜掕偝傟偨掕悢傪曉偡
int ChnconvTxt ( CHNCONVDATA *pData ) {
int nCountChar = 0 ;
// 暥帤曄姺娭悢傪弶婜壔
CONVERTCHARACTER *ConvertChineseCharacter = GetConvertFunction ( pData->nSrcCodePage, pData->nDstCodePage, pData->dwConversionMode & CONVMODE_CW_TXT_FANTIZI ) ;
if ( ! ConvertChineseCharacter ) return CONV_ERROR_CODEPAGE ;
// HZ 傪 GB 偵
int IsHzEncode = 0 ;
if ( pData->nSrcCodePage == CP_HZ_CHINESE_SIMPLIFIED ) {
pData->nSrcCodePage = CP_CHINESE_SIMPLIFIED ;
IsHzEncode = 1 ;
}
while ( 1 ) {
if ( pData->nError ) goto CAUGHT_ERROR ;
// 儊僢僙乕僕張棟
if ( ! ( nCountChar & PEEK_MESSAGE_CONUT_MASK ) ) {
if ( pData->dwConversionMode & CONVMODE_PEEKMESSAGE ) PeekMessageProc ( pData ) ;
if ( StreamError ( pData->StreamIn ) ) { pData->nError = CONV_ERROR_READ ; goto CAUGHT_ERROR ; }
if ( StreamError ( pData->StreamOut ) ) { pData->nError = CONV_ERROR_WRITE ; goto CAUGHT_ERROR ; }
}
nCountChar ++ ;
// 嫮惂廔椆
if ( IsAborted ) { pData->nError = CONV_ERROR_ABORTED ; goto CAUGHT_ERROR ; }
int C ;
// 暥帤傪庢摼
if ( ( C = PopStoredCharsW ( pData->CharRefUnreadBuffer ) ) == EOF ) {
int C1 = StreamRead ( pData->StreamIn ) ;
if ( C1 == EOF ) break ;
// 儌乕僪偺偁傞僄儞僐乕僪側傜
if ( IsHzEncode ) {
C = GetcHz ( C1, pData ) ;
if ( C == GETC_ONLY_ESCAPE ) continue ;
if ( C == EOF ) {
PutUnmappableChar ( C1, pData ) ;
continue ;
}
}
// 儌乕僪偺側偄僄儞僐乕僪側傜
else {
C = Getc ( C1, pData ) ;
if ( C == EOF ) {
PutUnmappableChar ( C1, pData ) ;
continue ;
}
}
// 晄惓側僶僀僩楍偐専嵏
if ( C >= 0x100 && ! ismbbtrail_cp ( C & 0xFF, pData->nSrcCodePage & CP_DEFINE_CODEPAGE ) ) {
PutUnmappableChar ( C, pData ) ;
continue ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -