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

📄 chnconv_com.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// chnconv_com.cpp : 僐儞僜乕儖梡 Chnconv

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <conio.h>
#include <signal.h>
#include "msc.h"

#include "access.h"
#include "ask.h"
#include "codepage.h"
#include "fileconv.h"
#include "filename.h"
#include "oemio.h"
#include "res.h"
#include "resource.h"
#include "shfolder.h"
#include "stringex.h"
#include "wildcard.h"
#include "winmain.h"

#include "chnconv.h"
#include "chnconv_opt.h"
#include "chnconv_cp.h"
#include "conv_err.h"
#include "conv_opt.h"
#include "conv_loaddll.h"


// 僐儅儞僪柤
static const wchar_t szCommandName [] = L"CHNCONV" ;

static int nOsCodePage ;         // OS偺僐乕僪儁乕僕
static volatile int IsAborted ;

// 奜帤掕媊偺撉傒崬傒
#include "conv_opt_gaiji.h"


// 儘乕僇儖娭悢
int DisplayErrorMessageA ( int nErrorCode, const char *szFileName, const char *szExtension ) ;
int DisplayErrorMessageW ( int nErrorCode, const wchar_t *szFileName, const wchar_t *szExtension ) ;
int CALLBACK WildcardCallbackA ( const char *szSearchPath, WIN32_FIND_DATAA *pFindData, int nDepth, LPARAM lParam ) ;
int CALLBACK WildcardCallbackW ( const wchar_t *szSearchPath, WIN32_FIND_DATAW *pFindData, int nDepth, LPARAM lParam ) ;
int WINAPI CallChnconvExA ( const char *szSrcFileName, const char *szDstFileName, int nSrcCodePage, int nDstCodePage, void *pInfo ) ;
int WINAPI CallChnconvExW ( const wchar_t *szSrcFileName, const wchar_t *szDstFileName, int nSrcCodePage, int nDstCodePage, void *pInfo ) ;
int PrintFileStart ( int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pInfo ) ;
int PrintFileEnd ( int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pInfo ) ;
void __cdecl AbortProc ( int nSignal ) ;
int Help ( void ) ;

int SetTmOptions ( char *szString ) ;




