/*********************************************************************** * Microsoft (R) Windows (R) Resource Compiler * * Copyright (c) Microsoft Corporation. All rights reserved. * * File Comments: * * ***********************************************************************/ #include #include #include #include #include typedef FILE *PFILE; typedef WCHAR *PWCHAR; typedef USHORT *PUSHORT; typedef SHORT *PSHORT; typedef UINT *PUINT; typedef UCHAR *PUCHAR; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "charmap.h" #include "fcntl.h" #include "getflags.h" #include "grammar.h" #include "rcpptype.h" #include "rcppdecl.h" #include "rcppext.h" #include "p0defs.h" #include "newexe.h" #include "p1types.h" #include "rcdefs.h" #include "rcnewres.h" #include "rcppx.h" #include "rcunicod.h" #include "resfile.h" #include "strings.h" #include "trees.h" #define NULL_FILE ((PFILE) NULL) /* ----- General symbols ----- */ #define VERSION_DUAL 0x202 #define BUFSIZE 16384 #define EOF (-1) #define TRUE 1 #define FALSE 0 /* The ResType field of NewHeader identifies the cursor/icon type */ #define ICONTYPE 1 #define CURSORTYPE 2 /* Identifies the menu item template version number */ #define OLDMENUITEMTEMPLATEVERSIONNUMBER 0 #define OLDMENUITEMTEMPLATEBYTESINHEADER 0 #define MENUITEMTEMPLATEVERSIONNUMBER 1 #define MENUITEMTEMPLATEBYTESINHEADER sizeof(DWORD) //dwHelpID in hdr #define DIFFERENCE 11 /* Predefined resource types */ #define RT_NEWRESOURCE 0x2000 #define RT_ERROR 0x7fff #define RT_NEWBITMAP MAKEINTRESOURCE((DWORD)RT_BITMAP+DIFFERENCE) // These are 'hidden' resources that users never see/use directly. #define RT_MENUEX MAKEINTRESOURCE(15) #define RT_DIALOGEX MAKEINTRESOURCE(18) // These are here only temporary here they should in winuser.w #define RT_ANICURSOR MAKEINTRESOURCE(21) #define RT_ANIICON MAKEINTRESOURCE(22) #define RT_LAST MAKEINTRESOURCE(22) // AFX resource types (Should these be in winuser.h?) #define RT_DLGINIT MAKEINTRESOURCE(240) #define RT_TOOLBAR MAKEINTRESOURCE(241) #define GFE_ZEROINIT 0x0001 #define GFE_SHORT 0x0002 #ifdef MFR_POPUP #if (MFR_POPUP != 0x01) && (MFR_END != 0x80) #error MFR_POPUP or MFR_END definition(s) invalid #endif #else #define MFR_POPUP 0x01 #define MFR_END 0x80 #endif /* Single-byte control class IDs */ #define BUTTONCODE 0x80 #define EDITCODE 0x81 #define STATICCODE 0x82 #define LISTBOXCODE 0x83 #define SCROLLBARCODE 0x84 #define COMBOBOXCODE 0x85 /* Translator flag bits */ #define fVIRTKEY 1 #define fNOINVERT 2 #define fSHIFT 4 #define fCONTROL 8 #define fALT 16 /* Menu flag bits */ #define OPGRAYED 0x0001 #define OPINACTIVE 0x0002 // INACTIVE | GRAYED #define OPBITMAP 0x0004 #define OPOWNERDRAW 0x0100 #define OPUSECHECKBITMAPS 0x0200 #define OPCHECKED 0x0008 #define OPPOPUP 0x0010 #define OPBREAKWBAR 0x0020 #define OPBREAK 0x0040 #define OPENDMENU 0x0080 #define OPHELP 0x4000 #define OPSEPARATOR 0x0800 /*#define OPPOPHELP 0x0004*/ #define wcsdigit(w) (w >= 0x0030 && w <= 0x0039) /* ** dialog & menu template tokens (these start at 40) */ /* buttons */ #define TKRADIOBUTTON 40 #define TKCHECKBOX 41 #define TKPUSHBUTTON 42 #define TKDEFPUSHBUTTON 43 #define TKAUTOCHECK 44 #define TK3STATE 45 #define TKAUTO3 46 #define TKUSERBUTTON 47 #define TKAUTORADIO 48 #define TKOWNERDRAW 50 #define TKGROUPBOX 51 #define TKPUSHBOX 52 /* static/edit */ #define TKBEDIT 57 #define TKHEDIT 58 #define TKIEDIT 59 #define TKEDITTEXT 60 #define TKLTEXT 61 #define TKRTEXT 62 #define TKCTEXT 63 #define TKEDIT 64 #define TKSTATIC 65 #define TKICON 66 #define TKBITMAP 67 /* menu stuff */ #define TKMENU 70 #define TKMENUITEM 71 #define TKSEPARATOR 72 #define TKCHECKED 73 #define TKGRAYED 74 #define TKINACTIVE 75 #define TKBREAKWBAR 76 #define TKBREAK 77 #define TKPOPUP 78 #define TKHELP 79 /* other controls */ #define TKLISTBOX 90 #define TKCOMBOBOX 91 #define TKRCDATA 92 #define TKSCROLLBAR 93 #define TKFONT 94 #define TKBUTTON 95 #define TKMESSAGETABLE 96 /* math expression tokens */ #define TKCLASS 100 #define TKPLUS 101 #define TKMINUS 102 #define TKNOINVERT 103 #define TKNOT 104 #define TKKANJI 105 #define TKSHIFT 106 /* Accel table */ #define TKALT 110 #define TKASCII 111 #define TKVIRTKEY 112 #define TKVALUE 113 #define TKBLOCK 114 /* verison */ #define TKFILEVERSION 120 #define TKPRODUCTVERSION 121 #define TKFILEFLAGSMASK 122 #define TKFILEFLAGS 123 #define TKFILEOS 124 #define TKFILETYPE 125 #define TKFILESUBTYPE 126 /* misc */ #define TKCHARACTERISTICS 130 #define TKLANGUAGE 131 #define TKVERSION 132 #define TKSTYLE 133 #define TKCONTROL 134 #define TKCAPTION 135 #define TKDLGINCLUDE 136 #define TKLSTR 137 #define TKDLGINIT 138 #define TKEXSTYLE 0xf7 /* so as not to conflict with x-coordinate */ /* memory and load flags */ #define TKFIXED 0xfff0 #define TKMOVEABLE 0xfff1 #define TKDISCARD 0xfff2 #define TKLOADONCALL 0xfff3 #define TKPRELOAD 0xfff4 #define TKPURE 0xfff5 #define TKIMPURE 0xfff6 /* special tokens */ #define CHCARRIAGE L'\r' #define CHSPACE L' ' #define CHNEWLINE L'\n' //??#define CHTAB 9 #define CHTAB L'\t' #define CHDIRECTIVE L'#' #define CHQUOTE L'"' #define CHEXTENSION L'.' #define CHCSOURCE L'c' #define CHCHEADER L'h' #define CHCOMMENT L';' #define DEBUGLEX 1 #define DEBUGPAR 2 #define DEBUGGEN 4 /* End of file character/token */ #define EOFMARK 127 /* Single character keywords that we ignore */ #define LPAREN 1 /* ( */ #define RPAREN 2 /* ) */ /* multiple character keywords */ #define FIRSTKWD 11 /* for adding to table indices */ #define OR FIRSTKWD+1 #define BEGIN FIRSTKWD+2 #define END FIRSTKWD+3 #define COMMA FIRSTKWD+4 #define TILDE FIRSTKWD+5 #define AND FIRSTKWD+6 #define EQUAL FIRSTKWD+7 // AFX #define LASTKWD FIRSTKWD+8 // 19 /* Token types */ #define NUMLIT LASTKWD+1 // 20 #define STRLIT LASTKWD+2 #define CHARLIT LASTKWD+3 #define LSTRLIT LASTKWD+4 // AFX /* The following switches, when defined enable various options ** #define DEBUG enables debugging output. Use one or more of the ** values defined above to enable debugging output for different modules */ /* Version number. VERSION and REVISION are used to set the API number ** in an RCed file. SIGNON_* are used just to print the signon banner. ** Changing VERSION and REVISION means that applications RCed with this ** version will not run with earlier versions of Windows. */ //#define VERSION 2 #define REVISION 03 #define SIGNON_VER 4 #define SIGNON_REV 00 /* GetToken() flags */ #define TOKEN_NOEXPRESSION 0x8000 /* Current token structure */ #define MAXSTR (4096+1) // AFX defines this as 255 #define MAXTOKSTR (256+1) // New Menu Template Parsing structures/definitions // New menu template format // // MenuName MENUEX // BEGIN // [MENUITEM "text" [, [id] [, [type] [, [state]]]]] // [POPUP "text" [, [id] [, [type] [, [state] [, [help id]]]]] // BEGIN // [MENUITEM "text" [, [id] [, [type] [, [state]]]]] // ... // END] // ... // END typedef struct tagMENU { DWORD dwID; DWORD dwType; DWORD dwState; DWORD dwHelpID; WORD wResInfo; WCHAR szText[MAXTOKSTR]; } MENU, *PMENU; typedef enum { PT_WORD = 0, PT_DWORD, PT_TEXT } PARSETYPE; typedef enum { PTO_WORD = 0x80, PTO_DWORD, PTO_TEXT } OPARSETYPE; typedef enum { PAR_POPUP = 0, PAR_MENUITEM, PAR_MENU } PARCELTYPE; #define PT_OPTIONAL 0x80 typedef struct tagPARCEL { WORD *pwEnd; BYTE *pwParms; } PARCEL; typedef struct tagKEY { PWCHAR kwd; WORD kwdval; } KEY, *PKEY; typedef struct tagSKEY { WCHAR skwd; UINT skwdval; /* changed from a char */ } SKEY, *PSKEY; #pragma pack(2) typedef struct tagSYMINFO { WCHAR name[MAX_SYMBOL + 1];/* symbol for the resource if available */ WCHAR file[_MAX_PATH]; WORD line; WORD nID; } SYMINFO, *PSYMINFO; typedef struct tagTOKEN { LONG longval; int row; /* line number of current token */ int col; /* column number of current token */ BOOL flongval; /* is parsed number a long? */ USHORT val; UCHAR type; UCHAR realtype; SYMINFO sym; } TOKEN, *PTOKEN; typedef struct tagFONTDIR { USHORT ordinal; USHORT nbyFont; struct tagFONTDIR *next; } FONTDIR, *PFONTDIR; typedef struct tagOBJLST { struct tagOBJLST *next; DWORD nObj; /* objecty number */ DWORD cb; /* number of bytes used */ DWORD cpg; /* number of pages used */ DWORD flags; /* object memory flags */ } OBJLST, *POBJLST; typedef struct tagCTRL { SHORT x; SHORT y; SHORT cx; SHORT cy; WCHAR fOrdinalText; WCHAR text[MAXTOKSTR]; DWORD id; WCHAR Class[MAXTOKSTR]; DWORD dwStyle; DWORD dwExStyle; DWORD dwHelpID; } CTRL, *PCTRL; typedef struct tagDLGHDR { SHORT x; SHORT y; SHORT cx; SHORT cy; UCHAR fOrdinalMenu; UCHAR fClassOrdinal; DWORD dwStyle; DWORD dwExStyle; WORD bNumberOfItems; WCHAR Title[MAXTOKSTR]; WCHAR MenuName[MAXTOKSTR]; WCHAR Class[MAXTOKSTR]; WCHAR Font[MAXTOKSTR]; WORD pointsize; WORD wWeight; BYTE bItalic; BYTE bCharSet; DWORD dwHelpID; } DLGHDR, *PDLGHDR; typedef struct tagMENUHDR { USHORT menuTemplateVersionNumber; USHORT menuTemplateBytesInHeader; } MENUHDR, *PMENUHDR; typedef struct tagMENUITEM { SHORT id; WCHAR szText[ MAXTOKSTR ]; WORD OptFlags; WORD PopFlag; } MENUITEM, *PMENUITEM; #define BLOCKSIZE 16 typedef struct tagRCSTRING { struct tagRCSTRING *next; DWORD version; DWORD characteristics; USHORT hibits; SHORT flags; WORD language; PWCHAR rgsz[ BLOCKSIZE ]; PSYMINFO rgsym[ BLOCKSIZE ]; } RCSTRING, *PRCSTRING; typedef struct tagRCACCEL { WORD flags; WCHAR ascii; USHORT id; USHORT unused; } RCACCEL, *PRCACCEL; typedef struct tagRESINFO { DWORD version; DWORD characteristics; LONG exstyleT; LONG BinOffset; LONG size; struct tagRESINFO *next; WORD *poffset; PWCHAR name; POBJLST pObjLst; WORD language; SHORT flags; USHORT nameord; USHORT cLang; SYMINFO sym; } RESINFO, *PRESINFO; typedef struct tagTYPEINFO { struct tagTYPEINFO *next; PRESINFO pres; PWCHAR type; USHORT typeord; USHORT cTypeStr; USHORT cNameStr; SHORT nres; } TYPEINFO, *PTYPEINFO; #pragma pack() /* ----- Global variables ----- */ extern SHORT ResCount; extern PTYPEINFO pTypInfo; extern UINT uiDefaultCodePage; extern UINT uiCodePage; extern SHORT nFontsRead; extern PFONTDIR pFontList; extern PFONTDIR pFontLast; extern TOKEN token; extern int errorCount; extern WCHAR tokenbuf[MAXSTR + 1]; // +1 is to allow double sz termination extern wchar_t exename[_MAX_PATH]; extern wchar_t fullname[_MAX_PATH]; extern wchar_t curFile[_MAX_PATH]; extern WORD language; extern LONG version; extern LONG characteristics; extern PDLGHDR pLocDlg; extern UINT mnEndFlagLoc; /* patch location for end of a menu. */ /* we set the high order bit there */ extern BOOL fVerbose; /* verbose mode (-v) */ extern BOOL fAFXSymbols; extern BOOL fMacRsrcs; extern BOOL fAppendNull; extern BOOL fWarnInvalidCodePage; extern BOOL fSkipDuplicateCtlIdWarning; extern long lOffIndex; extern WORD idBase; extern wchar_t *szTempFileName; extern wchar_t *szTempFileName2; extern wchar_t inname[_MAX_PATH]; extern PFILE fhBin; extern PFILE fhInput; extern PFILE fhCode; extern wchar_t *pchInclude; extern SHORT k1,k2,k3,k4; extern PRESINFO pResString; extern HINSTANCE hInstance; extern HANDLE hHeap; extern int nBogusFontNames; extern WCHAR *pszBogusFontNames[16]; extern WCHAR szSubstituteFontName[MAXTOKSTR]; /*---------------------------------------------------------------------------*/ /* */ /* rcl.c */ /* */ /*---------------------------------------------------------------------------*/ USHORT FindKwd(PWCHAR); WCHAR GetCharFTB(); PWSTR GetWord(PWSTR); LONG GetDNum(); LONG GetExpression(); PWCHAR GetGenText(); int GetKwd(int); int GetNameOrd(); VOID GetNum(); VOID GetNumFTB(); VOID GetNumNoExpression(); LONG GetONum(); LONG GetOperand(); int GetOperator(PWCHAR pOperator); VOID GetStr(); int GetToken(int); LONG GetXNum(); void LexError1(int iMsg); void LexError2(int iMsg, const wchar_t *str); int LexInit(PFILE); WCHAR LitChar(); WCHAR OurGetChar(); VOID SkipWhitespace(); /*---------------------------------------------------------------------------*/ /* */ /* rcp.c */ /* */ /*---------------------------------------------------------------------------*/ VOID AddBinEntry(PTYPEINFO, PRESINFO, PCHAR , int, LONG); VOID AddDefaultTypes(); VOID AddFontDir(); VOID AddResToResFile (PTYPEINFO, PRESINFO, PCHAR, int, LONG); PTYPEINFO AddResType (PWCHAR, LPWSTR); VOID AddStringToBin(USHORT, PWCHAR); int DGetMemFlags(PRESINFO); LONG GetFileName (VOID); VOID ParseError1(int); VOID ParseError2(int, PWCHAR); // AFX has 1&2 -- NT just has ParseError VOID ParseError3(int); int ReadRF(VOID); WORD GetLanguage(VOID); /*---------------------------------------------------------------------------*/ /* */ /* rcstring.c */ /* */ /*---------------------------------------------------------------------------*/ VOID WriteTable (PRESINFO); int GetAccelerators (PRESINFO); PRESINFO GetTable (PRESINFO); void * MyFAlloc(size_t, const void *); /*---------------------------------------------------------------------------*/ /* */ /* rctg.c */ /* */ /*---------------------------------------------------------------------------*/ DWORD GetNewBitmap(void); BOOL AddFontRes(PRESINFO); VOID AppendString(PWCHAR, BOOL); VOID CtlAlloc(); PFILE CtlFile(PFILE); VOID CtlFree(); VOID CtlInit(); VOID FixMenuPatch(); VOID GenWarning2(int iMsg, const wchar_t *arg); VOID GenWarning4(int iMsg, const wchar_t *arg1, const wchar_t *arg2, const wchar_t *arg3); VOID GenError1(int iMsg); VOID GenError2(int iMsg, const wchar_t *arg); WORD GetBufferLen(); void SetItemCount(int Index, USHORT wCount); USHORT GetItemCount(int Index); DWORD GetIcon(LONG); DWORD GetAniIconsAniCursors(LONG nbyFile); DWORD FileIsAnimated(LONG nbyFile); VOID GetNewIconsCursors(PTYPEINFO, PRESINFO, LPWSTR); WORD GetRCData(PRESINFO); void * GetSpace(WORD cb); VOID IncItemCount(); VOID SwapItemCount(VOID); void FixMenuPatch (WORD); void FixOldMenuPatch (WORD); VOID MarkAccelFlagsByte(); VOID MarkMenuPatch(); VOID PatchAccelEnd(); LONG ResourceSize(); VOID SaveResFile(PTYPEINFO, PRESINFO); void SetItemExtraCount(WORD, BOOL); void SetUpDlg (PDLGHDR, BOOL); void SetUpItem (PCTRL, BOOL); WORD SetUpMenu (PMENU); WORD SetUpOldMenu (PMENUITEM); VOID WriteAlign(); void WriteBuffer(const void *, size_t); int WriteControl(PFILE, PCHAR, int, LONG); VOID WriteString(PWCHAR, BOOL); VOID WriteMacString(PWCHAR sz, BOOL fMacCP, BOOL fPascal); int ExpandString(BYTE* pb, int cb, BYTE* pbExpand); WORD SwapWord(WORD w); DWORD SwapLong(DWORD dw); #define SwappedWord(w) (fMacRsrcs ? SwapWord(w) : (w)) #define SwappedLong(dw) (fMacRsrcs ? SwapLong(dw) : (dw)) #define WriteByte(b) (*(BYTE *) GetSpace(sizeof(BYTE)) = b) #define WriteLong(dw) (*(DWORD UNALIGNED *) GetSpace(sizeof(DWORD)) = SwappedLong(dw)) #define WriteWord(w) (*(WORD UNALIGNED *) GetSpace(sizeof(WORD)) = SwappedWord(w)) /*---------------------------------------------------------------------------*/ /* */ /* rctp.c */ /* */ /*---------------------------------------------------------------------------*/ #define GFE_ZEROINIT 0x0001 #define GFE_SHORT 0x0002 void DGetClassName (PDLGHDR); void DGetFont (PDLGHDR, BOOL); void DGetMenuName (PDLGHDR); void DGetTitle (PDLGHDR); BOOL DLexOptionalArgs(PRESINFO, PDLGHDR, BOOL); void DlgIncludeParse (PRESINFO); // new for NT WORD DoMenuItem (int); void GetCoords (PSHORT, PSHORT, PSHORT, PSHORT); VOID GetCtlCoords (PCTRL); VOID GetCtlID (PCTRL, BOOL); VOID GetCtlText (PCTRL); int GetDlg (PRESINFO, PDLGHDR, BOOL); int GetDlgItems (BOOL); BOOL GetFullExpression(void *pval, WORD wFlags); USHORT GetTokenNoComma (USHORT wFlags); USHORT ICGetTok (); int IsmnOption (UINT, PMENUITEM); VOID ParseCtl (PCTRL, BOOL); int ParseMenu (int, PRESINFO); int ParseOldMenu (int, PRESINFO); int VersionBlockStruct(PWCHAR pstrKey, PCHAR pstrValue, USHORT LenValue); int VersionBlockVariable(PWCHAR pstrKey); VOID VersionGet4Words(PDWORD pdw); VOID VersionGetDWord(PDWORD pdw); int VersionParse(); USHORT VersionParseBlock(); int VersionParseFixed(); USHORT VersionParseValue(int IndexType); // void arg list in AFX int GetToolbar (PRESINFO); /*---------------------------------------------------------------------------*/ /* */ /* rcutil.c */ /* */ /*---------------------------------------------------------------------------*/ VOID ExtractFileName(const wchar_t *, wchar_t *); int iswhite(WCHAR); BOOL IsSwitchChar(wchar_t); UINT MyAlign(PFILE); PVOID MyAlloc(size_t); size_t MyCopy(PFILE, PFILE, size_t); int MyCopyAll(PFILE, PFILE); void MyFree(PVOID); PWCHAR MyMakeStr(const wchar_t *); size_t MyRead(PFILE, void *, size_t); LONG MySeek(PFILE, LONG, int); size_t MyWrite(PFILE, const void *, size_t); VOID PreBeginParse(PRESINFO, int); VOID quit(const wchar_t *); int strpre (const wchar_t *, const wchar_t *); DWORD wcsatoi(const wchar_t *); PWCHAR wcsitow(LONG v, PWCHAR s, DWORD r); /*---------------------------------------------------------------------------*/ /* */ /* rcfutil.c */ /* */ /*---------------------------------------------------------------------------*/ int fgetl (PWCHAR, int, BOOL, PFILE); /* ----- AFX Functionality ----- */ #include "rcppx.h" LONG MakeFontDir(); // AFX only void DoMessageCallback(BOOL, const wchar_t *); void SendWarning(const wchar_t *); void SendError(const wchar_t *); extern RC_MESSAGE_CALLBACK lpfnMessageCallbackA; extern RC_MESSAGE_CALLBACKW lpfnMessageCallbackW; extern RC_PARSE_CALLBACK lpfnParseCallbackA; extern RC_PARSE_CALLBACKW lpfnParseCallbackW; extern BOOL fWindowUnicode; extern HWND hWndCaller; void GetSymbolDef(int fReportError, WCHAR curChar); void GetSymbol(int fReportError, WCHAR curChar); BOOL InitSymbolInfo(); BOOL TermSymbolInfo(PFILE fhresFile); void WriteSymbolUse(PSYMINFO sym); void WriteSymbolDef(PWCHAR name, PWCHAR value, PWCHAR file, WORD line, char flags); void WriteFileInfo(PRESINFO pRes, PTYPEINFO pType, PWCHAR szFileName); void WriteResInfo(PRESINFO pRes, PTYPEINFO pType, BOOL bWriteMapEntry); void WriteResIndex(PRESINFO pRes, PTYPEINFO pType); void UpdateStatus(unsigned nCode, unsigned long dwStatus); // offset in a macintosh resource file of the start of the resource data #define MACDATAOFFSET 256 void GetMacIcon(TYPEINFO *pType, RESINFO *pRes); void GetMacCursor(TYPEINFO *pType, RESINFO *pRes); void WriteMacMap(void); BOOL IsIcon(TYPEINFO* ptype); #define res_type(ch1,ch2,ch3,ch4) (((unsigned long)(unsigned char)(ch1)<<24)| \ ((unsigned long)(unsigned char)(ch2)<<16)| \ ((unsigned long)(unsigned char)(ch3)<<8)| \ ((unsigned long)(unsigned char)(ch4)))