OSDN Git Service

Initial revision
[pf3gnuchains/pf3gnuchains4x.git] / binutils / windres.h
1 /* windres.h -- header file for windres program.
2    Copyright 1997, 1998 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 /* Memory flags in the memflags field of a struct res_resource.  */
188
189 #define MEMFLAG_MOVEABLE        0x10
190 #define MEMFLAG_PURE            0x20
191 #define MEMFLAG_PRELOAD         0x40
192 #define MEMFLAG_DISCARDABLE     0x1000
193
194 /* Standard resource type codes.  These are used in the ID field of a
195    res_entry structure.  */
196
197 #define RT_CURSOR                1
198 #define RT_BITMAP                2
199 #define RT_ICON                  3
200 #define RT_MENU                  4
201 #define RT_DIALOG                5
202 #define RT_STRING                6
203 #define RT_FONTDIR               7
204 #define RT_FONT                  8
205 #define RT_ACCELERATOR           9
206 #define RT_RCDATA               10
207 #define RT_MESSAGETABLE         11
208 #define RT_GROUP_CURSOR         12
209 #define RT_GROUP_ICON           14
210 #define RT_VERSION              16
211 #define RT_DLGINCLUDE           17
212 #define RT_PLUGPLAY             19
213 #define RT_VXD                  20
214 #define RT_ANICURSOR            21
215 #define RT_ANIICON              22
216
217 /* An accelerator resource is a linked list of these structures.  */
218
219 struct accelerator
220 {
221   /* Next accelerator.  */
222   struct accelerator *next;
223   /* Flags.  A combination of the ACC values defined below.  */
224   unsigned short flags;
225   /* Key value.  */
226   unsigned short key;
227   /* Resource ID.  */
228   unsigned short id;
229 };
230
231 /* Accelerator flags in the flags field of a struct accelerator.
232    These are the same values that appear in a res file.  I hope.  */
233
234 #define ACC_VIRTKEY     0x01
235 #define ACC_NOINVERT    0x02
236 #define ACC_SHIFT       0x04
237 #define ACC_CONTROL     0x08
238 #define ACC_ALT         0x10
239 #define ACC_LAST        0x80
240
241 /* A cursor resource.  */
242
243 struct cursor
244 {
245   /* X coordinate of hotspot.  */
246   short xhotspot;
247   /* Y coordinate of hotspot.  */
248   short yhotspot;
249   /* Length of bitmap data.  */
250   unsigned long length;
251   /* Data.  */
252   const unsigned char *data;
253 };
254
255 /* A group_cursor resource is a list of group_cursor structures.  */
256
257 struct group_cursor
258 {
259   /* Next cursor in group.  */
260   struct group_cursor *next;
261   /* Width.  */
262   unsigned short width;
263   /* Height.  */
264   unsigned short height;
265   /* Planes.  */
266   unsigned short planes;
267   /* Bits per pixel.  */
268   unsigned short bits;
269   /* Number of bytes in cursor resource.  */
270   unsigned long bytes;
271   /* Index of cursor resource.  */
272   unsigned short index;
273 };
274
275 /* A dialog resource.  */
276
277 struct dialog
278 {
279   /* Basic window style.  */
280   unsigned long style;
281   /* Extended window style.  */
282   unsigned long exstyle;
283   /* X coordinate.  */
284   unsigned short x;
285   /* Y coordinate.  */
286   unsigned short y;
287   /* Width.  */
288   unsigned short width;
289   /* Height.  */
290   unsigned short height;
291   /* Menu name.  */
292   struct res_id menu;
293   /* Class name.  */
294   struct res_id class;
295   /* Caption.  */
296   unichar *caption;
297   /* Font point size.  */
298   unsigned short pointsize;
299   /* Font name.  */
300   unichar *font;
301   /* Extended information for a dialogex.  */
302   struct dialog_ex *ex;
303   /* Controls.  */
304   struct dialog_control *controls;
305 };
306
307 /* An extended dialog has additional information.  */
308
309 struct dialog_ex
310 {
311   /* Help ID.  */
312   unsigned long help;
313   /* Font weight.  */
314   unsigned short weight;
315   /* Whether the font is italic.  */
316   unsigned short italic;
317 };
318
319 /* Window style flags, from the winsup Defines.h header file.  These
320    can appear in the style field of a struct dialog or a struct
321    dialog_control.  */
322
323 #define CW_USEDEFAULT   (0x80000000)
324 #define WS_BORDER       (0x800000L)
325 #define WS_CAPTION      (0xc00000L)
326 #define WS_CHILD        (0x40000000L)
327 #define WS_CHILDWINDOW  (0x40000000L)
328 #define WS_CLIPCHILDREN (0x2000000L)
329 #define WS_CLIPSIBLINGS (0x4000000L)
330 #define WS_DISABLED     (0x8000000L)
331 #define WS_DLGFRAME     (0x400000L)
332 #define WS_GROUP        (0x20000L)
333 #define WS_HSCROLL      (0x100000L)
334 #define WS_ICONIC       (0x20000000L)
335 #define WS_MAXIMIZE     (0x1000000L)
336 #define WS_MAXIMIZEBOX  (0x10000L)
337 #define WS_MINIMIZE     (0x20000000L)
338 #define WS_MINIMIZEBOX  (0x20000L)
339 #define WS_OVERLAPPED   (0L)
340 #define WS_OVERLAPPEDWINDOW     (0xcf0000L)
341 #define WS_POPUP        (0x80000000L)
342 #define WS_POPUPWINDOW  (0x80880000L)
343 #define WS_SIZEBOX      (0x40000L)
344 #define WS_SYSMENU      (0x80000L)
345 #define WS_TABSTOP      (0x10000L)
346 #define WS_THICKFRAME   (0x40000L)
347 #define WS_TILED        (0L)
348 #define WS_TILEDWINDOW  (0xcf0000L)
349 #define WS_VISIBLE      (0x10000000L)
350 #define WS_VSCROLL      (0x200000L)
351 #define MDIS_ALLCHILDSTYLES     (0x1)
352 #define BS_3STATE       (0x5L)
353 #define BS_AUTO3STATE   (0x6L)
354 #define BS_AUTOCHECKBOX (0x3L)
355 #define BS_AUTORADIOBUTTON      (0x9L)
356 #define BS_BITMAP       (0x80L)
357 #define BS_BOTTOM       (0x800L)
358 #define BS_CENTER       (0x300L)
359 #define BS_CHECKBOX     (0x2L)
360 #define BS_DEFPUSHBUTTON        (0x1L)
361 #define BS_GROUPBOX     (0x7L)
362 #define BS_ICON (0x40L)
363 #define BS_LEFT (0x100L)
364 #define BS_LEFTTEXT     (0x20L)
365 #define BS_MULTILINE    (0x2000L)
366 #define BS_NOTIFY       (0x4000L)
367 #define BS_OWNERDRAW    (0xbL)
368 #define BS_PUSHBOX      (0xcL)          /* FIXME!  What should this be?  */
369 #define BS_PUSHBUTTON   (0L)
370 #define BS_PUSHLIKE     (0x1000L)
371 #define BS_RADIOBUTTON  (0x4L)
372 #define BS_RIGHT        (0x200L)
373 #define BS_RIGHTBUTTON  (0x20L)
374 #define BS_TEXT (0L)
375 #define BS_TOP  (0x400L)
376 #define BS_USERBUTTON   (0x8L)
377 #define BS_VCENTER      (0xc00L)
378 #define CBS_AUTOHSCROLL (0x40L)
379 #define CBS_DISABLENOSCROLL     (0x800L)
380 #define CBS_DROPDOWN    (0x2L)
381 #define CBS_DROPDOWNLIST        (0x3L)
382 #define CBS_HASSTRINGS  (0x200L)
383 #define CBS_LOWERCASE   (0x4000L)
384 #define CBS_NOINTEGRALHEIGHT    (0x400L)
385 #define CBS_OEMCONVERT  (0x80L)
386 #define CBS_OWNERDRAWFIXED      (0x10L)
387 #define CBS_OWNERDRAWVARIABLE   (0x20L)
388 #define CBS_SIMPLE      (0x1L)
389 #define CBS_SORT        (0x100L)
390 #define CBS_UPPERCASE   (0x2000L)
391 #define ES_AUTOHSCROLL  (0x80L)
392 #define ES_AUTOVSCROLL  (0x40L)
393 #define ES_CENTER       (0x1L)
394 #define ES_LEFT (0L)
395 #define ES_LOWERCASE    (0x10L)
396 #define ES_MULTILINE    (0x4L)
397 #define ES_NOHIDESEL    (0x100L)
398 #define ES_NUMBER       (0x2000L)
399 #define ES_OEMCONVERT   (0x400L)
400 #define ES_PASSWORD     (0x20L)
401 #define ES_READONLY     (0x800L)
402 #define ES_RIGHT        (0x2L)
403 #define ES_UPPERCASE    (0x8L)
404 #define ES_WANTRETURN   (0x1000L)
405 #define LBS_DISABLENOSCROLL     (0x1000L)
406 #define LBS_EXTENDEDSEL (0x800L)
407 #define LBS_HASSTRINGS  (0x40L)
408 #define LBS_MULTICOLUMN (0x200L)
409 #define LBS_MULTIPLESEL (0x8L)
410 #define LBS_NODATA      (0x2000L)
411 #define LBS_NOINTEGRALHEIGHT    (0x100L)
412 #define LBS_NOREDRAW    (0x4L)
413 #define LBS_NOSEL       (0x4000L)
414 #define LBS_NOTIFY      (0x1L)
415 #define LBS_OWNERDRAWFIXED      (0x10L)
416 #define LBS_OWNERDRAWVARIABLE   (0x20L)
417 #define LBS_SORT        (0x2L)
418 #define LBS_STANDARD    (0xa00003L)
419 #define LBS_USETABSTOPS (0x80L)
420 #define LBS_WANTKEYBOARDINPUT   (0x400L)
421 #define SBS_BOTTOMALIGN (0x4L)
422 #define SBS_HORZ        (0L)
423 #define SBS_LEFTALIGN   (0x2L)
424 #define SBS_RIGHTALIGN  (0x4L)
425 #define SBS_SIZEBOX     (0x8L)
426 #define SBS_SIZEBOXBOTTOMRIGHTALIGN     (0x4L)
427 #define SBS_SIZEBOXTOPLEFTALIGN (0x2L)
428 #define SBS_SIZEGRIP    (0x10L)
429 #define SBS_TOPALIGN    (0x2L)
430 #define SBS_VERT        (0x1L)
431 #define SS_BITMAP       (0xeL)
432 #define SS_BLACKFRAME   (0x7L)
433 #define SS_BLACKRECT    (0x4L)
434 #define SS_CENTER       (0x1L)
435 #define SS_CENTERIMAGE  (0x200L)
436 #define SS_ENHMETAFILE  (0xfL)
437 #define SS_ETCHEDFRAME  (0x12L)
438 #define SS_ETCHEDHORZ   (0x10L)
439 #define SS_ETCHEDVERT   (0x11L)
440 #define SS_GRAYFRAME    (0x8L)
441 #define SS_GRAYRECT     (0x5L)
442 #define SS_ICON (0x3L)
443 #define SS_LEFT (0L)
444 #define SS_LEFTNOWORDWRAP       (0xcL)
445 #define SS_NOPREFIX     (0x80L)
446 #define SS_NOTIFY       (0x100L)
447 #define SS_OWNERDRAW    (0xdL)
448 #define SS_REALSIZEIMAGE        (0x800L)
449 #define SS_RIGHT        (0x2L)
450 #define SS_RIGHTJUST    (0x400L)
451 #define SS_SIMPLE       (0xbL)
452 #define SS_SUNKEN       (0x1000L)
453 #define SS_USERITEM     (0xaL)
454 #define SS_WHITEFRAME   (0x9L)
455 #define SS_WHITERECT    (0x6L)
456 #define DS_3DLOOK       (0x4L)
457 #define DS_ABSALIGN     (0x1L)
458 #define DS_CENTER       (0x800L)
459 #define DS_CENTERMOUSE  (0x1000L)
460 #define DS_CONTEXTHELP  (0x2000L)
461 #define DS_CONTROL      (0x400L)
462 #define DS_FIXEDSYS     (0x8L)
463 #define DS_LOCALEDIT    (0x20L)
464 #define DS_MODALFRAME   (0x80L)
465 #define DS_NOFAILCREATE (0x10L)
466 #define DS_NOIDLEMSG    (0x100L)
467 #define DS_SETFONT      (0x40L)
468 #define DS_SETFOREGROUND        (0x200L)
469 #define DS_SYSMODAL     (0x2L)
470
471 /* A dialog control.  */
472
473 struct dialog_control
474 {
475   /* Next control.  */
476   struct dialog_control *next;
477   /* ID.  */
478   unsigned short id;
479   /* Style.  */
480   unsigned long style;
481   /* Extended style.  */
482   unsigned long exstyle;
483   /* X coordinate.  */
484   unsigned short x;
485   /* Y coordinate.  */
486   unsigned short y;
487   /* Width.  */
488   unsigned short width;
489   /* Height.  */
490   unsigned short height;
491   /* Class name.  */
492   struct res_id class;
493   /* Associated text.  */
494   struct res_id text;
495   /* Extra data for the window procedure.  */
496   struct rcdata_item *data;
497   /* Help ID.  Only used in an extended dialog.  */
498   unsigned long help;
499 };
500
501 /* Control classes.  These can be used as the ID field in a struct
502    dialog_control.  */
503
504 #define CTL_BUTTON      0x80
505 #define CTL_EDIT        0x81
506 #define CTL_STATIC      0x82
507 #define CTL_LISTBOX     0x83
508 #define CTL_SCROLLBAR   0x84
509 #define CTL_COMBOBOX    0x85
510
511 /* A fontdir resource is a list of fontdir structures.  */
512
513 struct fontdir
514 {
515   struct fontdir *next;
516   /* Index of font entry.  */
517   short index;
518   /* Length of font information.  */
519   unsigned long length;
520   /* Font information. */
521   const unsigned char *data;
522 };
523
524 /* A group_icon resource is a list of group_icon structures.  */
525
526 struct group_icon
527 {
528   /* Next icon in group.  */
529   struct group_icon *next;
530   /* Width.  */
531   unsigned char width;
532   /* Height.  */
533   unsigned char height;
534   /* Color count.  */
535   unsigned char colors;
536   /* Planes.  */
537   unsigned short planes;
538   /* Bits per pixel.  */
539   unsigned short bits;
540   /* Number of bytes in cursor resource.  */
541   unsigned long bytes;
542   /* Index of cursor resource.  */
543   unsigned short index;
544 };
545
546 /* A menu resource.  */
547
548 struct menu
549 {
550   /* List of menuitems.  */
551   struct menuitem *items;
552   /* Help ID.  I don't think there is any way to set this in an rc
553      file, but it can appear in the binary format.  */
554   unsigned long help;
555 };
556
557 /* A menu resource is a list of menuitem structures.  */
558
559 struct menuitem
560 {
561   /* Next menuitem.  */
562   struct menuitem *next;
563   /* Type.  In a normal menu, rather than a menuex, this is the flags
564      field.  */
565   unsigned long type;
566   /* State.  This is only used in a menuex.  */
567   unsigned long state;
568   /* Id.  */
569   unsigned short id;
570   /* Unicode text.  */
571   unichar *text;
572   /* Popup menu items for a popup.  */
573   struct menuitem *popup;
574   /* Help ID.  This is only used in a menuex.  */
575   unsigned long help;
576 };
577
578 /* Menu item flags.  These can appear in the flags field of a struct
579    menuitem.  */
580
581 #define MENUITEM_GRAYED         0x001
582 #define MENUITEM_INACTIVE       0x002
583 #define MENUITEM_BITMAP         0x004
584 #define MENUITEM_OWNERDRAW      0x100
585 #define MENUITEM_CHECKED        0x008
586 #define MENUITEM_POPUP          0x010
587 #define MENUITEM_MENUBARBREAK   0x020
588 #define MENUITEM_MENUBREAK      0x040
589 #define MENUITEM_ENDMENU        0x080
590 #define MENUITEM_HELP          0x4000
591
592 /* An rcdata resource is a pointer to a list of rcdata_item
593    structures.  */
594
595 struct rcdata_item
596 {
597   /* Next data item.  */
598   struct rcdata_item *next;
599   /* Type of data.  */
600   enum
601   {
602     RCDATA_WORD,
603     RCDATA_DWORD,
604     RCDATA_STRING,
605     RCDATA_WSTRING,
606     RCDATA_BUFFER
607   } type;
608   union
609   {
610     unsigned int word;
611     unsigned long dword;
612     struct
613     {
614       unsigned long length;
615       const char *s;
616     } string;
617     struct
618     {
619       unsigned long length;
620       const unichar *w;
621     } wstring;
622     struct
623     {
624       unsigned long length;
625       const unsigned char *data;
626     } buffer;
627   } u;
628 };
629
630 /* A stringtable resource is a pointer to a stringtable structure.  */
631
632 struct stringtable
633 {
634   /* Each stringtable resource is a list of 16 unicode strings.  */
635   struct
636   {
637     /* Length of string.  */
638     int length;
639     /* String data if length > 0.  */
640     unichar *string;
641   } strings[16];
642 };
643
644 /* A versioninfo resource points to a versioninfo structure.  */
645
646 struct versioninfo
647 {
648   /* Fixed version information.  */
649   struct fixed_versioninfo *fixed;
650   /* Variable version information.  */
651   struct ver_info *var;
652 };
653
654 /* The fixed portion of a versioninfo resource.  */
655
656 struct fixed_versioninfo
657 {
658   /* The file version, which is two 32 bit integers.  */
659   unsigned long file_version_ms;
660   unsigned long file_version_ls;
661   /* The product version, which is two 32 bit integers.  */
662   unsigned long product_version_ms;
663   unsigned long product_version_ls;
664   /* The file flags mask.  */
665   unsigned long file_flags_mask;
666   /* The file flags.  */
667   unsigned long file_flags;
668   /* The OS type.  */
669   unsigned long file_os;
670   /* The file type.  */
671   unsigned long file_type;
672   /* The file subtype.  */
673   unsigned long file_subtype;
674   /* The date, which in Windows is two 32 bit integers.  */
675   unsigned long file_date_ms;
676   unsigned long file_date_ls;
677 };
678
679 /* A list of variable version information.  */
680
681 struct ver_info
682 {
683   /* Next item.  */
684   struct ver_info *next;
685   /* Type of data.  */
686   enum { VERINFO_STRING, VERINFO_VAR } type;
687   union
688   {
689     /* StringFileInfo data.  */
690     struct
691     {
692       /* Language.  */
693       unichar *language;
694       /* Strings.  */
695       struct ver_stringinfo *strings;
696     } string;
697     /* VarFileInfo data.  */
698     struct
699     {
700       /* Key.  */
701       unichar *key;
702       /* Values.  */
703       struct ver_varinfo *var;
704     } var;
705   } u;
706 };
707
708 /* A list of string version information.  */
709
710 struct ver_stringinfo
711 {
712   /* Next string.  */
713   struct ver_stringinfo *next;
714   /* Key.  */
715   unichar *key;
716   /* Value.  */
717   unichar *value;
718 };
719
720 /* A list of variable version information.  */
721
722 struct ver_varinfo
723 {
724   /* Next item.  */
725   struct ver_varinfo *next;
726   /* Language ID.  */
727   unsigned short language;
728   /* Character set ID.  */
729   unsigned short charset;
730 };
731
732 /* This structure is used when converting resource information to
733    binary.  */
734
735 struct bindata
736 {
737   /* Next data.  */
738   struct bindata *next;
739   /* Length of data.  */
740   unsigned long length;
741   /* Data.  */
742   unsigned char *data;
743 };
744
745 /* Function declarations.  */
746
747 extern struct res_directory *read_rc_file
748   PARAMS ((const char *, const char *, const char *, int));
749 extern struct res_directory *read_res_file PARAMS ((const char *));
750 extern struct res_directory *read_coff_rsrc
751   PARAMS ((const char *, const char *));
752 extern void write_rc_file
753   PARAMS ((const char *, const struct res_directory *));
754 extern void write_res_file
755   PARAMS ((const char *, const struct res_directory *));
756 extern void write_coff_file
757   PARAMS ((const char *, const char *, const struct res_directory *));
758
759 extern struct res_resource *bin_to_res
760   PARAMS ((struct res_id, const unsigned char *, unsigned long, int));
761 extern struct bindata *res_to_bin PARAMS ((const struct res_resource *, int));
762
763 extern FILE *open_file_search
764   PARAMS ((const char *, const char *, const char *, char **));
765
766 extern PTR res_alloc PARAMS ((size_t));
767 extern PTR reswr_alloc PARAMS ((size_t));
768
769 /* Resource ID handling.  */
770
771 extern int res_id_cmp PARAMS ((struct res_id, struct res_id));
772 extern void res_id_print PARAMS ((FILE *, struct res_id, int));
773 extern void res_ids_print PARAMS ((FILE *, int, const struct res_id *));
774 extern void res_string_to_id PARAMS ((struct res_id *, const char *));
775
776 /* Manipulation of the resource tree.  */
777
778 extern struct res_resource *define_resource
779   PARAMS ((struct res_directory **, int, const struct res_id *, int));
780 extern struct res_resource *define_standard_resource
781   PARAMS ((struct res_directory **, int, struct res_id, int, int));
782
783 extern int extended_dialog PARAMS ((const struct dialog *));
784 extern int extended_menu PARAMS ((const struct menu *));
785
786 /* Communication between the rc file support and the parser and lexer.  */
787
788 extern int yydebug;
789 extern FILE *yyin;
790 extern char *rc_filename;
791 extern int rc_lineno;
792 extern int yyparse PARAMS ((void));
793 extern int yylex PARAMS ((void));
794 extern void yyerror PARAMS ((const char *));
795 extern void rcparse_warning PARAMS ((const char *));
796 extern void rcparse_set_language PARAMS ((int));
797 extern void rcparse_discard_strings PARAMS ((void));
798 extern void rcparse_rcdata PARAMS ((void));
799 extern void rcparse_normal PARAMS ((void));
800
801 extern void define_accelerator
802   PARAMS ((struct res_id, const struct res_res_info *, struct accelerator *));
803 extern void define_bitmap
804   PARAMS ((struct res_id, const struct res_res_info *, const char *));
805 extern void define_cursor
806   PARAMS ((struct res_id, const struct res_res_info *, const char *));
807 extern void define_dialog
808   PARAMS ((struct res_id, const struct res_res_info *, const struct dialog *));
809 extern struct dialog_control *define_control
810   PARAMS ((const char *, unsigned long, unsigned long, unsigned long,
811            unsigned long, unsigned long, unsigned long, unsigned long,
812            unsigned long));
813 extern void define_font
814   PARAMS ((struct res_id, const struct res_res_info *, const char *));
815 extern void define_icon
816   PARAMS ((struct res_id, const struct res_res_info *, const char *));
817 extern void define_menu
818   PARAMS ((struct res_id, const struct res_res_info *, struct menuitem *));
819 extern struct menuitem *define_menuitem
820   PARAMS ((const char *, int, unsigned long, unsigned long, unsigned long,
821            struct menuitem *));
822 extern void define_messagetable
823   PARAMS ((struct res_id, const struct res_res_info *, const char *));
824 extern void define_rcdata
825   PARAMS ((struct res_id, const struct res_res_info *, struct rcdata_item *));
826 extern struct rcdata_item *define_rcdata_string
827   PARAMS ((const char *, unsigned long));
828 extern struct rcdata_item *define_rcdata_number PARAMS ((unsigned long, int));
829 extern void define_stringtable
830   PARAMS ((const struct res_res_info *, unsigned long, const char *));
831 extern void define_user_data
832   PARAMS ((struct res_id, struct res_id, const struct res_res_info *,
833            struct rcdata_item *));
834 extern void define_user_file
835   PARAMS ((struct res_id, struct res_id, const struct res_res_info *,
836            const char *));
837 extern void define_versioninfo
838   PARAMS ((struct res_id, int, struct fixed_versioninfo *,
839            struct ver_info *));
840 extern struct ver_info *append_ver_stringfileinfo
841   PARAMS ((struct ver_info *, const char *, struct ver_stringinfo *));
842 extern struct ver_info *append_ver_varfileinfo
843   PARAMS ((struct ver_info *, const char *, struct ver_varinfo *));
844 extern struct ver_stringinfo *append_verval
845   PARAMS ((struct ver_stringinfo *, const char *, const char *));
846 extern struct ver_varinfo *append_vertrans
847   PARAMS ((struct ver_varinfo *, unsigned long, unsigned long));