int main ( int argc, char *argv [] ) {

   int nExitCode = 0 ;           // 廔椆僐乕僪
   int nError = 0 ;              // 堷偒悢僄儔乕
   int nSearchPath = 0 ;         // 専嶕偡傞僷僗柤
   int nSearchDepth = 0 ;        // 専嶕偡傞怺偝
   int nExtension = 0 ;          // 奼挘巕柤

   // for wildcard.cpp
   unsigned long dwSearchMode = WILD_SEARCH_FILE | WILD_SORT ;

   int nSrcCodePage = 0 ;        // 擖椡僐乕僪儁乕僕
   int nDstCodePage = 0 ;        // 弌椡僐乕僪儁乕僕

   char *szFont = NULL ;
   char *szGothicFont = NULL ;
   char *szFontSub = NULL ;
   char *szGothicFontSub = NULL ;

   int IsDisplayHelp = 0 ;          // 僿儖僾傪昞帵偡傞偐
   int IsWriteInUnicode = 0 ;       // 僄儔乕弌椡傪 Unicode 偱
   int IsReadOption = 0 ;           // 娐嫬僼傽僀儖傪撉傒崬傓偐
   int IsCatchErrorStrictly = 0 ;   // 僄儔乕傪専弌偟偨傜掆巭
   unsigned long dwFileconvMode = 0 ;  // 僼傽僀儖曄姺憖嶌偺僆僾僔儑儞


   // 僔僗僥儉忣曬傪庢摼
   nOsCodePage = GetACP () ;


   // 堷偒悢偺張棟乮慜張棟乯
   for ( int nCountArgv = 1 ; nCountArgv < argc ; nCountArgv ++ ) {

      if ( nError ) break ;

      char *szArgv = argv [ nCountArgv ] ;

      if ( *szArgv == '/' || *szArgv == '-' ) {
         switch ( *( szArgv + 1 ) ) {
            case 'W' :
            case 'w' :
               IsWriteInUnicode = 1 ;
               break ;
            case '?' :
               IsDisplayHelp = 1 ;
               break ;
            case '@' :
               IsReadOption = 1 ;
               if ( *( szArgv + 2 ) ) {
                  szConfigFileNameA = GetArgumentA ( nCountArgv ) + 2 ;
                  szConfigFileNameW = GetArgumentW ( nCountArgv ) + 2 ;
                  continue ;
               }
               break ;
            default :
               continue ;
         }
         if ( *( szArgv + 2 ) ) nError = nCountArgv ;
         continue ;
      }
   }

   // 昗弨弌椡偲僄儔乕弌椡傪 UNICODE 偵
   if ( IsWriteInUnicode ) {
      fwide ( stdout, 1 ) ;
      fwide ( stderr, 1 ) ;
   }

   // 僆僾僔儑儞傪撉傒崬傒
   if ( ! IsDisplayHelp && IsReadOption && ReadOption () ) {
      fputws ( GetStringW ( IDS_CANNOT_READ_OPTION ), stderr ) ;
      return 1 ;
   }


   // 堷偒悢偺張棟
   for ( int nCountArgv = 1 ; nCountArgv < argc ; nCountArgv ++ ) {

      if ( nError ) break ;

      char *szArgv = argv [ nCountArgv ] ;

      char *szString ;
      int *pCodePage ;
      int nName ;

      // 僆僾僔儑儞偺庢摼
      if ( *szArgv == '/' || *szArgv == '-' ) {
         switch ( *( szArgv + 1 ) ) {
            case 'C' :
            case 'c' :
               if ( nSrcCodePage && nDstCodePage ) nError = nCountArgv ;
               else if ( ! nSrcCodePage ) pCodePage = & nSrcCodePage ;
               else if ( ! nDstCodePage ) pCodePage = & nDstCodePage ;
               for ( nName = 0 ; nName < CODEPAGE_NAME_LIST_NELEM ; nName ++ ) {
                  if ( ! stricmp ( szArgv + 2, CodePageNameList [ nName ].szCodeName ) ) {
                     if ( pCodePage ) *pCodePage = CodePageNameList [ nName ].nCodePage ;
                     break ;
                  }
               }
               if ( ! ( nName < CODEPAGE_NAME_LIST_NELEM ) ) nError = nCountArgv ;
               continue ;
            case 'f' :
               szString = strchr ( szArgv, '\"' ) ;
               if ( szString ) *szString = 0 ;
               if ( ! *( szArgv + 2 ) ) nError = nCountArgv ;
               szFont = szArgv + 2 ;
               continue ;
            case 'F' :
               szString = strchr ( szArgv, '\"' ) ;
               if ( szString ) *szString = 0 ;
               if ( ! *( szArgv + 2 ) ) nError = nCountArgv ;
               szGothicFont = szArgv + 2 ;
               continue ;
            case 'p' :
               IsUseSameFont = 0 ;
               if ( ! *( szArgv + 2 ) ) continue ;    // -p 偩偗巜掕偟偨応崌
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) {
                  IsUseSameFont = 1 ;
                  continue ;
               }
               szString = strchr ( szArgv, '\"' ) ;
               if ( szString ) *szString = 0 ;
//             if ( ! *( szArgv + 2 ) ) nError = nCountArgv ;
               szFontSub = szArgv + 2 ;
               continue ;
            case 'P' :
               IsUseSameFont = 0 ;
               if ( ! *( szArgv + 2 ) ) continue ;    // -p 偩偗巜掕偟偨応崌
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) {
                  IsUseSameFont = 1 ;
                  continue ;
               }
               szString = strchr ( szArgv, '\"' ) ;
               if ( szString ) *szString = 0 ;
//             if ( ! *( szArgv + 2 ) ) nError = nCountArgv ;
               szGothicFontSub = szArgv + 2 ;
               continue ;
            case 'E' :
            case 'e' :
               if ( ! stricmp ( szArgv + 1, "error" ) ) {
                  IsCatchErrorStrictly = 1 ;
                  continue ;
               }
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsOutputNumber = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsOutputNumber = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'I' :
            case 'i' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsInputNumber = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsInputNumber = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'G' :
            case 'g' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsOneQuestionMark = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsOneQuestionMark = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'K' :
            case 'k' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsGb2cwN = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsGb2cwN = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'J' :
            case 'j' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsSenceCwFanti = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsSenceCwFanti = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'V' :
            case 'v' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsCwTxtFanti = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsCwTxtFanti = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'L' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsCjkExToLinshiDaima = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsCjkExToLinshiDaima = 1 ;
               else nError = nCountArgv ;
               if ( IsCjkExToLinshiDaima ) IsLinshiDaimaToCjkEx = 0 ;
               continue ;
            case 'l' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsLinshiDaimaToCjkEx = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsLinshiDaimaToCjkEx = 1 ;
               else nError = nCountArgv ;
               if ( IsLinshiDaimaToCjkEx ) IsCjkExToLinshiDaima = 0 ;
               continue ;
            case 'M' :
            case 'm' :
               if ( ! stricmp ( szArgv + 2, "rtf" ) ) {
                  IsConvertRtf = 1 ;
                  IsConvertTxt = 0 ;
                  continue ;
               }
               if ( ! stricmp ( szArgv + 2, "txt" ) ) {
                  IsConvertTxt = 1 ;
                  IsConvertRtf = 0 ;
                  continue ;
               }
               nError = nCountArgv ;
               continue ;
            case 'N' :
            case 'n' :
               if ( tolower ( *( szArgv + 2 ) ) == 'u' ) {
                  szArgv ++ ;
                  if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsNoUseUnicode = 0 ;
                  else if ( *( szArgv + 2 ) == 0 ) IsNoUseUnicode = 1 ;
                  else nError = nCountArgv ;
                  continue ;
               }
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsGb2big5N = 0, IsBig52gbN = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsGb2big5N = 1, IsBig52gbN = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'H' :
            case 'h' :
               if ( ! stricmp ( szArgv + 1, "hide" ) ) {
                  dwFileconvMode |= FILECONV_TO_HIDDEN ;
                  continue ;
               }
               dwFileconvMode |= FILECONV_NO_ECHO ;
               break ;
            case 'Q' :
            case 'q' :
               if ( *( szArgv + 2 ) == '-' && *( szArgv + 3 ) == 0 ) IsConvertQuotation = 0 ;
               else if ( *( szArgv + 2 ) == 0 ) IsConvertQuotation = 1 ;
               else nError = nCountArgv ;
               continue ;
            case 'S' :
            case 's' :
               dwSearchMode |= WILD_SEARCH_SUB ;
               if ( *( szArgv + 2 ) == ':' && isascii ( *( szArgv + 3 ) ) && isdigit ( *( szArgv + 3 ) ) ) {
                  errno = 0 ;
                  nSearchDepth = strtoul ( szArgv + 3, & szString, 10 ) ;
                  if ( errno == ERANGE || *szString ) nError = nCountArgv ;
                  if ( ! nSearchDepth ) dwSearchMode &= ~ WILD_SEARCH_SUB ;
                  continue ;
               }
               break ;
            case 'T' :
            case 't' :
               if ( *( szArgv + 2 ) ) {
                  if ( SetTmOptions ( szArgv + 2 ) ) nError = nCountArgv ;
                  continue ;
               }
               dwFileconvMode |= FILECONV_SAVE_TIMESTAMP ;
               break ;
            case 'U' :
            case 'u' :

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -