?? 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 + -