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