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

📄 takechar_c.c

📁 Takechar 可以从不同种类的源代码中取出中文字符.它对于嵌入式设备的小字体开发非常有帮助.
💻 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_c.h"

static FILE *pInputFile;
static char gszInputFileName[ MAX_FILENAME_LENGTH];

static int giDDCounter;	// //
static int giDMMDCounter;	// /**/
static int giSCounter;  // #
static int giStringCounter;  // ""
static int giChineseCounter;

static CHARCHAIN *pChain;

int TakeChar_C_Init( int iFunctionNumber, int *piResult)
{
	pInputFile = 0;

	giDDCounter = 0;
	giDMMDCounter = 0;
	giSCounter = 0;
	giStringCounter = 0;
	giChineseCounter = 0;

	pInputFile = fopen( gszInputFileName, "rb");
	if ( !pInputFile)
	{
		*piResult = RESULT_FILE_ERROR;
		return TAKECHAR_C_DONE;
	}

	return TAKECHAR_C_P;
}

int TakeChar_C_P( int iFunctionNumber, int *piResult)
{
	// +
	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case '/':
			return TAKECHAR_C_D;

		case '"':
			return TAKECHAR_C_Q;

		default:
			return TAKECHAR_C_P;
	}
}

int TakeChar_C_D( int iFunctionNumber, int *piResult)
{
	// /
	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case '/':
//			Log ("//");
			giDDCounter ++;
			return TAKECHAR_C_DD;

		case '*':
//			Log ("/*");
			return TAKECHAR_C_DM;
			
		default:
			return TAKECHAR_C_P;
	}
}

int TakeChar_C_DD( int iFunctionNumber, int *piResult)
{
	// //
	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case 0x0a:
//			Log ("//End");		
			return TAKECHAR_C_P;
			
		default:
			return TAKECHAR_C_DD;
	}
}

int TakeChar_C_DM( int iFunctionNumber, int *piResult)
{
	// /*
	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case '*':
			return TAKECHAR_C_DMM;
			
		default:
			return TAKECHAR_C_DM;
	}
}

int TakeChar_C_DMM( int iFunctionNumber, int *piResult)
{
	// /**
	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case '/':
//			Log ("*/");
			giDMMDCounter ++;
			return TAKECHAR_C_P;

		case '*':
			return TAKECHAR_C_DMM;
			
		default:
			return TAKECHAR_C_DM;
	}
}

int TakeChar_C_Q( 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_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	switch ( cChar)
	{
		case '"':
//			Log ("\"\"");
			giStringCounter ++;
			return TAKECHAR_C_P;

		case '\\':
			return TAKECHAR_C_QS;
			
		default:
			if ( cChar & 0x80)
			{
				iReadResult = ReadOneByte( pInputFile, &cChar2);

				switch( iReadResult)
				{
					case RESULT_FILE_EOF:
						return TAKECHAR_C_DONE;

					case RESULT_FILE_ERROR:
						*piResult = RESULT_FILE_ERROR;
						return TAKECHAR_C_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_C_DONE;
								}
							}else
							{
								if ( CharChain_AddChar( pChain, szChineseChar) != CHARCHINA_OK)
								{
									Log( "ERROR: Can not add char to chain.");
									*piResult = RESULT_ERROR;
									return TAKECHAR_C_DONE;
								}
							}
							return TAKECHAR_C_Q;
						}else
						{
							//Other chars
							switch ( cChar)
							{
								case '"':
									Log ("\"\"");
									giStringCounter ++;
									return TAKECHAR_C_P;

								case '\\':
									return TAKECHAR_C_QS;

								default:
									return TAKECHAR_C_Q;
							}
						}
						return TAKECHAR_C_Q;
				}
			}else
			{
				return TAKECHAR_C_Q;
			}
	}
}

int TakeChar_C_QS( int iFunctionNumber, int *piResult)
{
	// "\ 

	char cChar;
	int iReadResult;
	
	iReadResult = ReadOneByte( pInputFile, &cChar);

	switch( iReadResult)
	{
		case RESULT_FILE_EOF:
			return TAKECHAR_C_DONE;

		case RESULT_FILE_ERROR:
			*piResult = RESULT_FILE_ERROR;		
			return TAKECHAR_C_DONE;

		default:
			break;
	}

	return TAKECHAR_C_Q;
}

int TakeChar_C_Done( int iFunctionNumber, int *piResult)
{
	if ( pInputFile)
	{
		fclose( pInputFile);
	}

	switch( *piResult)
	{
		case RESULT_DONE:
/*
			Log( "giDDCounter=%d", giDDCounter);
			Log( "giDMMDCounter=%d", giDMMDCounter);
			Log( "giSCounter=%d", giSCounter);
			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_C_EXIT;
}

int TakeCharFromFile_C( char *pszInputFileName, CHARCHAIN **ppOutputChain)
{
	FUNCTIONTABLE Functions[] =
	{
		{ TAKECHAR_C_INIT, TakeChar_C_Init},
		{ TAKECHAR_C_P, TakeChar_C_P},
		{ TAKECHAR_C_D, TakeChar_C_D},
		{ TAKECHAR_C_DD, TakeChar_C_DD},
		{ TAKECHAR_C_DM, TakeChar_C_DM},
		{ TAKECHAR_C_DMM, TakeChar_C_DMM},
		{ TAKECHAR_C_Q, TakeChar_C_Q},
		{ TAKECHAR_C_QS, TakeChar_C_QS},
		{ TAKECHAR_C_DONE, TakeChar_C_Done},
		{ -1, 0}
	};
	FUNCTIONTABLE *p;
	int iFunctionNumber;
	int iResult = RESULT_DONE;

	strcpy( gszInputFileName, pszInputFileName);
	pChain = *ppOutputChain;
	
	iFunctionNumber = TAKECHAR_C_INIT;
	
	while ( iFunctionNumber != TAKECHAR_C_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_C_EXIT;
		}
	}

	*ppOutputChain = pChain;
	return iResult;
}

⌨️ 快捷键说明

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