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