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

📄 main.c

📁 按C51格式生成汉字字模的.c及.h的windows C源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			 _if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
		   }
		   else if( strncmp(wordBuffer,"define",6)==0) {
			_if_ParseStatus = PARSE_MACRO_DEFINE_MASK  ;
		   }
		   else if( strncmp(wordBuffer,"endif",5)==0) {
		       _iNest_if_macro-- ;
		       if( _iNest_if_macro == 0 ) {
			   return 1 ;
		       }
		       _if_ParseStatus = PARSE_MACRO_IFDEF_WAIT_ENDIF_MASK ;
		   }
		   else if( strncmp(wordBuffer,"include",7)==0) {
			_if_ParseStatus = PARSE_MACRO_INCLUDE_FILE_MASK;
		   }
		   break ;
	   } ;
    }
}

int ProcessConfigFile()
{
      struct _IF_MARCO_PARAM   _if_macro_param ;

   while(1) {
      if( _head_configfile[_iFileCounter].leadOfconfigBuffer >= _head_configfile[_iFileCounter].sizeOfconfigBuffer ) {
	   if( !GetConfigFile() ) return 0 ;
      }
      if( !GetWordFromConfigFile() ) {
	    return 0 ;
      }


      switch( _iParseStatus ) {
	 case PARSE_NULL :
		   if( strncmp(wordBuffer,"#",1)==0) {
		       _iParseStatus = PARSE_MACRO_MASK ;
		   }
		   break ;
	 case PARSE_MACRO_MASK :
		   if( strncmp(wordBuffer,"if",2)==0) {
			Process_IfMacro() ;
			_iParseStatus = PARSE_NULL ;
		   }
		   else if( strncmp(wordBuffer,"define",6)==0) {
			_iParseStatus = PARSE_MACRO_DEFINE_MASK ;
		   }
		   else if( strncmp(wordBuffer,"include",7)==0) {
			_iParseStatus = PARSE_MACRO_INCLUDE_FILE_MASK;
		   }
		   break ;
	  case PARSE_MACRO_INCLUDE_FILE_MASK:
		   _iFileCounter++ ;
		   ProcessFileName(wordBuffer) ;
		   _head_configfile[_iFileCounter].configFile = fopen(wordBuffer,"r");
		   _iParseStatus = PARSE_NULL ;
		   break ;
	  case PARSE_MACRO_DEFINE_MASK :
		   if( !findDefineTok(wordBuffer) ) {
			 _defineToks[defineTokLast].Value = -1 ;
			 strcpy(_defineToks[defineTokLast].Name,wordBuffer) ;
			 pLastDefineTok = &_defineToks[defineTokLast] ;
			 defineTokLast++ ;
		   }
		   _iParseStatus = PARSE_MACRO_DEFINE_VALUE_MASK ;
		   break ;
	 case PARSE_MACRO_DEFINE_VALUE_MASK :
		   if( strncmp(wordBuffer,"#",1)==0) {
		       _iParseStatus = PARSE_MACRO_MASK ;
		       break ;
		   }
		   else if( wordBuffer[0] != 0 ) {
			pLastDefineTok->Value = atoi(wordBuffer) ;
			_iParseStatus = PARSE_NULL ;
		   }
		   break ;
      }

   }
}

unsigned char _Char2Hex(char p)
{
      if( p >= '0' && p <= '9' ) {
	   return p - '0' ;
      }
      if( p >= 'A' && p <= 'F' ) {
	   return p - 'A' + 0x0A ;
      }
      if( p >= 'a' && p <= 'f' ) {
	   return p - 'a' + 0x0A ;
      }
      return -1 ;
}

#if defined(GBK_DOT_SIZE_16) || defined(GBK_DOT_SIZE_12)
long int HZK_offset(int _hzCode)
{
      int _hzHigh ;
      int _hzLow  ;
      int  X,Y,Z,M ;
      long int offset ;
      int  _hzM ;

      _hzHigh = _hzCode & 0xFF00 ;
      _hzHigh >>= 8 ;
      _hzHigh &= 0xFF ;
      _hzLow  = _hzCode & 0x00FF ;

      if( _hzLow > 0xA0 ) {
	    M = 0x5E ;
	    Y = _hzLow - 0xA1 ;
	    if( _hzHigh > 0xA0 ) {
		    X = _hzHigh - 0xA1 ;
		    Z = 0 ;
	    }
	    else {
		    X = _hzHigh - 0x81 ;
		    Z = 0x2284 ;
	    }
      } else {
	    M = 0x60 ;
	    if( _hzLow > 0x7F )
		  Y = _hzLow - 0x41 ;
	    else
		  Y = _hzLow - 0x40 ;

	    if( _hzHigh > 0xA0 ) {
		  X = _hzHigh - 0xA1 ;
		  Z = 0x3a44 ;
	    }
	    else {
		  X = _hzHigh - 0x81 ;
		  Z = 0x2e44 ;
	    }
      }

      offset = X*M + Y + Z ;
      offset *= HZK_DOT_WIDTH ;
      return offset ;
}
#endif // defined(GBK_DOT_SIZE_16)

#if defined(HZK_DOT_SIZE_16)
long int HZK_offset(int _hzCode)
{
      int _hzHigh ;
      long int offset ;

      _hzCode -= 0xA1A1 ;
      _hzHigh = _hzCode & 0xFF00 ;
      _hzHigh >>= 8 ;
      _hzHigh *= 94 ;
      _hzCode &= 0xFF ;
      _hzCode += _hzHigh ;
      offset = _hzCode ;
      offset *= HZK_DOT_WIDTH ;
      return offset ;
}
#endif // defined(HZK_DOT_SIZE_16)

#if defined(HZK_DOT_SIZE_12)
long int HZK_offset(int _hzCode)
{
      int _hzHigh ;
      long int offset ;

      _hzCode -= 0xA1A1 ;
      _hzHigh = _hzCode & 0xFF00 ;
      _hzHigh >>= 8 ;
      _hzHigh *= 94 ;
      _hzCode &= 0xFF ;
      _hzCode += _hzHigh ;
      offset = _hzCode ;
      offset *= HZK_DOT_WIDTH ;
      return offset ;
}
#endif // defined(HZK_DOT_SIZE_12)

void ProcessHZCodes()
{
     int     i,j ;
     int     _hzSrcCode = 0 ;
     int     _hzCode = 0 ;
     int     _hzHigh,_hzLow,_hzTemp ;
     int     _hzCodeIndex = 1 ;
     int     _hzSize,_hzNdx ;
     char    *p ;
     int      c ;
     FILE    *_hzk_file ;
     FILE    *_c_hz_code_file ;
     FILE    *_h_hz_code_file ;
     char    _hzk_code[HZK_DOT_WIDTH+1] ;
     fpos_t  fpos ;
     long  int  offset ;
     char    _buffer[128] ;

     _hzk_file = fopen(HZK_FILE,"rb") ;
     if( !_hzk_file ) {
	 printf("Can not open HZK : %s\n",HZK_FILE) ;
	 return ;
     }
     _c_hz_code_file = fopen(C_HZ_CODE_FILE,"w") ;
     _h_hz_code_file = fopen(H_HZ_CODE_FILE,"w") ;

     sprintf(_buffer,"#include <reg51.h>\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
     sprintf(_buffer,"#include \"config.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
     sprintf(_buffer,"#include \"pindef.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
     sprintf(_buffer,"#include \"types.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
     sprintf(_buffer,"#include \"gdefs.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);

     sprintf(_buffer,"#include \"%s\"\n",H_HZ_CODE_FILE) ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);

     sprintf(_buffer,"#if !defined(__HZK_DEF_H__)\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer," #define __HZK_DEF_H__ \n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#include <reg51.h>\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#include \"config.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#include \"pindef.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#include \"types.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#include \"gdefs.h\"\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"\n\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"#define HZK_DOT_SIZE  %d\n",HZK_DOT_SIZE)  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"typedef unsigned char __HZ_CharCode[%d] ;\n",HZK_DOT_WIDTH)  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"extern const __HZ_CharCode  code _HZ_CodeMaps[] ;\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"\n\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

     sprintf(_buffer,"const __HZ_CharCode  code _HZ_CodeMaps[] = { \n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);

	      /* dump 0x00 */
	      sprintf(_buffer,"{")  ;
	      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
	      _hzNdx=0 ;
	      while(_hzNdx<HZK_DOT_WIDTH) {
		      _hzNdx++ ;
		      _hzTemp = 0x0000 ;
		      sprintf(_buffer,"0x%2X,",_hzTemp)  ;
		      if( _buffer[2] == ' ' ) _buffer[2] = '0' ;
		      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
		      if( _hzNdx % 8 == 0 ) {
			    sprintf(_buffer,"\n ")  ;
			    fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
		      }
	      }
	      _hzHigh = 0x00 ;
	      _hzLow  = 0x00 ;
	      sprintf(_buffer,"},  /* HZCODE_NULL  0x0000  0 */ \n")  ;
	      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
              
              sprintf(_buffer,"#define HZCODE_NULL   0 \n")  ;
              fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
	      /* end of dump 0x00 */


     for(i=0;i<defineTokLast;i++) {
	  if( strncmp(_defineToks[i].Name,"HZCODE_",6) == 0 ) {
	      p = &_defineToks[i].Name[7] ;
	      _hzCode = 0 ;
	      for(j=0;j<4;j++) {
		    _hzCode <<= 4 ;
		    c = _Char2Hex(*p++) ;
		    _hzCode |= c ;
	      }
	      sprintf(_buffer,"#define HZCODE_%4X   %d \n",_hzCode,_hzCodeIndex++)  ;
	      fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);

	      _hzSrcCode = _hzCode ;
	      offset = HZK_offset(_hzCode) ;
	      fpos = 0 ;
	      fsetpos(_hzk_file,&fpos);
	      fgetpos(_hzk_file,&fpos);
	      fseek(_hzk_file,offset,SEEK_SET);
	      if( fread(_hzk_code,1,HZK_DOT_WIDTH,_hzk_file) == 0 ) {
		   printf("HZ Code can not found %4X\n",_hzCode) ;
		   fclose(_hzk_file) ;
		   fclose(_c_hz_code_file) ;
		   fclose(_h_hz_code_file) ;
		   return ;
	      }
	      sprintf(_buffer,"{")  ;
	      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
	      _hzNdx=0 ;
	      while(_hzNdx<HZK_DOT_WIDTH) {
		      _hzTemp = _hzk_code[_hzNdx++] & 0xFF ;
		      sprintf(_buffer,"0x%2X,",_hzTemp)  ;
		      if( _buffer[2] == ' ' ) _buffer[2] = '0' ;
		      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
		      if( _hzNdx % 8 == 0 ) {
			    sprintf(_buffer,"\n ")  ;
			    fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
		      }
	      }
              _hzHigh = _hzSrcCode&0xFF00 ;
              _hzHigh >>= 8 ;
              _hzLow  = _hzSrcCode&0xFF ;
	      sprintf(_buffer,"},  /* HZCODE_%4X   %c%c  %d  */ \n",_hzSrcCode,_hzHigh,_hzLow,_hzCodeIndex-1)  ;
	      fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);
	  }
     }
     sprintf(_buffer,"} ; \n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _c_hz_code_file);

     sprintf(_buffer,"\n\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     sprintf(_buffer,"#endif /* !defined(__HZK_DEF_H__) */\n")  ;
     fwrite(_buffer, 1, strlen(_buffer), _h_hz_code_file);
     fclose(_h_hz_code_file) ;

     fclose(_hzk_file) ;
     fclose(_c_hz_code_file) ;
}

int main()
{
     _iFileCounter  = 0 ;
     _head_configfile[_iFileCounter].sizeOfconfigBuffer = 0 ;
     _head_configfile[_iFileCounter]._iConfigFile_Line_Counter = 1 ;
     defineTokIndex = 0 ;
     defineTokLast  = 0 ;

     _head_configfile[_iFileCounter].configFile = fopen(HZCODE_DEFIND_FILE,"r");
     if( _head_configfile[_iFileCounter].configFile )  {
	     ProcessConfigFile() ;
	     fclose(_head_configfile[_iFileCounter].configFile) ;
	     ProcessHZCodes() ;
     }
     else {
	     printf("HZ Code define header file can not found %s\n",HZCODE_DEFIND_FILE) ;
     }

     return 0 ;
}

⌨️ 快捷键说明

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