Commit | Line | Data |
---|---|---|
252b5132 | 1 | /* windres.h -- header file for windres program. |
aef6203b | 2 | Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005 |
b09a7772 | 3 | Free Software Foundation, Inc. |
252b5132 RH |
4 | Written by Ian Lance Taylor, Cygnus Support. |
5 | ||
6 | This file is part of GNU Binutils. | |
7 | ||
8 | This program is free software; you can redistribute it and/or modify | |
9 | it under the terms of the GNU General Public License as published by | |
10 | the Free Software Foundation; either version 2 of the License, or | |
11 | (at your option) any later version. | |
12 | ||
13 | This program is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
19 | along with this program; if not, write to the Free Software | |
b43b5d5f NC |
20 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
21 | 02110-1301, USA. */ | |
252b5132 | 22 | |
e9792343 | 23 | #include "ansidecl.h" |
252b5132 RH |
24 | |
25 | /* This is the header file for the windres program. It defines | |
26 | structures and declares functions used within the program. */ | |
27 | ||
28 | #include "winduni.h" | |
29 | ||
30 | /* We represent resources internally as a tree, similar to the tree | |
31 | used in the .rsrc section of a COFF file. The root is a | |
32 | res_directory structure. */ | |
33 | ||
34 | struct res_directory | |
35 | { | |
36 | /* Resource flags. According to the MS docs, this is currently | |
37 | always zero. */ | |
38 | unsigned long characteristics; | |
39 | /* Time/date stamp. */ | |
40 | unsigned long time; | |
41 | /* Major version number. */ | |
42 | unsigned short major; | |
43 | /* Minor version number. */ | |
44 | unsigned short minor; | |
45 | /* Directory entries. */ | |
46 | struct res_entry *entries; | |
47 | }; | |
48 | ||
49 | /* A resource ID is stored in a res_id structure. */ | |
50 | ||
51 | struct res_id | |
52 | { | |
53 | /* Non-zero if this entry has a name rather than an ID. */ | |
54 | unsigned int named : 1; | |
55 | union | |
56 | { | |
57 | /* If the named field is non-zero, this is the name. */ | |
58 | struct | |
59 | { | |
60 | /* Length of the name. */ | |
61 | int length; | |
62 | /* Pointer to the name, which is a Unicode string. */ | |
63 | unichar *name; | |
64 | } n; | |
65 | /* If the named field is zero, this is the ID. */ | |
66 | unsigned long id; | |
67 | } u; | |
68 | }; | |
69 | ||
70 | /* Each entry in the tree is a res_entry structure. We mix | |
71 | directories and resources because in a COFF file all entries in a | |
72 | directory are sorted together, whether the entries are | |
73 | subdirectories or resources. */ | |
74 | ||
75 | struct res_entry | |
76 | { | |
77 | /* Next entry. */ | |
78 | struct res_entry *next; | |
79 | /* Resource ID. */ | |
80 | struct res_id id; | |
81 | /* Non-zero if this entry is a subdirectory rather than a leaf. */ | |
82 | unsigned int subdir : 1; | |
83 | union | |
84 | { | |
85 | /* If the subdir field is non-zero, this is a pointer to the | |
86 | subdirectory. */ | |
87 | struct res_directory *dir; | |
88 | /* If the subdir field is zero, this is a pointer to the resource | |
89 | data. */ | |
90 | struct res_resource *res; | |
91 | } u; | |
92 | }; | |
93 | ||
94 | /* Types of resources. */ | |
95 | ||
96 | enum res_type | |
97 | { | |
98 | RES_TYPE_UNINITIALIZED, | |
99 | RES_TYPE_ACCELERATOR, | |
100 | RES_TYPE_BITMAP, | |
101 | RES_TYPE_CURSOR, | |
102 | RES_TYPE_GROUP_CURSOR, | |
103 | RES_TYPE_DIALOG, | |
104 | RES_TYPE_FONT, | |
105 | RES_TYPE_FONTDIR, | |
106 | RES_TYPE_ICON, | |
107 | RES_TYPE_GROUP_ICON, | |
108 | RES_TYPE_MENU, | |
109 | RES_TYPE_MESSAGETABLE, | |
110 | RES_TYPE_RCDATA, | |
111 | RES_TYPE_STRINGTABLE, | |
112 | RES_TYPE_USERDATA, | |
113 | RES_TYPE_VERSIONINFO | |
114 | }; | |
115 | ||
116 | /* A res file and a COFF file store information differently. The | |
117 | res_info structures holds data which in a res file is stored with | |
118 | each resource, but in a COFF file is stored elsewhere. */ | |
119 | ||
120 | struct res_res_info | |
121 | { | |
122 | /* Language. In a COFF file, the third level of the directory is | |
123 | keyed by the language, so the language of a resource is defined | |
124 | by its location in the resource tree. */ | |
125 | unsigned short language; | |
126 | /* Characteristics of the resource. Entirely user defined. In a | |
127 | COFF file, the res_directory structure has a characteristics | |
128 | field, but I don't know if it's related to the one in the res | |
129 | file. */ | |
130 | unsigned long characteristics; | |
131 | /* Version of the resource. Entirely user defined. In a COFF file, | |
132 | the res_directory structure has a characteristics field, but I | |
133 | don't know if it's related to the one in the res file. */ | |
134 | unsigned long version; | |
135 | /* Memory flags. This is a combination of the MEMFLAG values | |
136 | defined below. Most of these values are historical, and are not | |
137 | meaningful for win32. I don't think there is any way to store | |
138 | this information in a COFF file. */ | |
139 | unsigned short memflags; | |
140 | }; | |
141 | ||
142 | /* Each resource in a COFF file has some information which can does | |
143 | not appear in a res file. */ | |
144 | ||
145 | struct res_coff_info | |
146 | { | |
147 | /* The code page used for the data. I don't really know what this | |
148 | should be. */ | |
149 | unsigned long codepage; | |
150 | /* A resource entry in a COFF file has a reserved field, which we | |
151 | record here when reading a COFF file. When writing a COFF file, | |
152 | we set this field to zero. */ | |
153 | unsigned long reserved; | |
154 | }; | |
155 | ||
156 | /* Resource data is stored in a res_resource structure. */ | |
157 | ||
158 | struct res_resource | |
159 | { | |
160 | /* The type of resource. */ | |
161 | enum res_type type; | |
162 | /* The data for the resource. */ | |
163 | union | |
164 | { | |
165 | struct | |
166 | { | |
167 | unsigned long length; | |
168 | const unsigned char *data; | |
169 | } data; | |
170 | struct accelerator *acc; | |
171 | struct cursor *cursor; | |
172 | struct group_cursor *group_cursor; | |
173 | struct dialog *dialog; | |
174 | struct fontdir *fontdir; | |
175 | struct group_icon *group_icon; | |
176 | struct menu *menu; | |
177 | struct rcdata_item *rcdata; | |
178 | struct stringtable *stringtable; | |
179 | struct rcdata_item *userdata; | |
180 | struct versioninfo *versioninfo; | |
181 | } u; | |
182 | /* Information from a res file. */ | |
183 | struct res_res_info res_info; | |
184 | /* Information from a COFF file. */ | |
185 | struct res_coff_info coff_info; | |
186 | }; | |
187 | ||
95fd336c DD |
188 | #define SUBLANG_SHIFT 10 |
189 | ||
252b5132 RH |
190 | /* Memory flags in the memflags field of a struct res_resource. */ |
191 | ||
192 | #define MEMFLAG_MOVEABLE 0x10 | |
193 | #define MEMFLAG_PURE 0x20 | |
194 | #define MEMFLAG_PRELOAD 0x40 | |
195 | #define MEMFLAG_DISCARDABLE 0x1000 | |
196 | ||
197 | /* Standard resource type codes. These are used in the ID field of a | |
198 | res_entry structure. */ | |
199 | ||
200 | #define RT_CURSOR 1 | |
201 | #define RT_BITMAP 2 | |
202 | #define RT_ICON 3 | |
203 | #define RT_MENU 4 | |
204 | #define RT_DIALOG 5 | |
205 | #define RT_STRING 6 | |
206 | #define RT_FONTDIR 7 | |
207 | #define RT_FONT 8 | |
208 | #define RT_ACCELERATOR 9 | |
209 | #define RT_RCDATA 10 | |
210 | #define RT_MESSAGETABLE 11 | |
211 | #define RT_GROUP_CURSOR 12 | |
212 | #define RT_GROUP_ICON 14 | |
213 | #define RT_VERSION 16 | |
214 | #define RT_DLGINCLUDE 17 | |
215 | #define RT_PLUGPLAY 19 | |
216 | #define RT_VXD 20 | |
217 | #define RT_ANICURSOR 21 | |
218 | #define RT_ANIICON 22 | |
219 | ||
220 | /* An accelerator resource is a linked list of these structures. */ | |
221 | ||
222 | struct accelerator | |
223 | { | |
224 | /* Next accelerator. */ | |
225 | struct accelerator *next; | |
226 | /* Flags. A combination of the ACC values defined below. */ | |
227 | unsigned short flags; | |
228 | /* Key value. */ | |
229 | unsigned short key; | |
230 | /* Resource ID. */ | |
231 | unsigned short id; | |
232 | }; | |
233 | ||
234 | /* Accelerator flags in the flags field of a struct accelerator. | |
235 | These are the same values that appear in a res file. I hope. */ | |
236 | ||
237 | #define ACC_VIRTKEY 0x01 | |
238 | #define ACC_NOINVERT 0x02 | |
239 | #define ACC_SHIFT 0x04 | |
240 | #define ACC_CONTROL 0x08 | |
241 | #define ACC_ALT 0x10 | |
242 | #define ACC_LAST 0x80 | |
243 | ||
244 | /* A cursor resource. */ | |
245 | ||
246 | struct cursor | |
247 | { | |
248 | /* X coordinate of hotspot. */ | |
249 | short xhotspot; | |
250 | /* Y coordinate of hotspot. */ | |
251 | short yhotspot; | |
252 | /* Length of bitmap data. */ | |
253 | unsigned long length; | |
254 | /* Data. */ | |
255 | const unsigned char *data; | |
256 | }; | |
257 | ||
258 | /* A group_cursor resource is a list of group_cursor structures. */ | |
259 | ||
260 | struct group_cursor | |
261 | { | |
262 | /* Next cursor in group. */ | |
263 | struct group_cursor *next; | |
264 | /* Width. */ | |
265 | unsigned short width; | |
266 | /* Height. */ | |
267 | unsigned short height; | |
268 | /* Planes. */ | |
269 | unsigned short planes; | |
270 | /* Bits per pixel. */ | |
271 | unsigned short bits; | |
272 | /* Number of bytes in cursor resource. */ | |
273 | unsigned long bytes; | |
274 | /* Index of cursor resource. */ | |
275 | unsigned short index; | |
276 | }; | |
277 | ||
278 | /* A dialog resource. */ | |
279 | ||
280 | struct dialog | |
281 | { | |
282 | /* Basic window style. */ | |
283 | unsigned long style; | |
284 | /* Extended window style. */ | |
285 | unsigned long exstyle; | |
286 | /* X coordinate. */ | |
287 | unsigned short x; | |
288 | /* Y coordinate. */ | |
289 | unsigned short y; | |
290 | /* Width. */ | |
291 | unsigned short width; | |
292 | /* Height. */ | |
293 | unsigned short height; | |
294 | /* Menu name. */ | |
295 | struct res_id menu; | |
296 | /* Class name. */ | |
297 | struct res_id class; | |
298 | /* Caption. */ | |
299 | unichar *caption; | |
300 | /* Font point size. */ | |
301 | unsigned short pointsize; | |
302 | /* Font name. */ | |
303 | unichar *font; | |
304 | /* Extended information for a dialogex. */ | |
305 | struct dialog_ex *ex; | |
306 | /* Controls. */ | |
307 | struct dialog_control *controls; | |
308 | }; | |
309 | ||
310 | /* An extended dialog has additional information. */ | |
311 | ||
312 | struct dialog_ex | |
313 | { | |
314 | /* Help ID. */ | |
315 | unsigned long help; | |
316 | /* Font weight. */ | |
317 | unsigned short weight; | |
318 | /* Whether the font is italic. */ | |
45b99827 NC |
319 | unsigned char italic; |
320 | /* Character set. */ | |
321 | unsigned char charset; | |
252b5132 RH |
322 | }; |
323 | ||
324 | /* Window style flags, from the winsup Defines.h header file. These | |
325 | can appear in the style field of a struct dialog or a struct | |
326 | dialog_control. */ | |
327 | ||
328 | #define CW_USEDEFAULT (0x80000000) | |
329 | #define WS_BORDER (0x800000L) | |
330 | #define WS_CAPTION (0xc00000L) | |
331 | #define WS_CHILD (0x40000000L) | |
332 | #define WS_CHILDWINDOW (0x40000000L) | |
333 | #define WS_CLIPCHILDREN (0x2000000L) | |
334 | #define WS_CLIPSIBLINGS (0x4000000L) | |
335 | #define WS_DISABLED (0x8000000L) | |
336 | #define WS_DLGFRAME (0x400000L) | |
337 | #define WS_GROUP (0x20000L) | |
338 | #define WS_HSCROLL (0x100000L) | |
339 | #define WS_ICONIC (0x20000000L) | |
340 | #define WS_MAXIMIZE (0x1000000L) | |
341 | #define WS_MAXIMIZEBOX (0x10000L) | |
342 | #define WS_MINIMIZE (0x20000000L) | |
343 | #define WS_MINIMIZEBOX (0x20000L) | |
344 | #define WS_OVERLAPPED (0L) | |
345 | #define WS_OVERLAPPEDWINDOW (0xcf0000L) | |
346 | #define WS_POPUP (0x80000000L) | |
347 | #define WS_POPUPWINDOW (0x80880000L) | |
348 | #define WS_SIZEBOX (0x40000L) | |
349 | #define WS_SYSMENU (0x80000L) | |
350 | #define WS_TABSTOP (0x10000L) | |
351 | #define WS_THICKFRAME (0x40000L) | |
352 | #define WS_TILED (0L) | |
353 | #define WS_TILEDWINDOW (0xcf0000L) | |
354 | #define WS_VISIBLE (0x10000000L) | |
355 | #define WS_VSCROLL (0x200000L) | |
356 | #define MDIS_ALLCHILDSTYLES (0x1) | |
357 | #define BS_3STATE (0x5L) | |
358 | #define BS_AUTO3STATE (0x6L) | |
359 | #define BS_AUTOCHECKBOX (0x3L) | |
360 | #define BS_AUTORADIOBUTTON (0x9L) | |
361 | #define BS_BITMAP (0x80L) | |
362 | #define BS_BOTTOM (0x800L) | |
363 | #define BS_CENTER (0x300L) | |
364 | #define BS_CHECKBOX (0x2L) | |
365 | #define BS_DEFPUSHBUTTON (0x1L) | |
366 | #define BS_GROUPBOX (0x7L) | |
367 | #define BS_ICON (0x40L) | |
368 | #define BS_LEFT (0x100L) | |
369 | #define BS_LEFTTEXT (0x20L) | |
370 | #define BS_MULTILINE (0x2000L) | |
371 | #define BS_NOTIFY (0x4000L) | |
372 | #define BS_OWNERDRAW (0xbL) | |
373 | #define BS_PUSHBOX (0xcL) /* FIXME! What should this be? */ | |
374 | #define BS_PUSHBUTTON (0L) | |
375 | #define BS_PUSHLIKE (0x1000L) | |
376 | #define BS_RADIOBUTTON (0x4L) | |
377 | #define BS_RIGHT (0x200L) | |
378 | #define BS_RIGHTBUTTON (0x20L) | |
379 | #define BS_TEXT (0L) | |
380 | #define BS_TOP (0x400L) | |
381 | #define BS_USERBUTTON (0x8L) | |
382 | #define BS_VCENTER (0xc00L) | |
383 | #define CBS_AUTOHSCROLL (0x40L) | |
384 | #define CBS_DISABLENOSCROLL (0x800L) | |
385 | #define CBS_DROPDOWN (0x2L) | |
386 | #define CBS_DROPDOWNLIST (0x3L) | |
387 | #define CBS_HASSTRINGS (0x200L) | |
388 | #define CBS_LOWERCASE (0x4000L) | |
389 | #define CBS_NOINTEGRALHEIGHT (0x400L) | |
390 | #define CBS_OEMCONVERT (0x80L) | |
391 | #define CBS_OWNERDRAWFIXED (0x10L) | |
392 | #define CBS_OWNERDRAWVARIABLE (0x20L) | |
393 | #define CBS_SIMPLE (0x1L) | |
394 | #define CBS_SORT (0x100L) | |
395 | #define CBS_UPPERCASE (0x2000L) | |
396 | #define ES_AUTOHSCROLL (0x80L) | |
397 | #define ES_AUTOVSCROLL (0x40L) | |
398 | #define ES_CENTER (0x1L) | |
399 | #define ES_LEFT (0L) | |
400 | #define ES_LOWERCASE (0x10L) | |
401 | #define ES_MULTILINE (0x4L) | |
402 | #define ES_NOHIDESEL (0x100L) | |
403 | #define ES_NUMBER (0x2000L) | |
404 | #define ES_OEMCONVERT (0x400L) | |
405 | #define ES_PASSWORD (0x20L) | |
406 | #define ES_READONLY (0x800L) | |
407 | #define ES_RIGHT (0x2L) | |
408 | #define ES_UPPERCASE (0x8L) | |
409 | #define ES_WANTRETURN (0x1000L) | |
410 | #define LBS_DISABLENOSCROLL (0x1000L) | |
411 | #define LBS_EXTENDEDSEL (0x800L) | |
412 | #define LBS_HASSTRINGS (0x40L) | |
413 | #define LBS_MULTICOLUMN (0x200L) | |
414 | #define LBS_MULTIPLESEL (0x8L) | |
415 | #define LBS_NODATA (0x2000L) | |
416 | #define LBS_NOINTEGRALHEIGHT (0x100L) | |
417 | #define LBS_NOREDRAW (0x4L) | |
418 | #define LBS_NOSEL (0x4000L) | |
419 | #define LBS_NOTIFY (0x1L) | |
420 | #define LBS_OWNERDRAWFIXED (0x10L) | |
421 | #define LBS_OWNERDRAWVARIABLE (0x20L) | |
422 | #define LBS_SORT (0x2L) | |
423 | #define LBS_STANDARD (0xa00003L) | |
424 | #define LBS_USETABSTOPS (0x80L) | |
425 | #define LBS_WANTKEYBOARDINPUT (0x400L) | |
426 | #define SBS_BOTTOMALIGN (0x4L) | |
427 | #define SBS_HORZ (0L) | |
428 | #define SBS_LEFTALIGN (0x2L) | |
429 | #define SBS_RIGHTALIGN (0x4L) | |
430 | #define SBS_SIZEBOX (0x8L) | |
431 | #define SBS_SIZEBOXBOTTOMRIGHTALIGN (0x4L) | |
432 | #define SBS_SIZEBOXTOPLEFTALIGN (0x2L) | |
433 | #define SBS_SIZEGRIP (0x10L) | |
434 | #define SBS_TOPALIGN (0x2L) | |
435 | #define SBS_VERT (0x1L) | |
436 | #define SS_BITMAP (0xeL) | |
437 | #define SS_BLACKFRAME (0x7L) | |
438 | #define SS_BLACKRECT (0x4L) | |
439 | #define SS_CENTER (0x1L) | |
440 | #define SS_CENTERIMAGE (0x200L) | |
441 | #define SS_ENHMETAFILE (0xfL) | |
442 | #define SS_ETCHEDFRAME (0x12L) | |
443 | #define SS_ETCHEDHORZ (0x10L) | |
444 | #define SS_ETCHEDVERT (0x11L) | |
445 | #define SS_GRAYFRAME (0x8L) | |
446 | #define SS_GRAYRECT (0x5L) | |
447 | #define SS_ICON (0x3L) | |
448 | #define SS_LEFT (0L) | |
449 | #define SS_LEFTNOWORDWRAP (0xcL) | |
450 | #define SS_NOPREFIX (0x80L) | |
451 | #define SS_NOTIFY (0x100L) | |
452 | #define SS_OWNERDRAW (0xdL) | |
453 | #define SS_REALSIZEIMAGE (0x800L) | |
454 | #define SS_RIGHT (0x2L) | |
455 | #define SS_RIGHTJUST (0x400L) | |
456 | #define SS_SIMPLE (0xbL) | |
457 | #define SS_SUNKEN (0x1000L) | |
458 | #define SS_USERITEM (0xaL) | |
459 | #define SS_WHITEFRAME (0x9L) | |
460 | #define SS_WHITERECT (0x6L) | |
461 | #define DS_3DLOOK (0x4L) | |
462 | #define DS_ABSALIGN (0x1L) | |
463 | #define DS_CENTER (0x800L) | |
464 | #define DS_CENTERMOUSE (0x1000L) | |
465 | #define DS_CONTEXTHELP (0x2000L) | |
466 | #define DS_CONTROL (0x400L) | |
467 | #define DS_FIXEDSYS (0x8L) | |
468 | #define DS_LOCALEDIT (0x20L) | |
469 | #define DS_MODALFRAME (0x80L) | |
470 | #define DS_NOFAILCREATE (0x10L) | |
471 | #define DS_NOIDLEMSG (0x100L) | |
472 | #define DS_SETFONT (0x40L) | |
473 | #define DS_SETFOREGROUND (0x200L) | |
474 | #define DS_SYSMODAL (0x2L) | |
475 | ||
476 | /* A dialog control. */ | |
477 | ||
478 | struct dialog_control | |
479 | { | |
480 | /* Next control. */ | |
481 | struct dialog_control *next; | |
482 | /* ID. */ | |
483 | unsigned short id; | |
484 | /* Style. */ | |
485 | unsigned long style; | |
486 | /* Extended style. */ | |
487 | unsigned long exstyle; | |
488 | /* X coordinate. */ | |
489 | unsigned short x; | |
490 | /* Y coordinate. */ | |
491 | unsigned short y; | |
492 | /* Width. */ | |
493 | unsigned short width; | |
494 | /* Height. */ | |
495 | unsigned short height; | |
496 | /* Class name. */ | |
497 | struct res_id class; | |
498 | /* Associated text. */ | |
499 | struct res_id text; | |
500 | /* Extra data for the window procedure. */ | |
501 | struct rcdata_item *data; | |
502 | /* Help ID. Only used in an extended dialog. */ | |
503 | unsigned long help; | |
504 | }; | |
505 | ||
506 | /* Control classes. These can be used as the ID field in a struct | |
507 | dialog_control. */ | |
508 | ||
509 | #define CTL_BUTTON 0x80 | |
510 | #define CTL_EDIT 0x81 | |
511 | #define CTL_STATIC 0x82 | |
512 | #define CTL_LISTBOX 0x83 | |
513 | #define CTL_SCROLLBAR 0x84 | |
514 | #define CTL_COMBOBOX 0x85 | |
515 | ||
516 | /* A fontdir resource is a list of fontdir structures. */ | |
517 | ||
518 | struct fontdir | |
519 | { | |
520 | struct fontdir *next; | |
521 | /* Index of font entry. */ | |
522 | short index; | |
523 | /* Length of font information. */ | |
524 | unsigned long length; | |
45b99827 | 525 | /* Font information. */ |
252b5132 RH |
526 | const unsigned char *data; |
527 | }; | |
528 | ||
529 | /* A group_icon resource is a list of group_icon structures. */ | |
530 | ||
531 | struct group_icon | |
532 | { | |
533 | /* Next icon in group. */ | |
534 | struct group_icon *next; | |
535 | /* Width. */ | |
536 | unsigned char width; | |
537 | /* Height. */ | |
538 | unsigned char height; | |
539 | /* Color count. */ | |
540 | unsigned char colors; | |
541 | /* Planes. */ | |
542 | unsigned short planes; | |
543 | /* Bits per pixel. */ | |
544 | unsigned short bits; | |
545 | /* Number of bytes in cursor resource. */ | |
546 | unsigned long bytes; | |
547 | /* Index of cursor resource. */ | |
548 | unsigned short index; | |
549 | }; | |
550 | ||
551 | /* A menu resource. */ | |
552 | ||
553 | struct menu | |
554 | { | |
555 | /* List of menuitems. */ | |
556 | struct menuitem *items; | |
557 | /* Help ID. I don't think there is any way to set this in an rc | |
558 | file, but it can appear in the binary format. */ | |
559 | unsigned long help; | |
560 | }; | |
561 | ||
562 | /* A menu resource is a list of menuitem structures. */ | |
563 | ||
564 | struct menuitem | |
565 | { | |
566 | /* Next menuitem. */ | |
567 | struct menuitem *next; | |
568 | /* Type. In a normal menu, rather than a menuex, this is the flags | |
569 | field. */ | |
570 | unsigned long type; | |
571 | /* State. This is only used in a menuex. */ | |
572 | unsigned long state; | |
573 | /* Id. */ | |
574 | unsigned short id; | |
575 | /* Unicode text. */ | |
576 | unichar *text; | |
577 | /* Popup menu items for a popup. */ | |
578 | struct menuitem *popup; | |
579 | /* Help ID. This is only used in a menuex. */ | |
580 | unsigned long help; | |
581 | }; | |
582 | ||
583 | /* Menu item flags. These can appear in the flags field of a struct | |
584 | menuitem. */ | |
585 | ||
586 | #define MENUITEM_GRAYED 0x001 | |
587 | #define MENUITEM_INACTIVE 0x002 | |
588 | #define MENUITEM_BITMAP 0x004 | |
589 | #define MENUITEM_OWNERDRAW 0x100 | |
590 | #define MENUITEM_CHECKED 0x008 | |
591 | #define MENUITEM_POPUP 0x010 | |
592 | #define MENUITEM_MENUBARBREAK 0x020 | |
593 | #define MENUITEM_MENUBREAK 0x040 | |
594 | #define MENUITEM_ENDMENU 0x080 | |
595 | #define MENUITEM_HELP 0x4000 | |
596 | ||
597 | /* An rcdata resource is a pointer to a list of rcdata_item | |
598 | structures. */ | |
599 | ||
600 | struct rcdata_item | |
601 | { | |
602 | /* Next data item. */ | |
603 | struct rcdata_item *next; | |
604 | /* Type of data. */ | |
605 | enum | |
606 | { | |
607 | RCDATA_WORD, | |
608 | RCDATA_DWORD, | |
609 | RCDATA_STRING, | |
610 | RCDATA_WSTRING, | |
611 | RCDATA_BUFFER | |
612 | } type; | |
613 | union | |
614 | { | |
615 | unsigned int word; | |
616 | unsigned long dword; | |
617 | struct | |
618 | { | |
619 | unsigned long length; | |
620 | const char *s; | |
621 | } string; | |
622 | struct | |
623 | { | |
624 | unsigned long length; | |
625 | const unichar *w; | |
626 | } wstring; | |
627 | struct | |
628 | { | |
629 | unsigned long length; | |
630 | const unsigned char *data; | |
631 | } buffer; | |
632 | } u; | |
633 | }; | |
634 | ||
635 | /* A stringtable resource is a pointer to a stringtable structure. */ | |
636 | ||
637 | struct stringtable | |
638 | { | |
639 | /* Each stringtable resource is a list of 16 unicode strings. */ | |
640 | struct | |
641 | { | |
642 | /* Length of string. */ | |
643 | int length; | |
644 | /* String data if length > 0. */ | |
645 | unichar *string; | |
646 | } strings[16]; | |
647 | }; | |
648 | ||
649 | /* A versioninfo resource points to a versioninfo structure. */ | |
650 | ||
651 | struct versioninfo | |
652 | { | |
653 | /* Fixed version information. */ | |
654 | struct fixed_versioninfo *fixed; | |
655 | /* Variable version information. */ | |
656 | struct ver_info *var; | |
657 | }; | |
658 | ||
659 | /* The fixed portion of a versioninfo resource. */ | |
660 | ||
661 | struct fixed_versioninfo | |
662 | { | |
663 | /* The file version, which is two 32 bit integers. */ | |
664 | unsigned long file_version_ms; | |
665 | unsigned long file_version_ls; | |
666 | /* The product version, which is two 32 bit integers. */ | |
667 | unsigned long product_version_ms; | |
668 | unsigned long product_version_ls; | |
669 | /* The file flags mask. */ | |
670 | unsigned long file_flags_mask; | |
671 | /* The file flags. */ | |
672 | unsigned long file_flags; | |
673 | /* The OS type. */ | |
674 | unsigned long file_os; | |
675 | /* The file type. */ | |
676 | unsigned long file_type; | |
677 | /* The file subtype. */ | |
678 | unsigned long file_subtype; | |
679 | /* The date, which in Windows is two 32 bit integers. */ | |
680 | unsigned long file_date_ms; | |
681 | unsigned long file_date_ls; | |
682 | }; | |
683 | ||
684 | /* A list of variable version information. */ | |
685 | ||
686 | struct ver_info | |
687 | { | |
688 | /* Next item. */ | |
689 | struct ver_info *next; | |
690 | /* Type of data. */ | |
691 | enum { VERINFO_STRING, VERINFO_VAR } type; | |
692 | union | |
693 | { | |
694 | /* StringFileInfo data. */ | |
695 | struct | |
696 | { | |
697 | /* Language. */ | |
698 | unichar *language; | |
699 | /* Strings. */ | |
700 | struct ver_stringinfo *strings; | |
701 | } string; | |
702 | /* VarFileInfo data. */ | |
703 | struct | |
704 | { | |
705 | /* Key. */ | |
706 | unichar *key; | |
707 | /* Values. */ | |
708 | struct ver_varinfo *var; | |
709 | } var; | |
710 | } u; | |
711 | }; | |
712 | ||
713 | /* A list of string version information. */ | |
714 | ||
715 | struct ver_stringinfo | |
716 | { | |
717 | /* Next string. */ | |
718 | struct ver_stringinfo *next; | |
719 | /* Key. */ | |
720 | unichar *key; | |
721 | /* Value. */ | |
722 | unichar *value; | |
723 | }; | |
724 | ||
725 | /* A list of variable version information. */ | |
726 | ||
727 | struct ver_varinfo | |
728 | { | |
729 | /* Next item. */ | |
730 | struct ver_varinfo *next; | |
731 | /* Language ID. */ | |
732 | unsigned short language; | |
733 | /* Character set ID. */ | |
734 | unsigned short charset; | |
735 | }; | |
736 | ||
737 | /* This structure is used when converting resource information to | |
738 | binary. */ | |
739 | ||
740 | struct bindata | |
741 | { | |
742 | /* Next data. */ | |
743 | struct bindata *next; | |
744 | /* Length of data. */ | |
745 | unsigned long length; | |
746 | /* Data. */ | |
747 | unsigned char *data; | |
748 | }; | |
749 | ||
751d21b5 DD |
750 | extern int verbose; |
751 | ||
252b5132 RH |
752 | /* Function declarations. */ |
753 | ||
754 | extern struct res_directory *read_rc_file | |
2da42df6 AJ |
755 | (const char *, const char *, const char *, int, int); |
756 | extern struct res_directory *read_res_file (const char *); | |
757 | extern struct res_directory *read_coff_rsrc (const char *, const char *); | |
758 | extern void write_rc_file (const char *, const struct res_directory *); | |
759 | extern void write_res_file (const char *, const struct res_directory *); | |
252b5132 | 760 | extern void write_coff_file |
2da42df6 | 761 | (const char *, const char *, const struct res_directory *); |
252b5132 RH |
762 | |
763 | extern struct res_resource *bin_to_res | |
2da42df6 AJ |
764 | (struct res_id, const unsigned char *, unsigned long, int); |
765 | extern struct bindata *res_to_bin (const struct res_resource *, int); | |
252b5132 RH |
766 | |
767 | extern FILE *open_file_search | |
2da42df6 | 768 | (const char *, const char *, const char *, char **); |
252b5132 | 769 | |
2da42df6 AJ |
770 | extern void *res_alloc (size_t); |
771 | extern void *reswr_alloc (size_t); | |
252b5132 RH |
772 | |
773 | /* Resource ID handling. */ | |
774 | ||
2da42df6 AJ |
775 | extern int res_id_cmp (struct res_id, struct res_id); |
776 | extern void res_id_print (FILE *, struct res_id, int); | |
777 | extern void res_ids_print (FILE *, int, const struct res_id *); | |
778 | extern void res_string_to_id (struct res_id *, const char *); | |
252b5132 RH |
779 | |
780 | /* Manipulation of the resource tree. */ | |
781 | ||
782 | extern struct res_resource *define_resource | |
2da42df6 | 783 | (struct res_directory **, int, const struct res_id *, int); |
252b5132 | 784 | extern struct res_resource *define_standard_resource |
2da42df6 | 785 | (struct res_directory **, int, struct res_id, int, int); |
252b5132 | 786 | |
2da42df6 AJ |
787 | extern int extended_dialog (const struct dialog *); |
788 | extern int extended_menu (const struct menu *); | |
252b5132 RH |
789 | |
790 | /* Communication between the rc file support and the parser and lexer. */ | |
791 | ||
792 | extern int yydebug; | |
793 | extern FILE *yyin; | |
794 | extern char *rc_filename; | |
795 | extern int rc_lineno; | |
7adbf450 | 796 | |
2da42df6 AJ |
797 | extern int yyparse (void); |
798 | extern int yylex (void); | |
799 | extern void yyerror (const char *); | |
800 | extern void rcparse_warning (const char *); | |
801 | extern void rcparse_set_language (int); | |
802 | extern void rcparse_discard_strings (void); | |
803 | extern void rcparse_rcdata (void); | |
804 | extern void rcparse_normal (void); | |
252b5132 RH |
805 | |
806 | extern void define_accelerator | |
2da42df6 | 807 | (struct res_id, const struct res_res_info *, struct accelerator *); |
252b5132 | 808 | extern void define_bitmap |
2da42df6 | 809 | (struct res_id, const struct res_res_info *, const char *); |
252b5132 | 810 | extern void define_cursor |
2da42df6 | 811 | (struct res_id, const struct res_res_info *, const char *); |
252b5132 | 812 | extern void define_dialog |
2da42df6 | 813 | (struct res_id, const struct res_res_info *, const struct dialog *); |
252b5132 | 814 | extern struct dialog_control *define_control |
2da42df6 AJ |
815 | (const struct res_id, unsigned long, unsigned long, unsigned long, |
816 | unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); | |
2104a50e | 817 | extern struct dialog_control *define_icon_control |
2da42df6 AJ |
818 | (struct res_id, unsigned long, unsigned long, unsigned long, unsigned long, |
819 | unsigned long, unsigned long, struct rcdata_item *, struct dialog_ex *); | |
252b5132 | 820 | extern void define_font |
2da42df6 | 821 | (struct res_id, const struct res_res_info *, const char *); |
252b5132 | 822 | extern void define_icon |
2da42df6 | 823 | (struct res_id, const struct res_res_info *, const char *); |
252b5132 | 824 | extern void define_menu |
2da42df6 | 825 | (struct res_id, const struct res_res_info *, struct menuitem *); |
252b5132 | 826 | extern struct menuitem *define_menuitem |
2da42df6 AJ |
827 | (const char *, int, unsigned long, unsigned long, unsigned long, |
828 | struct menuitem *); | |
252b5132 | 829 | extern void define_messagetable |
2da42df6 | 830 | (struct res_id, const struct res_res_info *, const char *); |
252b5132 | 831 | extern void define_rcdata |
2da42df6 | 832 | (struct res_id, const struct res_res_info *, struct rcdata_item *); |
b09a7772 NC |
833 | extern void define_rcdata_file |
834 | (struct res_id, const struct res_res_info *, const char *); | |
252b5132 | 835 | extern struct rcdata_item *define_rcdata_string |
2da42df6 AJ |
836 | (const char *, unsigned long); |
837 | extern struct rcdata_item *define_rcdata_number (unsigned long, int); | |
252b5132 | 838 | extern void define_stringtable |
2da42df6 | 839 | (const struct res_res_info *, unsigned long, const char *); |
252b5132 | 840 | extern void define_user_data |
2da42df6 AJ |
841 | (struct res_id, struct res_id, const struct res_res_info *, |
842 | struct rcdata_item *); | |
252b5132 | 843 | extern void define_user_file |
2da42df6 | 844 | (struct res_id, struct res_id, const struct res_res_info *, const char *); |
252b5132 | 845 | extern void define_versioninfo |
2da42df6 | 846 | (struct res_id, int, struct fixed_versioninfo *, struct ver_info *); |
252b5132 | 847 | extern struct ver_info *append_ver_stringfileinfo |
2da42df6 | 848 | (struct ver_info *, const char *, struct ver_stringinfo *); |
252b5132 | 849 | extern struct ver_info *append_ver_varfileinfo |
2da42df6 | 850 | (struct ver_info *, const char *, struct ver_varinfo *); |
252b5132 | 851 | extern struct ver_stringinfo *append_verval |
2da42df6 | 852 | (struct ver_stringinfo *, const char *, const char *); |
252b5132 | 853 | extern struct ver_varinfo *append_vertrans |
2da42df6 | 854 | (struct ver_varinfo *, unsigned long, unsigned long); |