📄 takechar_asm.c
字号:
/****************************************************
Takechar V1.00 Takes out Chinese characters from source code.
Copyright(C) 2007 ShiQizheng(sales@newexperience.51.net)
http://newexperience.51.net
All rights reserved.
Released under GPL. Please see "gpl.txt" for details.
****************************************************/
#include "takechar_asm.h"
static FILE *pInputFile;
static char gszInputFileName[ MAX_FILENAME_LENGTH];
static int giSCCounter; // ;
static int giStringCounter; // ''
static int giChineseCounter;
static CHARCHAIN *pChain;
int TakeChar_ASM_Init( int iFunctionNumber, int *piResult)
{
pInputFile = 0;
giSCCounter = 0;
giStringCounter = 0;
giChineseCounter = 0;
pInputFile = fopen( gszInputFileName, "rb");
if ( !pInputFile)
{
*piResult = RESULT_FILE_ERROR;
return TAKECHAR_ASM_DONE;
}
return TAKECHAR_ASM_P;
}
int TakeChar_ASM_P( int iFunctionNumber, int *piResult)
{
// +
char cChar;
int iReadResult;
iReadResult = ReadOneByte( pInputFile, &cChar);
switch( iReadResult)
{
case RESULT_FILE_EOF:
return TAKECHAR_ASM_DONE;
case RESULT_FILE_ERROR:
*piResult = RESULT_FILE_ERROR;
return TAKECHAR_ASM_DONE;
}
switch ( cChar)
{
case ';':
// Log( ";");
giSCCounter ++;
return TAKECHAR_ASM_SC;
case '\'':
return TAKECHAR_ASM_SQ;
default:
return TAKECHAR_ASM_P;
}
}
int TakeChar_ASM_SC( int iFunctionNumber, int *piResult)
{
// ;
char cChar;
int iReadResult;
iReadResult = ReadOneByte( pInputFile, &cChar);
switch( iReadResult)
{
case RESULT_FILE_EOF:
return TAKECHAR_ASM_DONE;
case RESULT_FILE_ERROR:
*piResult = RESULT_FILE_ERROR;
return TAKECHAR_ASM_DONE;
}
switch ( cChar)
{
case 0x0a:
return TAKECHAR_ASM_P;
default:
return TAKECHAR_ASM_SC;
}
}
int TakeChar_ASM_SQ( int iFunctionNumber, int *piResult)
{
// '
char cChar;
char cChar2;
int iReadResult;
char szChineseChar[3];
iReadResult = ReadOneByte( pInputFile, &cChar);
switch( iReadResult)
{
case RESULT_FILE_EOF:
return TAKECHAR_ASM_DONE;
case RESULT_FILE_ERROR:
*piResult = RESULT_FILE_ERROR;
return TAKECHAR_ASM_DONE;
}
switch ( cChar)
{
case '\'':
// Log( "''");
giStringCounter ++;
return TAKECHAR_ASM_P;
default:
if ( cChar & 0x80)
{
iReadResult = ReadOneByte( pInputFile, &cChar2);
switch( iReadResult)
{
case RESULT_FILE_EOF:
return TAKECHAR_ASM_DONE;
case RESULT_FILE_ERROR:
*piResult = RESULT_FILE_ERROR;
return TAKECHAR_ASM_DONE;
default:
if ( cChar2 & 0x80)
{
//Find one Chinese char
szChineseChar[0] = cChar;
szChineseChar[1] = cChar2;
szChineseChar[2] = 0;
Log( "Found one Chinese char:%s", szChineseChar);
giChineseCounter ++;
if ( pChain == 0)
{
if ( CharChain_Init( &pChain, szChineseChar) != CHARCHINA_OK)
{
Log( "ERROR: Can not init char chain.");
*piResult = RESULT_ERROR;
return TAKECHAR_ASM_DONE;
}
}else
{
if ( CharChain_AddChar( pChain, szChineseChar) != CHARCHINA_OK)
{
Log( "ERROR: Can not add char to chain.");
*piResult = RESULT_ERROR;
return TAKECHAR_ASM_DONE;
}
}
return TAKECHAR_ASM_SQ;
}else
{
//Other chars
switch ( cChar)
{
case '\'':
// Log( "''");
giStringCounter ++;
return TAKECHAR_ASM_P;
default:
return TAKECHAR_ASM_SQ;
}
}
return TAKECHAR_ASM_SQ;
}
}else
{
return TAKECHAR_ASM_SQ;
}
}
}
int TakeChar_ASM_Done( int iFunctionNumber, int *piResult)
{
if ( pInputFile)
{
fclose( pInputFile);
}
switch( *piResult)
{
case RESULT_DONE:
/*
Log( "giSCCounter=%d", giSCCounter);
Log( "giStringCounter=%d", giStringCounter);
Log( "giChineseCounter=%d", giChineseCounter);
*/
Log( "Done.");
break;
case RESULT_FILE_ERROR:
Log( "ERROR: Can not read one byte from input file:%s\n", gszInputFileName);
break;
default:
Log( "ERROR.");
break;
}
return TAKECHAR_ASM_EXIT;
}
int TakeCharFromFile_ASM( char *pszInputFileName, CHARCHAIN **ppOutputChain)
{
FUNCTIONTABLE Functions[] =
{
{ TAKECHAR_ASM_INIT, TakeChar_ASM_Init},
{ TAKECHAR_ASM_P, TakeChar_ASM_P},
{ TAKECHAR_ASM_SC, TakeChar_ASM_SC},
{ TAKECHAR_ASM_SQ, TakeChar_ASM_SQ},
{ TAKECHAR_ASM_DONE, TakeChar_ASM_Done},
{ -1, 0}
};
FUNCTIONTABLE *p;
int iFunctionNumber;
int iResult = RESULT_DONE;
strcpy( gszInputFileName, pszInputFileName);
pChain = *ppOutputChain;
iFunctionNumber = TAKECHAR_ASM_INIT;
while ( iFunctionNumber != TAKECHAR_ASM_EXIT)
{
for ( p = ( FUNCTIONTABLE*)Functions; p->pFunction!= 0; p++ )
{
if ( iFunctionNumber == p->iFunctionNumber)
{
iFunctionNumber = ( *p->pFunction)( iFunctionNumber, &iResult);
break;
}
}
if ( p->pFunction == 0 )
{
iFunctionNumber = TAKECHAR_ASM_EXIT;
}
}
*ppOutputChain = pChain;
return iResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -