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

📄 main.c

📁 按C51格式生成汉字字模的.c及.h的windows C源码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -