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

📄 rc.c

📁 UNIX 资源文件编译器
💻 C
字号:
/*****************************************************************************    ------------	子系统名称: 界面资源管理器*        RC.C*    ------------	模块名称  : 资源编译程序****************************************************************************/#include	"rc.h"#include	"resource.h"char		pRESName[128];/*****************************************************************************    变量定义	--	关键字表****************************************************************************/KEYWORD	pkwKeyWord[MAXN_KEYWORD] ={	{ "", ID_UNUSED      	       		},	{ "STRINGTABLE", ID_STRTBL     		},	{ "MENU", ID_MENU           		},	{ "DIALOG", ID_DIALOG			},	{ "BEGIN", ID_BEGIN         		},	{ "END", ID_END             		},	{ "CAPTION", ID_CAPTION			},	{ "POPUP", ID_POPUP         		},	{ "MENUITEM", ID_MENUITEM   		},	{ "SEPARATOR", ID_SEPARATOR 		},	{ "BREAK", ID_BREAK         		},	{ "", ID_UNUSED             		},	{ "TEXT", ID_TEXT			},	{ "STATIC", ID_STATIC			},	{ "BUTTON", ID_BUTTON			},	{ "RADIOBUTTON", ID_RADIOBUTTON		},	{ "CHECKBOX", ID_CHECKBOX		},	{ "EDIT", ID_EDIT			},	{ "LISTBOX", ID_LISTBOX			},	{ "DS_TABSTOP", ID_DS_TABSTOP		},	{ "DS_GROUP", ID_DS_GROUP		},	{ "TS_LEFT", ID_TS_LEFT			},	{ "TS_RIGHT", ID_TS_RIGHT		},	{ "TS_CENTER", ID_TS_CENTER		},	{ "TS_HIGHLIGHT", ID_TS_HIGHLIGHT	},	{ "TS_REVERSE", ID_TS_REVERSE		},	{ "TS_UNDERLINE", ID_TS_UNDERLINE	},	{ "BS_DEFAULT", ID_BS_DEFAULT		},	{ "SS_FRAME", ID_SS_FRAME		},	{ "SS_HLINE", ID_SS_HLINE		},	{ "SS_VLINE", ID_SS_VLINE		},	{ "SS_HIGHLIGHT", ID_SS_HIGHLIGHT	},	{ "SS_REVERSE", ID_SS_REVERSE		},	{ "ES_ALPHA", ID_ES_ALPHA		},	{ "ES_DICIMAL", ID_ES_DICIMAL		},	{ "ES_LOWER", ID_ES_LOWER		},	{ "ES_UPPER", ID_ES_UPPER		},	{ "ES_AUTOSKIP", ID_ES_AUTOSKIP		},	{ "ES_PASSWORD", ID_ES_PASSWORD		},	{ "LBS_MULTIPLE", ID_LBS_MULTIPLE	}};short	nRESLineIndex;/*****************************************************************************    函数原型: RCError ( short nErrorID )**    功    能: 输出编译资源文件时的错误信息**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: short	nErrorID	错误信息索引号**    出口参数: 总为 OK**    实现算法:**    上层调用: DoResource**    下层调用: 无****************************************************************************/short	RCError ( short nErrorID ){	printf ( "Resource Compile error message -- Line: %d,  ErrorID: %d\n", nRESLineIndex, nErrorID );	switch ( nErrorID )	{	    case    ERR_RES_NOTKEYWORD :	/* 		*/		printf ( "\t不是关键字\n" );                break;	    case    ERR_RES_NOFILE     :		printf ( "\t文件未找到\n" );		break;	    case    ERR_RES_OPENFILE   :		printf ( "\t打开文件出错\n" );		break;	    case    ERR_NOMEMORY       :		printf ( "\t没有足够的内存\n" );		break;	    case    ERR_RES_ENDOFBUF   :		printf ( "\t缓冲区结束\n" );		break;	    case    ERR_RES_SYNTAX     :		printf ( "\t语法错误\n" );		break;	    case    ERR_RES_DIGIT      :		printf ( "\t整数错误\n" );		break;	}	return ( OK );}/*****************************************************************************    函数原型: CheckKeyWord ( char *pWord )**    功    能: 查询关键字表, 判断一单词是否为关键字.**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char  	*pWord	--  待判断的单词**    出口参数: >0 该单词是关键字, 返回值为关键字索引值*              <0 ERR_RES_NOTKEYWORD --  该单词不是关键字**    实现算法: 查询关键字表 pKeyWord**    上层调用:**    下层调用: 无****************************************************************************/short	CheckKeyWord ( char *pWord ){	short	i;	for ( i = 1; i < MAXN_KEYWORD; i++ )	  if ( strcmp ( pWord, pkwKeyWord[i].pName ) == 0 )	    return ( pkwKeyWord[i].nMacro );	return ( ERR_RES_NOTKEYWORD );}/*****************************************************************************    函数原型: SkipBlank ( char **ppRESBuf )**    功    能: 跳过缓冲区中的空格, 标点, 回车**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char	**ppBuffer	缓冲区指针**    出口参数: OK			调用成功*              ERR_RES_ENDOFBUF 	缓冲区结束**    实现算法: 1. 跳过缓冲区中的空格, 标点, 回车*	       2. 如果跳过的是回车符, 则行计数器加 1**    上层调用: GetWord**    下层调用: 无****************************************************************************/short	SkipBlank ( char **ppRESBuf ){	while ( ( **ppRESBuf ) && ( isspace ( **ppRESBuf ) || ispunct ( **ppRESBuf ) ) )	{	  if ( **ppRESBuf == '\n' )	    nRESLineIndex ++;	  if ( **ppRESBuf == '"' )	    break;	  (*ppRESBuf) ++;	}	if ( **ppRESBuf )	  return ( OK );	else	  return ( ERR_RES_ENDOFBUF );}/*****************************************************************************    函数原型: GetWord ( char **ppRESBuf, char *pWord )**    功    能: 取缓冲区中的单词 ( 以空格, 标点, 回车为分隔符 )**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char	**ppBuffer	缓冲区指针*	       char	*pWord		单词缓冲区**    出口参数: OK			调用成功*              ERR_RES_ENDOFBUF 	缓冲区结束**    实现算法:**    上层调用: CompileReource*	       CompileStrTbl*	       CompileMenu*	       CompileDialog**    下层调用: SkipBlank****************************************************************************/short	GetWord ( char **ppRESBuf, char *pWord ){	char 	*pTemp;	short	nErrorID;	pTemp = pWord;	nErrorID = SkipBlank ( ppRESBuf );		/* 跳过分隔符	*/	if ( nErrorID < OK )	  return ( nErrorID );	if ( **ppRESBuf == '"' )	  while ( 1 )	  {	    (*ppRESBuf) ++;	    if ( **ppRESBuf == '\"' )	    {	      (*ppRESBuf) ++;	      break;	    }	    *pTemp = **ppRESBuf;	    pTemp ++;	  }	else	  while ( (**ppRESBuf) && !isspace ( **ppRESBuf ) && ( !ispunct ( **ppRESBuf ) || (**ppRESBuf) == '_' ))	  {	    *pTemp = **ppRESBuf;	    (*ppRESBuf) ++;	    pTemp ++;	  }	*pTemp = 0;	return ( OK );}/*****************************************************************************    函数原型: WordToInt ( short *nResult, char *pWord )**    功    能: 单词转换为整数**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: short	*nResult	整数指针*	       char	*pWord		单词缓冲区**    出口参数: OK			转换成功*              ERR_RES_DIGIT		整数错误**    实现算法: 1. 检查单字的合法性:     +100 或 -100*              2. 调用 atoi 函数进行转换**    上层调用: CompileStrTbl*	       CompileMenu*	       CompileDialog**    下层调用: 无****************************************************************************/short	WordToInt ( short *nResult, char *pWord ){	char	*pTemp;	pTemp = pWord;	if ( ( *pTemp == '+' ) || ( *pTemp == '-' ) )	/* 前导正负号	*/	  pTemp ++;	while ( *pTemp )				/* 检查合法性	*/	{	  if ( !isdigit ( *pTemp ) )	    return ( ERR_RES_DIGIT );	  pTemp ++;	}	*nResult = atoi ( pWord );			/* 转换 	*/	return ( OK );}/*****************************************************************************    函数原型: CompileResource ( char **ppRESBuf )**    功    能: 编译资源文件**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char	**ppRESBuf	资源数据缓冲区**    出口参数: =0 编译成功*	       <0 编译失败**    实现算法:**    上层调用:**    下层调用:****************************************************************************/short	CompileResource ( char **ppRESBuf ){	char	pWord[MAXL_RESWORD];	short	nErrorID;	void	*pResource;	RESOURCE rRES;	nRESLineIndex = 0;			/* 行计数器清零 	*/	while ( 1 )	{							/* 读一个单词	*/	  if ( GetWord ( ppRESBuf, pWord ) == ERR_RES_ENDOFBUF )	    break;                                      /* 缓冲区结束	*/	  nErrorID = CheckKeyWord ( pWord );		/* 检查关键字	*/	  if ( nErrorID < OK )	    return ( nErrorID );			/* 非关键字, 错	*/	  switch ( nErrorID )	  {	      case ID_STRTBL :   			/* 窗口资源	*/		  nErrorID = CompileStrTbl ( ppRESBuf, pWord, &pResource );		  if ( nErrorID < OK )		    return ( nErrorID );		  printf ( "\tSTRINGTABLE : %5d\t\tOK\n", nErrorID );		  rRES.nRESID = nErrorID;		  rRES.nType  = RT_STRTBL;		  rRES.pRES   = pResource;		  if ( ( nErrorID = AppendResource ( &rRES ) ) < OK )		    return ( nErrorID );		  rfhRESFileHead.nCount ++;		  break;	      case ID_MENU   :                          /* 菜单资源	*/		  nErrorID = CompileMenu ( ppRESBuf, pWord, &pResource );		  if ( nErrorID < OK )		    return ( nErrorID );		  printf ( "\tMENU	    : %5d\t\tOK\n", nErrorID );		  rRES.nRESID = nErrorID;		  rRES.nType  = RT_MENU;		  rRES.pRES   = pResource;		  if ( ( nErrorID = AppendResource ( &rRES ) ) < OK )		    return ( nErrorID );		  rfhRESFileHead.nCount ++;		  break;	      case ID_DIALOG :                          /* 对话框资源	*/		  nErrorID = CompileDialog ( ppRESBuf, pWord, &pResource );		  if ( nErrorID < OK )		    return ( nErrorID );		  printf ( "\tDIALOG	    : %5d\t\tOK\n", nErrorID );		  rRES.nRESID = nErrorID;		  rRES.nType  = RT_DIALOG;		  rRES.pRES   = pResource;		  if ( ( nErrorID = AppendResource ( &rRES ) ) < OK )		    return ( nErrorID );		  rfhRESFileHead.nCount ++;		  break;	      default     :				/* 其他关键字	*/		  return ( ERR_RES_SYNTAX );	  }	}	return ( OK );}/*****************************************************************************    函数原型: ReadResourceFile ( char *pRESFileName, char *pRESBuf )**    功    能: 将资源源文件中的数据读入内存**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char	*pFileName	文件名*	       char	*pRESBuf	资源数据内存映象**    出口参数: =0 调用成功*              <0 读资源文件错误*		  ERR_RES_NOFILE	文件未找到*		  ERR_RES_OPENFILE	打开文件出错*		  ERR_RES_MEMORY	没有足够的内存**    实现算法:**    上层调用:**    下层调用:****************************************************************************/short	ReadResourceFile ( char *pRESFileName, char **ppRESBuf ){	FILE	*pfRESFile;	long	lFileSize;	pfRESFile = fopen ( pRESFileName, "rb" );	if ( pfRESFile == (FILE*)NULL )			/* 打开文件错 	*/	  return ( ERR_RES_OPENFILE );	fseek ( pfRESFile, 0, SEEK_END );               /* 计算文件长度	*/	lFileSize = ftell ( pfRESFile );	*ppRESBuf = (char *)malloc ( lFileSize + 1 );	if ( *ppRESBuf == (char *)NULL )		/* 没有足够内存	*/	{	  fclose ( pfRESFile );	  return ( ERR_NOMEMORY );	}	fseek ( pfRESFile, 0, SEEK_SET );		/* 移文件指针	*/	fread ( *ppRESBuf, lFileSize, 1, pfRESFile );	/* 读文件	*/	(*ppRESBuf)[lFileSize] = 0;	fclose ( pfRESFile );				/* 关闭文件	*/	return ( OK );}/*****************************************************************************    函数原型: DoResource ( char *pFileName )**    功    能: 编译资源文件**    编程人员: Zhu haibin**    编码时间: 1994/09/07**    修改时间:**    入口参数: char	*pFileName	文件名**    出口参数: =0 调用成功*              <0 读资源文件错误**    实现算法: 1. 将资源文件读入内存*	       2. 调用 CompileResource 编译资源数据**    上层调用:**    下层调用: ReadResourceFile*	       CompileResource****************************************************************************/short	DoResource ( char *pFileName ){	short	nErrorID;	char	*pRESBuf;	/* 读资源源文件至内存 */	nErrorID = ReadResourceFile ( pFileName, &pRESBuf );	if ( nErrorID < OK )	{	  RCError ( nErrorID );	  return ( nErrorID );	}	/* 创建资源文件 */	if ( ( nErrorID = CreatRESFile ( pRESName ) ) < OK )	  return ( nErrorID );	/* 分析资源数据 */	nErrorID = CompileResource ( &pRESBuf );	if ( nErrorID < OK )	{	  RCError ( nErrorID );	  free ( pRESBuf );	  return ( nErrorID );	}	CloseRESFile ( TRUE );	free ( pRESBuf );	return ( OK );}short	main ( short argc, char *argv[] ){	char	*pTemp;	printf ( "PC-TMCS resource compile v1.0, Copyright 1994.\n" );	if ( argc < 2 )	{	  printf ( "Usage : RC ResourceFileName\n" );	  return ( OK );	}	strcpy ( pRESName, argv[1] );	pTemp = (char*)strrchr ( pRESName, '.' );	if ( pTemp != NULL )	  *pTemp = 0;	strcat ( pRESName, ".res" );	DoResource ( argv[1] );	return ( OK );}

⌨️ 快捷键说明

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