📄 rc.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 + -