- Bugfix: Macro expansion of strings would assert an internal error
[wine.git] / tools / wrc / README.wrc
blob91993685f40d4f0600fad4bd7d2d9d8f79c9172b
1 Release 1.1.6 of wrc (05-Jul-2000), the wine resource compiler.
3 See the file CHANGES for differences between the version and what has been
4 corrected in the current version.
6 Wrc features:
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
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.
25 Wrc command-line
26 ----------------
27 You can get this message by typing 'wrc -?':
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
58 Input is taken from stdin if no sourcefile specified.
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
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]"
74 For more info see the wrc manpage.
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
95 #pragma         (ignored)
96 #ident          (ignored)
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.
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__  | 6             | Wrc's minor version
116 __WRC_PATCH__  | 6             | Alias of __WRC_MICRO__
118 Include-files are not read twice if they are protected with this scheme:
119 #ifndef SOME_DEFINE
120 #define SOME_DEFINE
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.
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).
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.
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.
154 Example:
156 1 RCDATA DISCARDABLE
157 LANGUAGE 1, 0
158 VERSION 312
159 CHARACTERISTICS 876
161         1, 2, 3, 4, 5, "and whatever more data you want"
162         '00 01 02 03 04 05 06 07 08'
166 Resource types supported
167 ------------------------
168 All types are supported except for:
169 - RT_VXD
170 - RT_PLUGPLAY
171 - RT_HTML
172 - RT_DLGINCLUDE
174 These types will be implemented as soon as I get a proper specification of
175 the layout.
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.
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)
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.
200 Resource names can be both numerical (expressions) and character typed. Wrc
201 does support this insane (deep sigh) construct:
203 MENU MENU
205  ...
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!
212 Indirect loadable resources
213 ---------------------------
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':
218 typedef struct wrc_resource16
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;
228 typedef struct wrc_resource32
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;
238 The extension to winerc lies in the addition of the 'typename' field to
239 support usertype resoursec with names for types.
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!
245 You can also generate header files with wrc when specifying the '-h' or
246 '-H<filename>' option.
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.
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.
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.
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.
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.
288 Reporting bugs and patches
289 --------------------------
290 Send problems to the wine newsgroup or, preferrably,  directly to me at:
292 bertho@akhphd.au.dk
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.