1/* windint.h -- internal header file for windres program.
2   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
3   Free Software Foundation, Inc.
4   Written by Kai Tietz, Onevision.
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
20   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21   02110-1301, USA.  */
22
23#include "winduni.h"
24
25#ifndef WINDINT_H
26#define WINDINT_H
27
28/* Use bfd_size_type to ensure a sufficient number of bits.  */
29#ifndef DEFINED_RC_UINT_TYPE
30#define DEFINED_RC_UINT_TYPE
31typedef bfd_size_type rc_uint_type;
32#endif
33
34/* Resource directory structure.  */
35
36typedef struct res_hdr
37{
38  rc_uint_type data_size;
39  rc_uint_type header_size;
40} res_hdr;
41
42struct __attribute__ ((__packed__)) bin_res_hdr
43{
44  bfd_byte data_size[4];
45  bfd_byte header_size[4];
46};
47#define BIN_RES_HDR_SIZE 8
48
49struct __attribute__ ((__packed__)) bin_res_id
50{
51  bfd_byte sig[2]; /* Has to be 0xffff for unnamed ids.  */
52  bfd_byte id[2];
53};
54#define BIN_RES_ID  4
55
56/* This structure is used when converting resource information to
57   binary.  */
58
59typedef struct bindata
60{
61  /* Next data.  */
62  struct bindata *next;
63  /* Length of data.  */
64  rc_uint_type length;
65  /* Data.  */
66  bfd_byte *data;
67} bindata;
68
69/* This structure is used when converting resource information to
70   coff.  */
71typedef struct coff_res_data
72{
73  /* Next data.  */
74  struct coff_res_data *next;
75  /* Length of data.  */
76  rc_uint_type length;
77  /* Data.  */
78  const struct rc_res_resource *res;
79} coff_res_data;
80
81/* We represent resources internally as a tree, similar to the tree
82   used in the .rsrc section of a COFF file.  The root is a
83   rc_res_directory structure.  */
84
85typedef struct rc_res_directory
86{
87  /* Resource flags.  According to the MS docs, this is currently
88     always zero.  */
89  rc_uint_type characteristics;
90  /* Time/date stamp.  */
91  rc_uint_type time;
92  /* Major version number.  */
93  rc_uint_type major;
94  /* Minor version number.  */
95  rc_uint_type minor;
96  /* Directory entries.  */
97  struct rc_res_entry *entries;
98} rc_res_directory;
99
100/* A resource ID is stored in a rc_res_id structure.  */
101
102typedef struct rc_res_id
103{
104  /* Non-zero if this entry has a name rather than an ID.  */
105  rc_uint_type named : 1;
106  union
107  {
108    /* If the named field is non-zero, this is the name.  */
109    struct
110    {
111      /* Length of the name.  */
112      rc_uint_type length;
113      /* Pointer to the name, which is a Unicode string.  */
114      unichar *name;
115    } n;
116    /* If the named field is zero, this is the ID.  */
117    rc_uint_type id;
118  } u;
119} rc_res_id;
120
121/* Each entry in the tree is a rc_res_entry structure.  We mix
122   directories and resources because in a COFF file all entries in a
123   directory are sorted together, whether the entries are
124   subdirectories or resources.  */
125
126typedef struct rc_res_entry
127{
128  /* Next entry.  */
129  struct rc_res_entry *next;
130  /* Resource ID.  */
131  rc_res_id id;
132  /* Non-zero if this entry is a subdirectory rather than a leaf.  */
133  rc_uint_type subdir : 1;
134  union
135  {
136    /* If the subdir field is non-zero, this is a pointer to the
137       subdirectory.  */
138    rc_res_directory *dir;
139    /* If the subdir field is zero, this is a pointer to the resource
140       data.  */
141    struct rc_res_resource *res;
142  } u;
143} rc_res_entry;
144
145/* Types of resources.  */
146
147enum rc_res_type
148{
149  RES_TYPE_UNINITIALIZED,
150  RES_TYPE_ACCELERATOR,
151  RES_TYPE_BITMAP,
152  RES_TYPE_CURSOR,
153  RES_TYPE_GROUP_CURSOR,
154  RES_TYPE_DIALOG,
155  RES_TYPE_FONT,
156  RES_TYPE_FONTDIR,
157  RES_TYPE_ICON,
158  RES_TYPE_GROUP_ICON,
159  RES_TYPE_MENU,
160  RES_TYPE_MESSAGETABLE,
161  RES_TYPE_RCDATA,
162  RES_TYPE_STRINGTABLE,
163  RES_TYPE_USERDATA,
164  RES_TYPE_VERSIONINFO,
165  RES_TYPE_DLGINCLUDE,
166  RES_TYPE_PLUGPLAY,
167  RES_TYPE_VXD,
168  RES_TYPE_ANICURSOR,
169  RES_TYPE_ANIICON,
170  RES_TYPE_DLGINIT,
171  RES_TYPE_TOOLBAR
172};
173
174/* A res file and a COFF file store information differently.  The
175   res_info structures holds data which in a res file is stored with
176   each resource, but in a COFF file is stored elsewhere.  */
177
178typedef struct rc_res_res_info
179{
180  /* Language.  In a COFF file, the third level of the directory is
181     keyed by the language, so the language of a resource is defined
182     by its location in the resource tree.  */
183  rc_uint_type language;
184  /* Characteristics of the resource.  Entirely user defined.  In a
185     COFF file, the rc_res_directory structure has a characteristics
186     field, but I don't know if it's related to the one in the res
187     file.  */
188  rc_uint_type characteristics;
189  /* Version of the resource.  Entirely user defined.  In a COFF file,
190     the rc_res_directory structure has a characteristics field, but I
191     don't know if it's related to the one in the res file.  */
192  rc_uint_type version;
193  /* Memory flags.  This is a combination of the MEMFLAG values
194     defined below.  Most of these values are historical, and are not
195     meaningful for win32.  I don't think there is any way to store
196     this information in a COFF file.  */
197  rc_uint_type memflags;
198} rc_res_res_info;
199
200/* Binary layout of rc_res_info.  */
201
202struct __attribute__ ((__packed__)) bin_res_info
203{
204  bfd_byte version[4];
205  bfd_byte memflags[2];
206  bfd_byte language[2];
207  bfd_byte version2[4];
208  bfd_byte characteristics[4];
209};
210#define BIN_RES_INFO_SIZE 16
211
212/* Each resource in a COFF file has some information which can does
213   not appear in a res file.  */
214
215typedef struct rc_res_coff_info
216{
217  /* The code page used for the data.  I don't really know what this
218     should be.  It has something todo with ASCII to Unicode encoding.  */
219  rc_uint_type codepage;
220  /* A resource entry in a COFF file has a reserved field, which we
221     record here when reading a COFF file.  When writing a COFF file,
222     we set this field to zero.  */
223  rc_uint_type reserved;
224} rc_res_coff_info;
225
226/* Resource data is stored in a rc_res_resource structure.  */
227
228typedef struct rc_res_resource
229{
230  /* The type of resource.  */
231  enum rc_res_type type;
232  /* The data for the resource.  */
233  union
234  {
235    struct
236    {
237      rc_uint_type length;
238      const bfd_byte *data;
239    } data;
240    struct rc_accelerator *acc;
241    struct rc_cursor *cursor;
242    struct rc_group_cursor *group_cursor;
243    struct rc_dialog *dialog;
244    struct rc_fontdir *fontdir;
245    struct rc_group_icon *group_icon;
246    struct rc_menu *menu;
247    struct rc_rcdata_item *rcdata;
248    struct rc_stringtable *stringtable;
249    struct rc_rcdata_item *userdata;
250    struct rc_versioninfo *versioninfo;
251    struct rc_toolbar *toolbar;
252  } u;
253  /* Information from a res file.  */
254  struct rc_res_res_info res_info;
255  /* Information from a COFF file.  */
256  rc_res_coff_info coff_info;
257} rc_res_resource;
258
259#define SUBLANG_SHIFT 10
260
261/* Memory flags in the memflags field of a rc_res_resource.  */
262
263#define MEMFLAG_MOVEABLE	0x10
264#define MEMFLAG_PURE		0x20
265#define MEMFLAG_PRELOAD		0x40
266#define MEMFLAG_DISCARDABLE	0x1000
267
268/* Standard resource type codes.  These are used in the ID field of a
269   rc_res_entry structure.  */
270
271#define RT_CURSOR		 1
272#define RT_BITMAP		 2
273#define RT_ICON			 3
274#define RT_MENU			 4
275#define RT_DIALOG		 5
276#define RT_STRING		 6
277#define RT_FONTDIR		 7
278#define RT_FONT			 8
279#define RT_ACCELERATOR		 9
280#define RT_RCDATA		10
281#define RT_MESSAGETABLE		11
282#define RT_GROUP_CURSOR		12
283#define RT_GROUP_ICON		14
284#define RT_VERSION		16
285#define RT_DLGINCLUDE		17
286#define RT_PLUGPLAY		19
287#define RT_VXD			20
288#define RT_ANICURSOR		21
289#define RT_ANIICON		22
290#define RT_HTML			23
291#define RT_MANIFEST		24
292#define RT_DLGINIT		240
293#define RT_TOOLBAR		241
294
295/* An accelerator resource is a linked list of these structures.  */
296
297typedef struct rc_accelerator
298{
299  /* Next accelerator.  */
300  struct rc_accelerator *next;
301  /* Flags.  A combination of the ACC values defined below.  */
302  rc_uint_type flags;
303  /* Key value.  */
304  rc_uint_type key;
305  /* Resource ID.  */
306  rc_uint_type id;
307} rc_accelerator;
308
309struct __attribute__ ((__packed__)) bin_accelerator
310{
311  bfd_byte flags[2];
312  bfd_byte key[2];
313  bfd_byte id[2];
314  bfd_byte pad[2];
315};
316#define BIN_ACCELERATOR_SIZE  8
317
318/* Accelerator flags in the flags field of a rc_accelerator.
319   These are the same values that appear in a res file.  I hope.  */
320
321#define ACC_VIRTKEY	0x01
322#define ACC_NOINVERT	0x02
323#define ACC_SHIFT	0x04
324#define ACC_CONTROL	0x08
325#define ACC_ALT		0x10
326#define ACC_LAST	0x80
327
328/* A cursor resource.  */
329
330typedef struct rc_cursor
331{
332  /* X coordinate of hotspot.  */
333  bfd_signed_vma xhotspot;
334  /* Y coordinate of hotspot.  */
335  bfd_signed_vma yhotspot;
336  /* Length of bitmap data.  */
337  rc_uint_type length;
338  /* Data.  */
339  const bfd_byte *data;
340} rc_cursor;
341
342struct __attribute__ ((__packed__)) bin_cursor
343{
344  bfd_byte xhotspot[2];
345  bfd_byte yhotspot[2];
346};
347#define BIN_CURSOR_SIZE 4
348
349/* A group_cursor resource is a list of rc_i_group_cursor structures.  */
350
351typedef struct rc_group_cursor
352{
353  /* Next cursor in group.  */
354  struct rc_group_cursor *next;
355  /* Width.  */
356  rc_uint_type width;
357  /* Height.  */
358  rc_uint_type height;
359  /* Planes.  */
360  rc_uint_type planes;
361  /* Bits per pixel.  */
362  rc_uint_type bits;
363  /* Number of bytes in cursor resource.  */
364  rc_uint_type bytes;
365  /* Index of cursor resource.  */
366  rc_uint_type index;
367} rc_group_cursor;
368
369struct __attribute__ ((__packed__)) bin_group_cursor_item
370{
371  bfd_byte width[2];
372  bfd_byte height[2];
373  bfd_byte planes[2];
374  bfd_byte bits[2];
375  bfd_byte bytes[4];
376  bfd_byte index[2];
377};
378#define BIN_GROUP_CURSOR_ITEM_SIZE 14
379
380struct __attribute__ ((__packed__)) bin_group_cursor
381{
382  bfd_byte sig1[2];
383  bfd_byte sig2[2];
384  bfd_byte nitems[2];
385  /* struct bin_group_cursor_item item[nitems]; */
386};
387#define BIN_GROUP_CURSOR_SIZE 6
388
389/* A dialog resource.  */
390
391typedef struct rc_dialog
392{
393  /* Basic window style.  */
394  unsigned int style;
395  /* Extended window style.  */
396  rc_uint_type exstyle;
397  /* X coordinate.  */
398  rc_uint_type x;
399  /* Y coordinate.  */
400  rc_uint_type y;
401  /* Width.  */
402  rc_uint_type width;
403  /* Height.  */
404  rc_uint_type height;
405  /* Menu name.  */
406  rc_res_id menu;
407  /* Class name.  */
408  rc_res_id class;
409  /* Caption.  */
410  unichar *caption;
411  /* Font point size.  */
412  rc_uint_type pointsize;
413  /* Font name.  */
414  unichar *font;
415  /* Extended information for a dialogex.  */
416  struct rc_dialog_ex *ex;
417  /* Controls.  */
418  struct rc_dialog_control *controls;
419} rc_dialog;
420
421struct __attribute__ ((__packed__)) bin_dialog
422{
423  bfd_byte style[4];
424  bfd_byte exstyle[4];
425  bfd_byte off[2];
426  bfd_byte x[2];
427  bfd_byte y[2];
428  bfd_byte width[2];
429  bfd_byte height[2];
430};
431#define BIN_DIALOG_SIZE 18
432
433/* An extended dialog has additional information.  */
434
435typedef struct rc_dialog_ex
436{
437  /* Help ID.  */
438  rc_uint_type help;
439  /* Font weight.  */
440  rc_uint_type weight;
441  /* Whether the font is italic.  */
442  bfd_byte italic;
443  /* Character set.  */
444  bfd_byte charset;
445} rc_dialog_ex;
446
447struct __attribute__ ((__packed__)) bin_dialogex
448{
449  bfd_byte sig1[2];
450  bfd_byte sig2[2];
451  bfd_byte help[4];
452  bfd_byte exstyle[4];
453  bfd_byte style[4];
454  bfd_byte off[2];
455  bfd_byte x[2];
456  bfd_byte y[2];
457  bfd_byte width[2];
458  bfd_byte height[2];
459};
460#define BIN_DIALOGEX_SIZE 26
461
462struct __attribute__ ((__packed__)) bin_dialogfont
463{
464  bfd_byte pointsize[2];
465};
466#define BIN_DIALOGFONT_SIZE 2
467
468struct __attribute__ ((__packed__)) bin_dialogexfont
469{
470  bfd_byte pointsize[2];
471  bfd_byte weight[2];
472  bfd_byte italic[1];
473  bfd_byte charset[1];
474};
475#define BIN_DIALOGEXFONT_SIZE 6
476
477/* Window style flags, from the winsup Defines.h header file.  These
478   can appear in the style field of a rc_dialog or a rc_dialog_control.  */
479
480#define CW_USEDEFAULT	0x80000000
481#define WS_BORDER	0x800000L
482#define WS_CAPTION	0xc00000L
483#define WS_CHILD	0x40000000L
484#define WS_CHILDWINDOW	0x40000000L
485#define WS_CLIPCHILDREN	0x2000000L
486#define WS_CLIPSIBLINGS	0x4000000L
487#define WS_DISABLED	0x8000000L
488#define WS_DLGFRAME	0x400000L
489#define WS_GROUP	0x20000L
490#define WS_HSCROLL	0x100000L
491#define WS_ICONIC	0x20000000L
492#define WS_MAXIMIZE	0x1000000L
493#define WS_MAXIMIZEBOX	0x10000L
494#define WS_MINIMIZE	0x20000000L
495#define WS_MINIMIZEBOX	0x20000L
496#define WS_OVERLAPPED	0L
497#define WS_OVERLAPPEDWINDOW	0xcf0000L
498#define WS_POPUP	0x80000000L
499#define WS_POPUPWINDOW	0x80880000L
500#define WS_SIZEBOX	0x40000L
501#define WS_SYSMENU	0x80000L
502#define WS_TABSTOP	0x10000L
503#define WS_THICKFRAME	0x40000L
504#define WS_TILED	0L
505#define WS_TILEDWINDOW	0xcf0000L
506#define WS_VISIBLE	0x10000000L
507#define WS_VSCROLL	0x200000L
508#define MDIS_ALLCHILDSTYLES	0x1
509#define BS_3STATE	0x5L
510#define BS_AUTO3STATE	0x6L
511#define BS_AUTOCHECKBOX	0x3L
512#define BS_AUTORADIOBUTTON	0x9L
513#define BS_BITMAP	0x80L
514#define BS_BOTTOM	0x800L
515#define BS_CENTER	0x300L
516#define BS_CHECKBOX	0x2L
517#define BS_DEFPUSHBUTTON	0x1L
518#define BS_GROUPBOX	0x7L
519#define BS_ICON		0x40L
520#define BS_LEFT		0x100L
521#define BS_LEFTTEXT	0x20L
522#define BS_MULTILINE	0x2000L
523#define BS_NOTIFY	0x4000L
524#define BS_OWNERDRAW	0xbL
525#define BS_PUSHBOX	0xcL		/* FIXME!  What should this be?  */
526#define BS_PUSHBUTTON	0L
527#define BS_PUSHLIKE	0x1000L
528#define BS_RADIOBUTTON	0x4L
529#define BS_RIGHT	0x200L
530#define BS_RIGHTBUTTON	0x20L
531#define BS_TEXT		0L
532#define BS_TOP		0x400L
533#define BS_USERBUTTON	0x8L
534#define BS_VCENTER	0xc00L
535#define CBS_AUTOHSCROLL	0x40L
536#define CBS_DISABLENOSCROLL	0x800L
537#define CBS_DROPDOWN	0x2L
538#define CBS_DROPDOWNLIST	0x3L
539#define CBS_HASSTRINGS	0x200L
540#define CBS_LOWERCASE	0x4000L
541#define CBS_NOINTEGRALHEIGHT	0x400L
542#define CBS_OEMCONVERT	0x80L
543#define CBS_OWNERDRAWFIXED	0x10L
544#define CBS_OWNERDRAWVARIABLE	0x20L
545#define CBS_SIMPLE	0x1L
546#define CBS_SORT	0x100L
547#define CBS_UPPERCASE	0x2000L
548#define ES_AUTOHSCROLL	0x80L
549#define ES_AUTOVSCROLL	0x40L
550#define ES_CENTER	0x1L
551#define ES_LEFT		0L
552#define ES_LOWERCASE	0x10L
553#define ES_MULTILINE	0x4L
554#define ES_NOHIDESEL	0x100L
555#define ES_NUMBER	0x2000L
556#define ES_OEMCONVERT	0x400L
557#define ES_PASSWORD	0x20L
558#define ES_READONLY	0x800L
559#define ES_RIGHT	0x2L
560#define ES_UPPERCASE	0x8L
561#define ES_WANTRETURN	0x1000L
562#define LBS_DISABLENOSCROLL	0x1000L
563#define LBS_EXTENDEDSEL	0x800L
564#define LBS_HASSTRINGS	0x40L
565#define LBS_MULTICOLUMN	0x200L
566#define LBS_MULTIPLESEL	0x8L
567#define LBS_NODATA	0x2000L
568#define LBS_NOINTEGRALHEIGHT	0x100L
569#define LBS_NOREDRAW	0x4L
570#define LBS_NOSEL	0x4000L
571#define LBS_NOTIFY	0x1L
572#define LBS_OWNERDRAWFIXED	0x10L
573#define LBS_OWNERDRAWVARIABLE	0x20L
574#define LBS_SORT	0x2L
575#define LBS_STANDARD	0xa00003L
576#define LBS_USETABSTOPS	0x80L
577#define LBS_WANTKEYBOARDINPUT	0x400L
578#define SBS_BOTTOMALIGN	0x4L
579#define SBS_HORZ	0L
580#define SBS_LEFTALIGN	0x2L
581#define SBS_RIGHTALIGN	0x4L
582#define SBS_SIZEBOX	0x8L
583#define SBS_SIZEBOXBOTTOMRIGHTALIGN	0x4L
584#define SBS_SIZEBOXTOPLEFTALIGN	0x2L
585#define SBS_SIZEGRIP	0x10L
586#define SBS_TOPALIGN	0x2L
587#define SBS_VERT	0x1L
588#define SS_BITMAP	0xeL
589#define SS_BLACKFRAME	0x7L
590#define SS_BLACKRECT	0x4L
591#define SS_CENTER	0x1L
592#define SS_CENTERIMAGE	0x200L
593#define SS_ENHMETAFILE	0xfL
594#define SS_ETCHEDFRAME	0x12L
595#define SS_ETCHEDHORZ	0x10L
596#define SS_ETCHEDVERT	0x11L
597#define SS_GRAYFRAME	0x8L
598#define SS_GRAYRECT	0x5L
599#define SS_ICON		0x3L
600#define SS_LEFT		0L
601#define SS_LEFTNOWORDWRAP	0xcL
602#define SS_NOPREFIX	0x80L
603#define SS_NOTIFY	0x100L
604#define SS_OWNERDRAW	0xdL
605#define SS_REALSIZEIMAGE	0x800L
606#define SS_RIGHT	0x2L
607#define SS_RIGHTJUST	0x400L
608#define SS_SIMPLE	0xbL
609#define SS_SUNKEN	0x1000L
610#define SS_USERITEM     0xaL
611#define SS_WHITEFRAME	0x9L
612#define SS_WHITERECT	0x6L
613#define DS_3DLOOK	0x4L
614#define DS_ABSALIGN	0x1L
615#define DS_CENTER	0x800L
616#define DS_CENTERMOUSE	0x1000L
617#define DS_CONTEXTHELP	0x2000L
618#define DS_CONTROL	0x400L
619#define DS_FIXEDSYS	0x8L
620#define DS_LOCALEDIT	0x20L
621#define DS_MODALFRAME	0x80L
622#define DS_NOFAILCREATE	0x10L
623#define DS_NOIDLEMSG	0x100L
624#define DS_SETFONT	0x40L
625#define DS_SETFOREGROUND	0x200L
626#define DS_SYSMODAL	0x2L
627
628/* A dialog control.  */
629
630typedef struct rc_dialog_control
631{
632  /* Next control.  */
633  struct rc_dialog_control *next;
634  /* ID.  */
635  rc_uint_type id;
636  /* Style.  */
637  rc_uint_type style;
638  /* Extended style.  */
639  rc_uint_type exstyle;
640  /* X coordinate.  */
641  rc_uint_type x;
642  /* Y coordinate.  */
643  rc_uint_type y;
644  /* Width.  */
645  rc_uint_type width;
646  /* Height.  */
647  rc_uint_type height;
648  /* Class name.  */
649  rc_res_id class;
650  /* Associated text.  */
651  rc_res_id text;
652  /* Extra data for the window procedure.  */
653  struct rc_rcdata_item *data;
654  /* Help ID.  Only used in an extended dialog.  */
655  rc_uint_type help;
656} rc_dialog_control;
657
658struct __attribute__ ((__packed__)) bin_dialog_control
659{
660  bfd_byte style[4];
661  bfd_byte exstyle[4];
662  bfd_byte x[2];
663  bfd_byte y[2];
664  bfd_byte width[2];
665  bfd_byte height[2];
666  bfd_byte id[2];
667};
668#define BIN_DIALOG_CONTROL_SIZE 18
669
670struct __attribute__ ((__packed__)) bin_dialogex_control
671{
672  bfd_byte help[4];
673  bfd_byte exstyle[4];
674  bfd_byte style[4];
675  bfd_byte x[2];
676  bfd_byte y[2];
677  bfd_byte width[2];
678  bfd_byte height[2];
679  bfd_byte id[4];
680};
681#define BIN_DIALOGEX_CONTROL_SIZE 24
682
683/* Control classes.  These can be used as the ID field in a rc_dialog_control.  */
684
685#define CTL_BUTTON	0x80
686#define CTL_EDIT	0x81
687#define CTL_STATIC	0x82
688#define CTL_LISTBOX	0x83
689#define CTL_SCROLLBAR	0x84
690#define CTL_COMBOBOX	0x85
691
692/* A fontdir resource is a list of rc_fontdir.  */
693
694typedef struct rc_fontdir
695{
696  struct rc_fontdir *next;
697  /* Index of font entry.  */
698  rc_uint_type index;
699  /* Length of font information.  */
700  rc_uint_type length;
701  /* Font information.  */
702  const bfd_byte *data;
703} rc_fontdir;
704
705struct __attribute__ ((__packed__)) bin_fontdir_item
706{
707  bfd_byte index[2];
708  bfd_byte header[54];
709  bfd_byte device_name[1];
710  /* bfd_byte face_name[]; */
711};
712
713/* A group_icon resource is a list of rc_group_icon.  */
714
715typedef struct rc_group_icon
716{
717  /* Next icon in group.  */
718  struct rc_group_icon *next;
719  /* Width.  */
720  bfd_byte width;
721  /* Height.  */
722  bfd_byte height;
723  /* Color count.  */
724  bfd_byte colors;
725  /* Planes.  */
726  rc_uint_type planes;
727  /* Bits per pixel.  */
728  rc_uint_type bits;
729  /* Number of bytes in cursor resource.  */
730  rc_uint_type bytes;
731  /* Index of cursor resource.  */
732  rc_uint_type index;
733} rc_group_icon;
734
735struct __attribute__ ((__packed__)) bin_group_icon
736{
737  bfd_byte sig1[2];
738  bfd_byte sig2[2];
739  bfd_byte count[2];
740};
741#define BIN_GROUP_ICON_SIZE 6
742
743struct __attribute__ ((__packed__)) bin_group_icon_item
744{
745  bfd_byte width[1];
746  bfd_byte height[1];
747  bfd_byte colors[1];
748  bfd_byte pad[1];
749  bfd_byte planes[2];
750  bfd_byte bits[2];
751  bfd_byte bytes[4];
752  bfd_byte index[2];
753};
754#define BIN_GROUP_ICON_ITEM_SIZE 14
755
756/* A menu resource.  */
757
758typedef struct rc_menu
759{
760  /* List of menuitems.  */
761  struct rc_menuitem *items;
762  /* Help ID.  I don't think there is any way to set this in an rc
763     file, but it can appear in the binary format.  */
764  rc_uint_type help;
765} rc_menu;
766
767struct __attribute__ ((__packed__)) bin_menu
768{
769  bfd_byte sig1[2];
770  bfd_byte sig2[2];
771};
772#define BIN_MENU_SIZE 4
773
774struct __attribute__ ((__packed__)) bin_menuex
775{
776  bfd_byte sig1[2];
777  bfd_byte sig2[2];
778  bfd_byte help[4];
779};
780#define BIN_MENUEX_SIZE 8
781
782/* A menu resource is a list of rc_menuitem.  */
783
784typedef struct rc_menuitem
785{
786  /* Next menu item.  */
787  struct rc_menuitem *next;
788  /* Type.  In a normal menu, rather than a menuex, this is the flags
789     field.  */
790  rc_uint_type type;
791  /* State.  This is only used in a menuex.  */
792  rc_uint_type state;
793  /* Id.  */
794  rc_uint_type id;
795  /* Unicode text.  */
796  unichar *text;
797  /* Popup menu items for a popup.  */
798  struct rc_menuitem *popup;
799  /* Help ID.  This is only used in a menuex.  */
800  rc_uint_type help;
801} rc_menuitem;
802
803struct __attribute__ ((__packed__)) bin_menuitem
804{
805  bfd_byte flags[2];
806  bfd_byte id[2];
807};
808#define BIN_MENUITEM_SIZE  4
809#define BIN_MENUITEM_POPUP_SIZE  2
810
811struct __attribute__ ((__packed__)) bin_menuitemex
812{
813  bfd_byte type[4];
814  bfd_byte state[4];
815  bfd_byte id[4];
816  bfd_byte flags[2];
817  /* unicode text */
818  /* if popup: align, bfd_byte help[4], align, bin_menuitemex[]; */
819};
820#define BIN_MENUITEMEX_SIZE 14
821
822/* Menu item flags.  These can appear in the flags field of a rc_menuitem.  */
823
824#define MENUITEM_GRAYED		0x001
825#define MENUITEM_INACTIVE	0x002
826#define MENUITEM_BITMAP		0x004
827#define MENUITEM_OWNERDRAW	0x100
828#define MENUITEM_CHECKED	0x008
829#define MENUITEM_POPUP		0x010
830#define MENUITEM_MENUBARBREAK	0x020
831#define MENUITEM_MENUBREAK	0x040
832#define MENUITEM_ENDMENU	0x080
833#define MENUITEM_HELP	       0x4000
834
835/* An rcdata resource is a pointer to a list of rc_rcdata_item.  */
836
837typedef struct rc_rcdata_item
838{
839  /* Next data item.  */
840  struct rc_rcdata_item *next;
841  /* Type of data.  */
842  enum
843  {
844    RCDATA_WORD,
845    RCDATA_DWORD,
846    RCDATA_STRING,
847    RCDATA_WSTRING,
848    RCDATA_BUFFER
849  } type;
850  union
851  {
852    rc_uint_type word;
853    rc_uint_type dword;
854    struct
855    {
856      rc_uint_type length;
857      const char *s;
858    } string;
859    struct
860    {
861      rc_uint_type length;
862      const unichar *w;
863    } wstring;
864    struct
865    {
866      rc_uint_type length;
867      const bfd_byte *data;
868    } buffer;
869  } u;
870} rc_rcdata_item;
871
872/* A stringtable resource is a pointer to a rc_stringtable.  */
873
874typedef struct rc_stringtable
875{
876  /* Each stringtable resource is a list of 16 unicode strings.  */
877  struct
878  {
879    /* Length of string.  */
880    rc_uint_type length;
881    /* String data if length > 0.  */
882    unichar *string;
883  } strings[16];
884} rc_stringtable;
885
886/* A versioninfo resource points to a rc_versioninfo.  */
887
888typedef struct rc_versioninfo
889{
890  /* Fixed version information.  */
891  struct rc_fixed_versioninfo *fixed;
892  /* Variable version information.  */
893  struct rc_ver_info *var;
894} rc_versioninfo;
895
896struct __attribute__ ((__packed__)) bin_versioninfo
897{
898  bfd_byte size[2];
899  bfd_byte fixed_size[2];
900  bfd_byte sig2[2];
901};
902#define BIN_VERSIONINFO_SIZE 6
903
904/* The fixed portion of a versioninfo resource.  */
905
906typedef struct rc_fixed_versioninfo
907{
908  /* The file version, which is two 32 bit integers.  */
909  rc_uint_type file_version_ms;
910  rc_uint_type file_version_ls;
911  /* The product version, which is two 32 bit integers.  */
912  rc_uint_type product_version_ms;
913  rc_uint_type product_version_ls;
914  /* The file flags mask.  */
915  rc_uint_type file_flags_mask;
916  /* The file flags.  */
917  rc_uint_type file_flags;
918  /* The OS type.  */
919  rc_uint_type file_os;
920  /* The file type.  */
921  rc_uint_type file_type;
922  /* The file subtype.  */
923  rc_uint_type file_subtype;
924  /* The date, which in Windows is two 32 bit integers.  */
925  rc_uint_type file_date_ms;
926  rc_uint_type file_date_ls;
927} rc_fixed_versioninfo;
928
929struct __attribute__ ((__packed__)) bin_fixed_versioninfo
930{
931  bfd_byte sig1[4];
932  bfd_byte sig2[4];
933  bfd_byte file_version[4];
934  bfd_byte file_version_ls[4];
935  bfd_byte product_version_ms[4];
936  bfd_byte product_version_ls[4];
937  bfd_byte file_flags_mask[4];
938  bfd_byte file_flags[4];
939  bfd_byte file_os[4];
940  bfd_byte file_type[4];
941  bfd_byte file_subtype[4];
942  bfd_byte file_date_ms[4];
943  bfd_byte file_date_ls[4];
944};
945#define BIN_FIXED_VERSIONINFO_SIZE 52
946
947/* A list of variable version information.  */
948
949typedef struct rc_ver_info
950{
951  /* Next item.  */
952  struct rc_ver_info *next;
953  /* Type of data.  */
954  enum { VERINFO_STRING, VERINFO_VAR } type;
955  union
956  {
957    /* StringFileInfo data.  */
958    struct
959    {
960      /* Language.  */
961      unichar *language;
962      /* Strings.  */
963      struct rc_ver_stringinfo *strings;
964    } string;
965    /* VarFileInfo data.  */
966    struct
967    {
968      /* Key.  */
969      unichar *key;
970      /* Values.  */
971      struct rc_ver_varinfo *var;
972    } var;
973  } u;
974} rc_ver_info;
975
976struct __attribute__ ((__packed__)) bin_ver_info
977{
978  bfd_byte size[2];
979  bfd_byte sig1[2];
980  bfd_byte sig2[2];
981};
982#define BIN_VER_INFO_SIZE 6
983
984/* A list of string version information.  */
985
986typedef struct rc_ver_stringinfo
987{
988  /* Next string.  */
989  struct rc_ver_stringinfo *next;
990  /* Key.  */
991  unichar *key;
992  /* Value.  */
993  unichar *value;
994} rc_ver_stringinfo;
995
996/* A list of variable version information.  */
997
998typedef struct rc_ver_varinfo
999{
1000  /* Next item.  */
1001  struct rc_ver_varinfo *next;
1002  /* Language ID.  */
1003  rc_uint_type language;
1004  /* Character set ID.  */
1005  rc_uint_type charset;
1006} rc_ver_varinfo;
1007
1008typedef struct rc_toolbar_item
1009{
1010  struct rc_toolbar_item *next;
1011  struct rc_toolbar_item *prev;
1012  rc_res_id id;
1013} rc_toolbar_item;
1014
1015struct __attribute__ ((__packed__)) bin_messagetable_item
1016{
1017  bfd_byte length[2];
1018  bfd_byte flags[2];
1019  bfd_byte data[1];
1020};
1021#define BIN_MESSAGETABLE_ITEM_SIZE  4
1022
1023#define MESSAGE_RESOURCE_UNICODE  0x0001
1024
1025struct __attribute__ ((__packed__)) bin_messagetable_block
1026{
1027  bfd_byte lowid[4];
1028  bfd_byte highid[4];
1029  bfd_byte offset[4];
1030};
1031#define BIN_MESSAGETABLE_BLOCK_SIZE 12
1032
1033struct __attribute__ ((__packed__)) bin_messagetable
1034{
1035  bfd_byte cblocks[4];
1036  struct bin_messagetable_block items[1];
1037};
1038#define BIN_MESSAGETABLE_SIZE 8
1039
1040typedef struct rc_toolbar
1041{
1042  rc_uint_type button_width;
1043  rc_uint_type button_height;
1044  rc_uint_type nitems;
1045  rc_toolbar_item *items;
1046} rc_toolbar;
1047
1048struct __attribute__ ((__packed__)) bin_toolbar
1049{
1050  bfd_byte button_width[4];
1051  bfd_byte button_height[4];
1052  bfd_byte nitems[4];
1053  /* { bfd_byte id[4]; } * nitems; */
1054};
1055#define BIN_TOOLBAR_SIZE 12
1056
1057extern int target_is_bigendian;
1058
1059typedef struct windres_bfd
1060{
1061  bfd *abfd;
1062  asection *sec;
1063  rc_uint_type kind : 4;
1064} windres_bfd;
1065
1066#define WR_KIND_TARGET	  0
1067#define WR_KIND_BFD	  1
1068#define WR_KIND_BFD_BIN_L 2
1069#define WR_KIND_BFD_BIN_B 3
1070
1071#define WR_KIND(PTR)  (PTR)->kind
1072#define WR_SECTION(PTR)	(PTR)->sec
1073#define WR_BFD(PTR) (PTR)->abfd
1074
1075extern void set_windres_bfd_content (windres_bfd *, const void *, rc_uint_type, rc_uint_type);
1076extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uint_type);
1077
1078extern void windres_put_8 (windres_bfd *, void *, rc_uint_type);
1079extern void windres_put_16 (windres_bfd *, void *, rc_uint_type);
1080extern void windres_put_32 (windres_bfd *, void *, rc_uint_type);
1081extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type);
1082extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type);
1083extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type);
1084
1085extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type);
1086extern void set_windres_bfd_endianess (windres_bfd *, int);
1087
1088#endif
1089