?? main.c
字號:
#include <stdio.h>
#include <string.h>
// #define HZK_DOT_SIZE_12
// #define HZK_DOT_SIZE_16
// #define GBK_DOT_SIZE_16
#define GBK_DOT_SIZE_12
#define FREETYPE2_DOT_SIZE_12
#define FREETYPE2_DOT_SIZE_9
#if defined(FREETYPE2_DOT_SIZE_9)
#include <iconv.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#endif // defined(FREETYPE2_DOT_SIZE_9)
#if defined(FREETYPE2_DOT_SIZE_9)
// #define HZK_FILE "wenquanyi_9pt.pcf"
#define HZK_FILE "simsun.ttf"
#define HZK_DOT_WIDTH 22
#define HZK_DOT_SIZE 11
#define HZK_BYTE_SIZE 2
#elif defined(GBK_DOT_SIZE_16)
#define HZK_FILE "HZK16.GBK"
#define HZK_DOT_WIDTH 32
#define HZK_DOT_SIZE 16
#elif defined(GBK_DOT_SIZE_12)
#define HZK_FILE "HZK12.GBK"
#define HZK_DOT_WIDTH 24
#define HZK_DOT_SIZE 12
#elif defined(HZK_DOT_SIZE_16)
#define HZK_FILE "hzk16.bin"
#define HZK_DOT_WIDTH 32
#define HZK_DOT_SIZE 16
#elif defined(HZK_DOT_SIZE_12)
#define HZK_FILE "hzk12"
#define HZK_DOT_WIDTH 24
#define HZK_DOT_SIZE 12
#endif
#define H_HZ_CODE_FILE "hzkdef.h"
#define C_HZ_CODE_FILE "hzkcode.c"
#define HZCODE_DEFIND_FILE "CONFIGHZ.H"
int _iParseStatus ;
#define PARSE_NULL 0
#define PARSE_MACRO_MASK 1
#define PARSE_MACRO_IF_MASK 2
#define PARSE_MACRO_IF_DEF_MASK 3
#define PARSE_MACRO_IF_DEF_CLOSE_MASK 4
#define PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK 5
#define PARSE_MACRO_IFDEF_WAIT_ENDIF_WORD 6
#define PARSE_MACRO_DEFINE_MASK 7
#define PARSE_MACRO_DEFINE_VALUE_MASK 8
#define PARSE_MACRO_INCLUDE_FILE_MASK 9
struct _CONFIGFILE_ {
FILE *configFile ;
char configBuffer[256] ;
int leadOfconfigBuffer ;
int sizeOfconfigBuffer ;
int _iConfigFile_Line_Counter ;
} ;
struct _CONFIGFILE_ _head_configfile[10] ;
int _iFileCounter ;
char wordBuffer[125] ;
int sizeOfword ;
struct DefinedTok {
char Name[250] ;
int Value ;
} ;
struct DefinedTok _defineToks[200] ;
int defineTokIndex;
int defineTokLast ;
struct DefinedTok *pLastDefineTok ;
int GetConfigFile()
{
_head_configfile[_iFileCounter].sizeOfconfigBuffer = fread(_head_configfile[_iFileCounter].configBuffer,1,sizeof(_head_configfile[_iFileCounter].configBuffer),_head_configfile[_iFileCounter].configFile);
if( _head_configfile[_iFileCounter].sizeOfconfigBuffer == 0 ) {
if( _iFileCounter > 0 ) {
fclose(_head_configfile[_iFileCounter].configFile) ;
_iFileCounter-- ;
return _head_configfile[_iFileCounter].sizeOfconfigBuffer ;
}
}
_head_configfile[_iFileCounter].leadOfconfigBuffer = 0 ;
return _head_configfile[_iFileCounter].sizeOfconfigBuffer ;
}
int IsNormalChar(char p)
{
return (p != ' ') && (p != '!') && (p != '(') && (p != '#')
&& (p != ')') && (p != '\r') && (p != '\n') && (p != '/') ;
}
void ReturnCharToConfigBuffer()
{
_head_configfile[_iFileCounter].leadOfconfigBuffer-- ;
}
char GetCharFromConfigBuffer()
{
char c = 0 ;
loop:
if( _head_configfile[_iFileCounter].leadOfconfigBuffer < _head_configfile[_iFileCounter].sizeOfconfigBuffer ) {
do {
c = _head_configfile[_iFileCounter].configBuffer[_head_configfile[_iFileCounter].leadOfconfigBuffer] ;
if( c == '\n' ) _head_configfile[_iFileCounter]._iConfigFile_Line_Counter++ ;
_head_configfile[_iFileCounter].leadOfconfigBuffer++ ;
} while ((c == '\n') || (c == '\r')) ;
}
else {
if( GetConfigFile() ) goto loop ;
}
return c ;
}
char _notCR_GetCharFromConfigBuffer()
{
char c = 0 ;
loop:
if( _head_configfile[_iFileCounter].leadOfconfigBuffer < _head_configfile[_iFileCounter].sizeOfconfigBuffer ) {
c = _head_configfile[_iFileCounter].configBuffer[_head_configfile[_iFileCounter].leadOfconfigBuffer] ;
if( c == '\n' ) _head_configfile[_iFileCounter]._iConfigFile_Line_Counter++ ;
_head_configfile[_iFileCounter].leadOfconfigBuffer++ ;
}
else {
if( GetConfigFile() ) goto loop ;
}
return c ;
}
void SkipCommitTok()
{
char p ;
next_char_lp:
p = GetCharFromConfigBuffer() ;
if( p == '*' && p ) {
p = GetCharFromConfigBuffer() ;
if( p == '/' ) return ;
goto next_char_lp ;
}
}
void SkipNewStyleCommitTok()
{
char p ;
next_char_lp:
p = _notCR_GetCharFromConfigBuffer() ;
if( p == '\r' || p == '\n' ) return ;
goto next_char_lp ;
}
char *GetWordFromConfigFile()
{
char p ;
head_LP:
p = GetCharFromConfigBuffer() ;
while(p == ' ' && p ) {
p = GetCharFromConfigBuffer() ;
}
if( p == '#' || p == '!' || p == ')' ) {
wordBuffer[0] = p ;
wordBuffer[1] = 0x00 ;
sizeOfword = 1 ;
return &wordBuffer[0];
}
if( p == '/' && p ) {
p = GetCharFromConfigBuffer() ;
if( p == '/' && p ) { // skip to new line
SkipNewStyleCommitTok() ;
goto head_LP ;
}
if( p == '*' && p ) {
SkipCommitTok() ;
goto head_LP ;
}
}
sizeOfword = 0 ;
while( p && IsNormalChar(p) ) {
wordBuffer[sizeOfword++] = p ;
p = GetCharFromConfigBuffer() ;
}
if( p == ')' || p == '#' || p == '/') ReturnCharToConfigBuffer() ;
wordBuffer[sizeOfword] = 0x00 ;
return &wordBuffer[0] ;
}
int findDefineTok(char *pDef)
{
int i ;
for(i = 0 ; i < defineTokLast ; i++) {
if( strcmp(_defineToks[i].Name,pDef) == 0 ) {
pLastDefineTok = &_defineToks[i] ;
return 1 ;
}
}
return 0 ;
}
struct _IF_MARCO_PARAM {
int _iNest_If_ ;
} ;
struct _IF_MARCO_PARAM _if_macro_param ;
void ProcessFileName(char *pName)
{
char *p = pName ;
size_t max_len = strlen(pName) ;
int i ;
if( *p == '\"' && p ) {
for(i=1;i<max_len+1;i++) {
*p++ = pName[i] ;
}
}
max_len = strlen(pName) ;
p = &pName[max_len-1] ;
if( *p == '\"' && p ) {
*p = 0 ;
}
}
int Process_IfMacro()
{
int _if_ParseStatus = PARSE_MACRO_IF_MASK ;
int _i_isNotFlag = 0 ;
char _strDefineName[128] ;
int _iNest_if_macro = 1 ;
int _i_SkipAllIfMacro = 0 ;
while(1) {
if( _head_configfile[_iFileCounter].leadOfconfigBuffer >= _head_configfile[_iFileCounter].sizeOfconfigBuffer ) {
if( !GetConfigFile() ) return 0 ;
}
if( !GetWordFromConfigFile() ) {
return 0 ;
}
switch(_if_ParseStatus) {
case PARSE_MACRO_MASK :
if( strncmp(wordBuffer,"define",6)==0) {
_if_ParseStatus = PARSE_MACRO_DEFINE_MASK ;
}
else if( strncmp(wordBuffer,"include",7)==0) {
_if_ParseStatus = PARSE_MACRO_INCLUDE_FILE_MASK;
}
break ;
case PARSE_MACRO_INCLUDE_FILE_MASK:
_iFileCounter++ ;
ProcessFileName(wordBuffer) ;
_head_configfile[_iFileCounter].configFile = fopen(wordBuffer,"r");
if( _head_configfile[_iFileCounter].configFile == NULL ) {
printf("HZ Code define header file can not found %s\n",wordBuffer) ;
return 0 ;
}
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
break ;
case PARSE_MACRO_DEFINE_MASK :
if( !findDefineTok(wordBuffer) ) {
_defineToks[defineTokLast].Value = -1 ;
strcpy(_defineToks[defineTokLast].Name,wordBuffer) ;
pLastDefineTok = &_defineToks[defineTokLast] ;
defineTokLast++ ;
}
_if_ParseStatus = PARSE_MACRO_DEFINE_VALUE_MASK ;
break ;
case PARSE_MACRO_DEFINE_VALUE_MASK :
if( strncmp(wordBuffer,"#",1)==0) {
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_WORD ;
break ;
}
else if( wordBuffer[0] != 0 ) {
pLastDefineTok->Value = atoi(wordBuffer) ;
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
}
break ;
case PARSE_MACRO_IF_MASK :
if( strncmp(wordBuffer,"!",1)==0) {
_i_isNotFlag = 1 ;
}
else if( strncmp(wordBuffer,"include",7)==0) {
_if_ParseStatus = PARSE_MACRO_INCLUDE_FILE_MASK;
}
else if( strncmp(wordBuffer,"defined",7)==0) {
_if_ParseStatus = PARSE_MACRO_IF_DEF_MASK ;
}
break ;
case PARSE_MACRO_IF_DEF_MASK:
strcpy(_strDefineName,wordBuffer) ;
_if_ParseStatus = PARSE_MACRO_IF_DEF_CLOSE_MASK ;
break ;
case PARSE_MACRO_IF_DEF_CLOSE_MASK:
if( strncmp(wordBuffer,")",1)==0) {
}
else if( strncmp(wordBuffer,"#",1)==0) {
if( findDefineTok(_strDefineName) ) {
if( _i_isNotFlag ) {
_iNest_if_macro = 1 ;
_i_SkipAllIfMacro = 1 ;
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK;
}
else
{
_i_SkipAllIfMacro = 0 ;
}
}
else
{
_i_SkipAllIfMacro = !_i_isNotFlag ;
}
if( _i_SkipAllIfMacro ) {
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK;
}
else {
_if_ParseStatus = PARSE_MACRO_MASK ;
}
}
break ;
case PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK :
if( strncmp(wordBuffer,"#",1)==0) {
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_WORD ;
}
break ;
case PARSE_MACRO_IFDEF_WAIT_ENDIF_WORD :
if( (strncmp(wordBuffer,"if",2)==0) ) {
if( _i_SkipAllIfMacro ) {
_iNest_if_macro++ ;
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
} else
{
Process_IfMacro() ;
_if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -