⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chnconv_dll.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
📖 第 1 页 / 共 5 页
字号:
         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 + -