| Release 1.1.8 of wrc (24-Aug-2000), the wine resource compiler. | |
| See the file CHANGES for differences between the version and what has been | |
| corrected in the current version. | |
| Wrc features: | |
| - full source preprocessing | |
| - 16 and 32 bit support | |
| - LANGUAGE support (32 bit only) | |
| - most resource types are supported | |
| - enhanced expression capabilities and resource naming | |
| - indirect loadable resources | |
| - NE/PE resource directory generation | |
| - binary .res file generation/reading | |
| - byte-order conversions | |
| Wrc generates an assembly file that can be assembled with GNU's gas, or | |
| passed to gcc. The assembly became necessary for two reasons. First, C does | |
| not ensure relative position of declared data. Secondly, C complaints about | |
| complex initialization schemes that became necessary with the NE/PE | |
| directory generation. | |
| Wrc command-line | |
| ---------------- | |
| You can get this message by typing 'wrc -?': | |
| Usage: wrc [options...] [infile[.rc|.res]] | |
| -a n Alignment of resource (win16 only, default is 4) | |
| -A Auto register resources (only with gcc 2.7 and better) | |
| -b Create a C array from a binary .res file | |
| -c Add 'const' prefix to C constants | |
| -C cp Set the resource's codepage to cp (default is 0) | |
| -d n Set debug level to 'n' | |
| -D id[=val] Define preprocessor identifier id=val | |
| -e Disable recognition of win32 keywords in 16bit compile | |
| -E Preprocess only | |
| -g Add symbols to the global c namespace | |
| -h Also generate a .h file | |
| -H file Same as -h but written to file | |
| -I path Set include search dir to path (multiple -I allowed) | |
| -l lan Set default language to lan (default is neutral {0, 0}) | |
| -L Leave case of embedded filenames as is | |
| -m Do not remap numerical resource IDs | |
| -n Do not generate .s file | |
| -N Do not preprocess input | |
| -o file Output to file (default is infile.[res|s|h] | |
| -p prefix Give a prefix for the generated names | |
| -r Create binary .res file (compile only) | |
| -s Add structure with win32/16 (PE/NE) resource directory | |
| -t Generate indirect loadable resource tables | |
| -T Generate only indirect loadable resources tables | |
| -V Print version end exit | |
| -w 16|32 Select win16 or win32 output (default is win32) | |
| -W Enable pedantic warnings | |
| Input is taken from stdin if no sourcefile specified. | |
| Debug level 'n' is a bitmask with following meaning: | |
| * 0x01 Tell which resource is parsed (verbose mode) | |
| * 0x02 Dump internal structures | |
| * 0x04 Create a parser trace (yydebug=1) | |
| * 0x08 Preprocessor messages | |
| * 0x10 Preprocessor lex messages | |
| * 0x20 Preprocessor yacc trace | |
| The -o option only applies to the final destination file, which is | |
| in case of normal compile a .s file. You must use the '-H header.h' | |
| option to override the header-filename. | |
| If no input filename is given and the output name is not overridden | |
| with -o and/or -H, then the output is written to "wrc.tab.[sh]" | |
| For more info see the wrc manpage. | |
| Preprocessing | |
| ------------- | |
| The preprocessor is a fully operational C preprocessor. It handles all | |
| directives supported by ANSI-C. It also includes some additions from | |
| gcc/egcs. | |
| Wrc understands these directives: | |
| #define (both simple and macro) | |
| #undef | |
| #if | |
| #ifdef | |
| #ifndef | |
| #elif | |
| #else | |
| #endif | |
| #error | |
| #warning | |
| #line | |
| # | |
| #pragma (ignored) | |
| #ident (ignored) | |
| The extensions include '#'-line directives. | |
| Not handled at the moment are variable argument macros. They are parsed, | |
| but not expanded properly. This will be corrected in the future. | |
| The preprocessor handles the special defines and aditionally defines an | |
| extra set of defines: | |
| Define | Value | Comment | |
| ---------------+---------------+--------------- | |
| RC_INVOKED | 1 | Always defined | |
| __FLAT__ | 1 | Only defined if win32 compile | |
| __WIN32__ | 1 | Only defined if win32 compile | |
| __FILE__ | "..." | Current filename as string | |
| __LINE__ | nnn | Current linenumber as integer | |
| __TIME__ | "23:59:59" | Timestring of compilation | |
| __DATE__ | "May 1 2000" | Datestring of compilation | |
| __WRC__ | 1 | Wrc's major version | |
| __WRC_MINOR__ | 1 | Wrc's minor version | |
| __WRC_MICRO__ | 7 | Wrc's minor version | |
| __WRC_PATCH__ | 8 | Alias of __WRC_MICRO__ | |
| Include-files are not read twice if they are protected with this scheme: | |
| #ifndef SOME_DEFINE | |
| #define SOME_DEFINE | |
| ... | |
| #endif | |
| This strategy has been borrowed from gcc/egcs and results in significantly | |
| reduced preprocessing times (20..30%). There must not be any junk before | |
| the first #ifndef and not after the last #endif; comments and whitespace | |
| excepted. Wrc will check the existance of the define prior to inclusion to | |
| detect "#undef SOME_DEFINE" (notably poppack.h) and act accordingly. | |
| 16 and 32 bit support | |
| --------------------- | |
| All of wrc is layed out in such a way that it enables compilation of both 16 | |
| and 32 bit resources. They mainly differ in code-generation and extra | |
| keywords. Win32 keywords are recognized by default in 16 bit compile. You | |
| can disable recognition of win32 reserved keywords by using the '-e' option, | |
| if you encounter .rc-files that use win32 reserved keywords (I strongly | |
| recommend that you just rename things in the source). | |
| Language support | |
| ---------------- | |
| Wrc also understands the LANGUAGE keyword (win32 only) for both global and | |
| local definitions of language. There are differences with respect to MS' and | |
| Borland's implementation. Wrc uses 0,0 as the default language if non is | |
| specified. Both MS and Borland use the language of the system that the | |
| compiler runs on. | |
| Language, version and characteristics can be bound to all resource types that | |
| have inline data, such as RCDATA. This is an extension to MS' resource | |
| compiler, which lacks this support completely. Only VERSIONINFO cannot have | |
| version and characteristics attached, but languages are propagated properly if | |
| you declare it correctly before the VERSIONINFO resource starts. | |
| Example: | |
| 1 RCDATA DISCARDABLE | |
| LANGUAGE 1, 0 | |
| VERSION 312 | |
| CHARACTERISTICS 876 | |
| { | |
| 1, 2, 3, 4, 5, "and whatever more data you want" | |
| '00 01 02 03 04 05 06 07 08' | |
| } | |
| Resource types supported | |
| ------------------------ | |
| All types are supported except for: | |
| - RT_VXD | |
| - RT_PLUGPLAY | |
| - RT_HTML | |
| - RT_DLGINCLUDE | |
| These types will be implemented as soon as I get a proper specification of | |
| the layout. | |
| Font type resources (RT_FONT, RT_FONTDIR) are partially supported and will | |
| be enhanced when I have the complete spec. The font resources work only if | |
| you supply the FONTDIR resource yourself. | |
| Expression capabilities and resource names | |
| ------------------------------------------ | |
| You can use an expression in most places where the resource definition | |
| expects a number (except usertype type). Operators supported: | |
| () parenthesis | |
| * multiply | |
| / divide | |
| + plus/add | |
| - minus/substract | |
| | binary or | |
| & binary and | |
| ~ binary not (unary operator though) | |
| NOT ... (sigh) | |
| Plus (+) and minus (-) can both be unary and binary. The NOT operator is | |
| (primarily) used to disable window styles but I strongly suggest to refrain | |
| from using this operator. | |
| Resource names can be both numerical (expressions) and character typed. Wrc | |
| does support this insane (deep sigh) construct: | |
| MENU MENU | |
| { | |
| ... | |
| } | |
| It is _ONLY_ supported for backwards compatibility so that old sources can | |
| be compiled with winelib. DO NOT USE IT IN NEW RESOURCES, PLEASE! | |
| Indirect loadable resources | |
| --------------------------- | |
| Wrc can generate tables for indirect resource loading like winerc did. There | |
| are two new structures defined in 'wine-base-dir/include/wrc_rsc.h': | |
| typedef struct wrc_resource16 | |
| { | |
| INT32 resid; /* The resource id if resname == NULL */ | |
| LPSTR resname; | |
| INT32 restype; /* The resource type-id if typename == NULL */ | |
| LPSTR typename; | |
| LPBYTE data; /* Actual resource data */ | |
| UINT32 datasize; /* The size of the resource */ | |
| } wrc_resource16_t; | |
| typedef struct wrc_resource32 | |
| { | |
| INT32 resid; /* The resource id if resname == NULL */ | |
| LPWSTR resname; | |
| INT32 restype; /* The resource type-id if typename == NULL */ | |
| LPWSTR typename; | |
| LPBYTE data; /* Actual resource data */ | |
| UINT32 datasize; /* The size of the resource */ | |
| } wrc_resource32_t; | |
| The extension to winerc lies in the addition of the 'typename' field to | |
| support usertype resoursec with names for types. | |
| Note that _ALL_ names generated by wrc and to be used in interfacing with | |
| wine are PASCAL-style strings, unlike winerc. The first element contains the | |
| length and the strings are _not_ '\0'-terminated! | |
| You can also generate header files with wrc when specifying the '-h' or | |
| '-H<filename>' option. | |
| NE/PE resource directory generation | |
| ----------------------------------- | |
| A windows executable has a table/directory of resources avalable in that | |
| module. Wrc will generate this directory with the '-s' option and place it | |
| in the assembly output (and header-file). This will enable the separation | |
| of different modules (dlls) in wine, which is the next project after wrc. | |
| The layout of the PE directory should be exactly like the executable file. | |
| The NE-directory layout _DIFFERS_ from the real NE-executable in such way | |
| that all offsets to actual resource-data is relative to the NE-directory and | |
| _NOT_ the beginning of the file. | |
| Binary .res file generation/reading | |
| ----------------------------------- | |
| Wrc can both generate (32 and 16 bit) and read (32 bit only) .res-files. | |
| These can be used as intermediate files or binary files can be imported from | |
| other sources. The reading of 16 bit .res-files is on the list for the next | |
| release. | |
| You cannot convert 32 bit .res-files into 16 bit output or vice versa. I | |
| might implement 16 bit res into 32 bit output in the future, but I stronly | |
| oppose to the other way arround. | |
| Bugs | |
| ---- | |
| Inherent to programs you have bugs. These I know are there, plus a few | |
| things that I noted in the above text (more lack of implementation than bug | |
| though): | |
| - No codepage translation | |
| - UNICODE translations are not/not correct implemented | |
| - No documentation ('wrc -?' gives command-line options and a manpage) | |
| - grep for FIXME in the source | |
| - Memory options are wrong under some conditions. There seems to be a | |
| different action for win32 and win16 | |
| - PUSHBOX control is unsupported. The MS docs use it plenty, but neither | |
| MS' nor Borland's compiler supports it. | |
| Reporting bugs and patches | |
| -------------------------- | |
| Send problems to the wine newsgroup or, preferrably, directly to me at: | |
| bertho@akhphd.au.dk | |
| Please send the problematic rc-source with the bug so I can reproduce it. | |
| Patches should _not_ be send to Alexandre but to me. I will then review the | |
| change and send a full patch to be included into the new wine release (I | |
| prefer 'diff -u' format). You can always upload suggestions to wine | |
| headquarters, but be sure to send me a copy. | |