📄 chnconv_com.cpp
字号:
// 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 + -