| 1 | Release 1.1.8 of wrc (24-Aug-2000), the wine resource compiler. | 
|---|
| 2 |  | 
|---|
| 3 | See the file CHANGES for differences between the version and what has been | 
|---|
| 4 | corrected in the current version. | 
|---|
| 5 |  | 
|---|
| 6 | Wrc features: | 
|---|
| 7 |  | 
|---|
| 8 | - full source preprocessing | 
|---|
| 9 | - 16 and 32 bit support | 
|---|
| 10 | - LANGUAGE support (32 bit only) | 
|---|
| 11 | - most resource types are supported | 
|---|
| 12 | - enhanced expression capabilities and resource naming | 
|---|
| 13 | - indirect loadable resources | 
|---|
| 14 | - NE/PE resource directory generation | 
|---|
| 15 | - binary .res file generation/reading | 
|---|
| 16 | - byte-order conversions | 
|---|
| 17 |  | 
|---|
| 18 | Wrc generates an assembly file that can be assembled with GNU's gas, or | 
|---|
| 19 | passed to gcc. The assembly became necessary for two reasons. First, C does | 
|---|
| 20 | not ensure relative position of declared data. Secondly, C complaints about | 
|---|
| 21 | complex initialization schemes that became necessary with the NE/PE | 
|---|
| 22 | directory generation. | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 | Wrc command-line | 
|---|
| 26 | ---------------- | 
|---|
| 27 | You can get this message by typing 'wrc -?': | 
|---|
| 28 |  | 
|---|
| 29 | Usage: wrc [options...] [infile[.rc|.res]] | 
|---|
| 30 | -a n        Alignment of resource (win16 only, default is 4) | 
|---|
| 31 | -A          Auto register resources (only with gcc 2.7 and better) | 
|---|
| 32 | -b          Create a C array from a binary .res file | 
|---|
| 33 | -c          Add 'const' prefix to C constants | 
|---|
| 34 | -C cp       Set the resource's codepage to cp (default is 0) | 
|---|
| 35 | -d n        Set debug level to 'n' | 
|---|
| 36 | -D id[=val] Define preprocessor identifier id=val | 
|---|
| 37 | -e          Disable recognition of win32 keywords in 16bit compile | 
|---|
| 38 | -E          Preprocess only | 
|---|
| 39 | -g          Add symbols to the global c namespace | 
|---|
| 40 | -h          Also generate a .h file | 
|---|
| 41 | -H file     Same as -h but written to file | 
|---|
| 42 | -I path     Set include search dir to path (multiple -I allowed) | 
|---|
| 43 | -l lan      Set default language to lan (default is neutral {0, 0}) | 
|---|
| 44 | -L          Leave case of embedded filenames as is | 
|---|
| 45 | -m          Do not remap numerical resource IDs | 
|---|
| 46 | -n          Do not generate .s file | 
|---|
| 47 | -N          Do not preprocess input | 
|---|
| 48 | -o file     Output to file (default is infile.[res|s|h] | 
|---|
| 49 | -p prefix   Give a prefix for the generated names | 
|---|
| 50 | -r          Create binary .res file (compile only) | 
|---|
| 51 | -s          Add structure with win32/16 (PE/NE) resource directory | 
|---|
| 52 | -t          Generate indirect loadable resource tables | 
|---|
| 53 | -T          Generate only indirect loadable resources tables | 
|---|
| 54 | -V          Print version end exit | 
|---|
| 55 | -w 16|32    Select win16 or win32 output (default is win32) | 
|---|
| 56 | -W          Enable pedantic warnings | 
|---|
| 57 |  | 
|---|
| 58 | Input is taken from stdin if no sourcefile specified. | 
|---|
| 59 |  | 
|---|
| 60 | Debug level 'n' is a bitmask with following meaning: | 
|---|
| 61 | * 0x01 Tell which resource is parsed (verbose mode) | 
|---|
| 62 | * 0x02 Dump internal structures | 
|---|
| 63 | * 0x04 Create a parser trace (yydebug=1) | 
|---|
| 64 | * 0x08 Preprocessor messages | 
|---|
| 65 | * 0x10 Preprocessor lex messages | 
|---|
| 66 | * 0x20 Preprocessor yacc trace | 
|---|
| 67 |  | 
|---|
| 68 | The -o option only applies to the final destination file, which is | 
|---|
| 69 | in case of normal compile a .s file. You must use the '-H header.h' | 
|---|
| 70 | option to override the header-filename. | 
|---|
| 71 | If no input filename is given and the output name is not overridden | 
|---|
| 72 | with -o and/or -H, then the output is written to "wrc.tab.[sh]" | 
|---|
| 73 |  | 
|---|
| 74 | For more info see the wrc manpage. | 
|---|
| 75 |  | 
|---|
| 76 |  | 
|---|
| 77 | Preprocessing | 
|---|
| 78 | ------------- | 
|---|
| 79 | The preprocessor is a fully operational C preprocessor. It handles all | 
|---|
| 80 | directives supported by ANSI-C. It also includes some additions from | 
|---|
| 81 | gcc/egcs. | 
|---|
| 82 | Wrc understands these directives: | 
|---|
| 83 | #define         (both simple and macro) | 
|---|
| 84 | #undef | 
|---|
| 85 | #if | 
|---|
| 86 | #ifdef | 
|---|
| 87 | #ifndef | 
|---|
| 88 | #elif | 
|---|
| 89 | #else | 
|---|
| 90 | #endif | 
|---|
| 91 | #error | 
|---|
| 92 | #warning | 
|---|
| 93 | #line | 
|---|
| 94 | # | 
|---|
| 95 | #pragma         (ignored) | 
|---|
| 96 | #ident          (ignored) | 
|---|
| 97 |  | 
|---|
| 98 | The extensions include '#'-line directives. | 
|---|
| 99 | Not handled at the moment are variable argument macros. They are parsed, | 
|---|
| 100 | but not expanded properly. This will be corrected in the future. | 
|---|
| 101 |  | 
|---|
| 102 | The preprocessor handles the special defines and aditionally defines an | 
|---|
| 103 | extra set of defines: | 
|---|
| 104 | Define       | Value         | Comment | 
|---|
| 105 | ---------------+---------------+--------------- | 
|---|
| 106 | RC_INVOKED     | 1             | Always defined | 
|---|
| 107 | __FLAT__       | 1             | Only defined if win32 compile | 
|---|
| 108 | __WIN32__      | 1             | Only defined if win32 compile | 
|---|
| 109 | __FILE__       | "..."         | Current filename as string | 
|---|
| 110 | __LINE__       | nnn           | Current linenumber as integer | 
|---|
| 111 | __TIME__       | "23:59:59"    | Timestring of compilation | 
|---|
| 112 | __DATE__       | "May  1 2000" | Datestring of compilation | 
|---|
| 113 | __WRC__        | 1             | Wrc's major version | 
|---|
| 114 | __WRC_MINOR__  | 1             | Wrc's minor version | 
|---|
| 115 | __WRC_MICRO__  | 7             | Wrc's minor version | 
|---|
| 116 | __WRC_PATCH__  | 8             | Alias of __WRC_MICRO__ | 
|---|
| 117 |  | 
|---|
| 118 | Include-files are not read twice if they are protected with this scheme: | 
|---|
| 119 | #ifndef SOME_DEFINE | 
|---|
| 120 | #define SOME_DEFINE | 
|---|
| 121 | ... | 
|---|
| 122 | #endif | 
|---|
| 123 | This strategy has been borrowed from gcc/egcs and results in significantly | 
|---|
| 124 | reduced preprocessing times (20..30%). There must not be any junk before | 
|---|
| 125 | the first #ifndef and not after the last #endif; comments and whitespace | 
|---|
| 126 | excepted. Wrc will check the existance of the define prior to inclusion to | 
|---|
| 127 | detect "#undef SOME_DEFINE" (notably poppack.h) and act accordingly. | 
|---|
| 128 |  | 
|---|
| 129 |  | 
|---|
| 130 | 16 and 32 bit support | 
|---|
| 131 | --------------------- | 
|---|
| 132 | All of wrc is layed out in such a way that it enables compilation of both 16 | 
|---|
| 133 | and 32 bit resources. They mainly differ in code-generation and extra | 
|---|
| 134 | keywords. Win32 keywords are recognized by default in 16 bit compile. You | 
|---|
| 135 | can disable recognition of win32 reserved keywords by using the '-e' option, | 
|---|
| 136 | if you encounter .rc-files that use win32 reserved keywords (I strongly | 
|---|
| 137 | recommend that you just rename things in the source). | 
|---|
| 138 |  | 
|---|
| 139 |  | 
|---|
| 140 | Language support | 
|---|
| 141 | ---------------- | 
|---|
| 142 | Wrc also understands the LANGUAGE keyword (win32 only) for both global and | 
|---|
| 143 | local definitions of language. There are differences with respect to MS' and | 
|---|
| 144 | Borland's implementation. Wrc uses 0,0 as the default language if non is | 
|---|
| 145 | specified. Both MS and Borland use the language of the system that the | 
|---|
| 146 | compiler runs on. | 
|---|
| 147 |  | 
|---|
| 148 | Language, version and characteristics can be bound to all resource types that | 
|---|
| 149 | have inline data, such as RCDATA. This is an extension to MS' resource | 
|---|
| 150 | compiler, which lacks this support completely. Only VERSIONINFO cannot have | 
|---|
| 151 | version and characteristics attached, but languages are propagated properly if | 
|---|
| 152 | you declare it correctly before the VERSIONINFO resource starts. | 
|---|
| 153 |  | 
|---|
| 154 | Example: | 
|---|
| 155 |  | 
|---|
| 156 | 1 RCDATA DISCARDABLE | 
|---|
| 157 | LANGUAGE 1, 0 | 
|---|
| 158 | VERSION 312 | 
|---|
| 159 | CHARACTERISTICS 876 | 
|---|
| 160 | { | 
|---|
| 161 | 1, 2, 3, 4, 5, "and whatever more data you want" | 
|---|
| 162 | '00 01 02 03 04 05 06 07 08' | 
|---|
| 163 | } | 
|---|
| 164 |  | 
|---|
| 165 |  | 
|---|
| 166 | Resource types supported | 
|---|
| 167 | ------------------------ | 
|---|
| 168 | All types are supported except for: | 
|---|
| 169 | - RT_VXD | 
|---|
| 170 | - RT_PLUGPLAY | 
|---|
| 171 | - RT_HTML | 
|---|
| 172 | - RT_DLGINCLUDE | 
|---|
| 173 |  | 
|---|
| 174 | These types will be implemented as soon as I get a proper specification of | 
|---|
| 175 | the layout. | 
|---|
| 176 |  | 
|---|
| 177 | Font type resources (RT_FONT, RT_FONTDIR) are partially supported and will | 
|---|
| 178 | be enhanced when I have the complete spec. The font resources work only if | 
|---|
| 179 | you supply the FONTDIR resource yourself. | 
|---|
| 180 |  | 
|---|
| 181 |  | 
|---|
| 182 | Expression capabilities and resource names | 
|---|
| 183 | ------------------------------------------ | 
|---|
| 184 | You can use an expression in most places where the resource definition | 
|---|
| 185 | expects a number (except usertype type). Operators supported: | 
|---|
| 186 | ()      parenthesis | 
|---|
| 187 | *       multiply | 
|---|
| 188 | /       divide | 
|---|
| 189 | +       plus/add | 
|---|
| 190 | -       minus/substract | 
|---|
| 191 | |       binary or | 
|---|
| 192 | &       binary and | 
|---|
| 193 | ~       binary not (unary operator though) | 
|---|
| 194 | NOT     ... (sigh) | 
|---|
| 195 |  | 
|---|
| 196 | Plus (+) and minus (-) can both be unary and binary. The NOT operator is | 
|---|
| 197 | (primarily) used to disable window styles but I strongly suggest to refrain | 
|---|
| 198 | from using this operator. | 
|---|
| 199 |  | 
|---|
| 200 | Resource names can be both numerical (expressions) and character typed. Wrc | 
|---|
| 201 | does support this insane (deep sigh) construct: | 
|---|
| 202 |  | 
|---|
| 203 | MENU MENU | 
|---|
| 204 | { | 
|---|
| 205 | ... | 
|---|
| 206 | } | 
|---|
| 207 |  | 
|---|
| 208 | It is _ONLY_ supported for backwards compatibility so that old sources can | 
|---|
| 209 | be compiled with winelib. DO NOT USE IT IN NEW RESOURCES, PLEASE! | 
|---|
| 210 |  | 
|---|
| 211 |  | 
|---|
| 212 | Indirect loadable resources | 
|---|
| 213 | --------------------------- | 
|---|
| 214 |  | 
|---|
| 215 | Wrc can generate tables for indirect resource loading like winerc did. There | 
|---|
| 216 | are two new structures defined in 'wine-base-dir/include/wrc_rsc.h': | 
|---|
| 217 |  | 
|---|
| 218 | typedef struct wrc_resource16 | 
|---|
| 219 | { | 
|---|
| 220 | INT32   resid;          /* The resource id if resname == NULL */ | 
|---|
| 221 | LPSTR   resname; | 
|---|
| 222 | INT32   restype;        /* The resource type-id if typename == NULL */ | 
|---|
| 223 | LPSTR   typename; | 
|---|
| 224 | LPBYTE  data;           /* Actual resource data */ | 
|---|
| 225 | UINT32  datasize;       /* The size of the resource */ | 
|---|
| 226 | } wrc_resource16_t; | 
|---|
| 227 |  | 
|---|
| 228 | typedef struct wrc_resource32 | 
|---|
| 229 | { | 
|---|
| 230 | INT32   resid;          /* The resource id if resname == NULL */ | 
|---|
| 231 | LPWSTR  resname; | 
|---|
| 232 | INT32   restype;        /* The resource type-id if typename == NULL */ | 
|---|
| 233 | LPWSTR  typename; | 
|---|
| 234 | LPBYTE  data;           /* Actual resource data */ | 
|---|
| 235 | UINT32  datasize;       /* The size of the resource */ | 
|---|
| 236 | } wrc_resource32_t; | 
|---|
| 237 |  | 
|---|
| 238 | The extension to winerc lies in the addition of the 'typename' field to | 
|---|
| 239 | support usertype resoursec with names for types. | 
|---|
| 240 |  | 
|---|
| 241 | Note that _ALL_ names generated by wrc and to be used in interfacing with | 
|---|
| 242 | wine are PASCAL-style strings, unlike winerc. The first element contains the | 
|---|
| 243 | length and the strings are _not_ '\0'-terminated! | 
|---|
| 244 |  | 
|---|
| 245 | You can also generate header files with wrc when specifying the '-h' or | 
|---|
| 246 | '-H<filename>' option. | 
|---|
| 247 |  | 
|---|
| 248 |  | 
|---|
| 249 | NE/PE resource directory generation | 
|---|
| 250 | ----------------------------------- | 
|---|
| 251 | A windows executable has a table/directory of resources avalable in that | 
|---|
| 252 | module. Wrc will generate this directory with the '-s' option and place it | 
|---|
| 253 | in the assembly output (and header-file). This will enable the separation | 
|---|
| 254 | of different modules (dlls) in wine, which is the next project after wrc. | 
|---|
| 255 |  | 
|---|
| 256 | The layout of the PE directory should be exactly like the executable file. | 
|---|
| 257 | The NE-directory layout _DIFFERS_ from the real NE-executable in such way | 
|---|
| 258 | that all offsets to actual resource-data is relative to the NE-directory and | 
|---|
| 259 | _NOT_ the beginning of the file. | 
|---|
| 260 |  | 
|---|
| 261 |  | 
|---|
| 262 | Binary .res file generation/reading | 
|---|
| 263 | ----------------------------------- | 
|---|
| 264 | Wrc can both generate (32 and 16 bit) and read (32 bit only) .res-files. | 
|---|
| 265 | These can be used as intermediate files or binary files can be imported from | 
|---|
| 266 | other sources. The reading of 16 bit .res-files is on the list for the next | 
|---|
| 267 | release. | 
|---|
| 268 |  | 
|---|
| 269 | You cannot convert 32 bit .res-files into 16 bit output or vice versa. I | 
|---|
| 270 | might implement 16 bit res into 32 bit output in the future, but I stronly | 
|---|
| 271 | oppose to the other way arround. | 
|---|
| 272 |  | 
|---|
| 273 |  | 
|---|
| 274 | Bugs | 
|---|
| 275 | ---- | 
|---|
| 276 | Inherent to programs you have bugs. These I know are there, plus a few | 
|---|
| 277 | things that I noted in the above text (more lack of implementation than bug | 
|---|
| 278 | though): | 
|---|
| 279 | - No codepage translation | 
|---|
| 280 | - UNICODE translations are not/not correct implemented | 
|---|
| 281 | - No documentation ('wrc -?' gives command-line options and a manpage) | 
|---|
| 282 | - grep for FIXME in the source | 
|---|
| 283 | - Memory options are wrong under some conditions. There seems to be a | 
|---|
| 284 | different action for win32 and win16 | 
|---|
| 285 | - PUSHBOX control is unsupported. The MS docs use it plenty, but neither | 
|---|
| 286 | MS' nor Borland's compiler supports it. | 
|---|
| 287 |  | 
|---|
| 288 | Reporting bugs and patches | 
|---|
| 289 | -------------------------- | 
|---|
| 290 | Send problems to the wine newsgroup or, preferrably,  directly to me at: | 
|---|
| 291 |  | 
|---|
| 292 | bertho@akhphd.au.dk | 
|---|
| 293 |  | 
|---|
| 294 | Please send the problematic rc-source with the bug so I can reproduce it. | 
|---|
| 295 | Patches should _not_ be send to Alexandre but to me. I will then review the | 
|---|
| 296 | change and send a full patch to be included into the new wine release (I | 
|---|
| 297 | prefer 'diff -u' format). You can always upload suggestions to wine | 
|---|
| 298 | headquarters, but be sure to send me a copy. | 
|---|
| 299 |  | 
|---|