1 %
{ /* rcparse.y -- parser for Windows rc files
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GNU Binutils.
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.
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.
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
22 /* This is a parser for Windows rc files. It is based on the parser
23 by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */
27 #include "libiberty.h"
29 #include "safe-ctype.h"
31 /* The current language. */
33 static unsigned short language
;
35 /* The resource information during a sub statement. */
37 static struct res_res_info sub_res_info
;
39 /* Dialog information. This is built by the nonterminals styles and
42 static struct dialog dialog
;
44 /* This is used when building a style. It is modified by the
45 nonterminal styleexpr. */
47 static unsigned long style
;
49 /* These are used when building a control. They are set before using
52 static unsigned long base_style
;
53 static unsigned long default_style
;
54 static unsigned long class
;
60 struct accelerator acc
;
61 struct accelerator
*pacc
;
62 struct dialog_control
*dialog_control
;
63 struct menuitem
*menuitem
;
66 struct rcdata_item
*first
;
67 struct rcdata_item
*last
;
69 struct rcdata_item
*rcdata_item
;
70 struct stringtable_data
*stringtable
;
71 struct fixed_versioninfo
*fixver
;
72 struct ver_info
*verinfo
;
73 struct ver_stringinfo
*verstring
;
74 struct ver_varinfo
*vervar
;
76 struct res_res_info res_info
;
85 /* Nonzero if this number was explicitly specified as long. */
99 %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
102 %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE
103 %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT
104 %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON
105 %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON
106 %token BEDIT HEDIT IEDIT
109 %token LANGUAGE CHARACTERISTICS VERSIONK
110 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE
111 %token MENUBARBREAK MENUBREAK
115 %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS
116 %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO
119 %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE
121 %token
<s
> QUOTEDSTRING STRING
123 %token
<ss
> SIZEDSTRING
126 %type
<pacc
> acc_entries
127 %type
<acc
> acc_entry acc_event
128 %type
<dialog_control
> control control_params
129 %type
<menuitem
> menuitems menuitem menuexitems menuexitem
130 %type
<rcdata
> optrcdata_data optrcdata_data_int rcdata_data
131 %type
<rcdata_item
> opt_control_data
132 %type
<fixver
> fixedverinfo
133 %type
<verinfo
> verblocks
134 %type
<verstring
> vervals
135 %type
<vervar
> vertrans
136 %type
<res_info
> suboptions memflags_move_discard memflags_move
137 %type
<memflags
> memflag
139 %type
<il
> exstyle parennumber
140 %type
<il
> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr
141 %type
<is
> acc_options acc_option menuitem_flags menuitem_flag
142 %type
<s
> optstringc file_name resname
143 %type
<i
> sizednumexpr sizedposnumexpr
170 | input IGNORED_TOKEN
173 /* Accelerator resources. */
176 id ACCELERATORS suboptions BEG acc_entries END
178 define_accelerator
($1, &$3, $5);
179 if
(yychar != YYEMPTY
)
181 rcparse_discard_strings
();
190 | acc_entries acc_entry
192 struct accelerator
*a
;
194 a
= (struct accelerator
*) res_alloc
(sizeof
*a
);
200 struct accelerator
**pp
;
202 for
(pp
= &$1->next
; *pp
!= NULL
; pp
= &(*pp
)->next
)
211 acc_event cposnumexpr
216 | acc_event cposnumexpr
',' acc_options
221 if
(($$.flags
& ACC_VIRTKEY
) == 0
222 && ($$.flags
& (ACC_SHIFT | ACC_CONTROL
)) != 0)
223 rcparse_warning
(_
("inappropriate modifiers for non-VIRTKEY"));
240 $$.flags
= ACC_CONTROL | ACC_VIRTKEY
;
247 rcparse_warning
(_
("accelerator should only be one character"));
263 | acc_options
',' acc_option
267 /* I've had one report that the comma is optional. */
268 | acc_options acc_option
281 /* This is just the absence of VIRTKEY. */
302 /* Bitmap resources. */
305 id BITMAP memflags_move file_name
307 define_bitmap
($1, &$3, $4);
308 if
(yychar != YYEMPTY
)
310 rcparse_discard_strings
();
314 /* Cursor resources. */
317 id CURSOR memflags_move_discard file_name
319 define_cursor
($1, &$3, $4);
320 if
(yychar != YYEMPTY
)
322 rcparse_discard_strings
();
326 /* Dialog resources. */
329 id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr
332 memset
(&dialog
, 0, sizeof dialog
);
337 dialog.style
= WS_POPUP | WS_BORDER | WS_SYSMENU
;
339 dialog.menu.named
= 1;
340 dialog.class.named
= 1;
343 dialog.controls
= NULL
;
347 styles BEG controls END
349 define_dialog
($1, &sub_res_info
, &dialog
);
350 if
(yychar != YYEMPTY
)
352 rcparse_discard_strings
();
354 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
357 memset
(&dialog
, 0, sizeof dialog
);
362 dialog.style
= WS_POPUP | WS_BORDER | WS_SYSMENU
;
364 dialog.menu.named
= 1;
365 dialog.class.named
= 1;
367 dialog.ex
= ((struct dialog_ex
*)
368 res_alloc
(sizeof
(struct dialog_ex
)));
369 memset
(dialog.ex
, 0, sizeof
(struct dialog_ex
));
370 dialog.controls
= NULL
;
374 styles BEG controls END
376 define_dialog
($1, &sub_res_info
, &dialog
);
377 if
(yychar != YYEMPTY
)
379 rcparse_discard_strings
();
381 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
384 memset
(&dialog
, 0, sizeof dialog
);
389 dialog.style
= WS_POPUP | WS_BORDER | WS_SYSMENU
;
391 dialog.menu.named
= 1;
392 dialog.class.named
= 1;
394 dialog.ex
= ((struct dialog_ex
*)
395 res_alloc
(sizeof
(struct dialog_ex
)));
396 memset
(dialog.ex
, 0, sizeof
(struct dialog_ex
));
397 dialog.ex
->help
= $9;
398 dialog.controls
= NULL
;
402 styles BEG controls END
404 define_dialog
($1, &sub_res_info
, &dialog
);
405 if
(yychar != YYEMPTY
)
407 rcparse_discard_strings
();
416 | EXSTYLE
'=' numexpr
424 | styles CAPTION QUOTEDSTRING
426 dialog.style |
= WS_CAPTION
;
428 unicode_from_ascii
((int *) NULL
, &dialog.caption
, $3);
437 dialog.style
= style
;
439 | styles EXSTYLE numexpr
443 | styles CLASS QUOTEDSTRING
445 res_string_to_id
(& dialog.class
, $3);
447 | styles FONT numexpr
',' QUOTEDSTRING
449 dialog.style |
= DS_SETFONT
;
451 dialog.pointsize
= $3;
452 unicode_from_ascii
((int *) NULL
, &dialog.font
, $5);
453 if
(dialog.ex
!= NULL
)
455 dialog.ex
->weight
= 0;
456 dialog.ex
->italic
= 0;
457 dialog.ex
->charset
= 1;
460 | styles FONT numexpr
',' QUOTEDSTRING cnumexpr
462 dialog.style |
= DS_SETFONT
;
464 dialog.pointsize
= $3;
465 unicode_from_ascii
((int *) NULL
, &dialog.font
, $5);
466 if
(dialog.ex
== NULL
)
467 rcparse_warning
(_
("extended FONT requires DIALOGEX"));
470 dialog.ex
->weight
= $6;
471 dialog.ex
->italic
= 0;
472 dialog.ex
->charset
= 1;
475 | styles FONT numexpr
',' QUOTEDSTRING cnumexpr cnumexpr
477 dialog.style |
= DS_SETFONT
;
479 dialog.pointsize
= $3;
480 unicode_from_ascii
((int *) NULL
, &dialog.font
, $5);
481 if
(dialog.ex
== NULL
)
482 rcparse_warning
(_
("extended FONT requires DIALOGEX"));
485 dialog.ex
->weight
= $6;
486 dialog.ex
->italic
= $7;
487 dialog.ex
->charset
= 1;
490 | styles FONT numexpr
',' QUOTEDSTRING cnumexpr cnumexpr cnumexpr
492 dialog.style |
= DS_SETFONT
;
494 dialog.pointsize
= $3;
495 unicode_from_ascii
((int *) NULL
, &dialog.font
, $5);
496 if
(dialog.ex
== NULL
)
497 rcparse_warning
(_
("extended FONT requires DIALOGEX"));
500 dialog.ex
->weight
= $6;
501 dialog.ex
->italic
= $7;
502 dialog.ex
->charset
= $8;
509 | styles CHARACTERISTICS numexpr
511 sub_res_info.characteristics
= $3;
513 | styles LANGUAGE numexpr cnumexpr
515 sub_res_info.language
= $3 |
($4 << SUBLANG_SHIFT
);
517 | styles VERSIONK numexpr
519 sub_res_info.version
= $3;
527 struct dialog_control
**pp
;
529 for
(pp
= &dialog.controls
; *pp
!= NULL
; pp
= &(*pp
)->next
)
538 default_style
= BS_AUTO3STATE | WS_TABSTOP
;
539 base_style
= BS_AUTO3STATE
;
548 default_style
= BS_AUTOCHECKBOX | WS_TABSTOP
;
549 base_style
= BS_AUTOCHECKBOX
;
558 default_style
= BS_AUTORADIOBUTTON | WS_TABSTOP
;
559 base_style
= BS_AUTORADIOBUTTON
;
568 default_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
569 base_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
575 if
(dialog.ex
== NULL
)
576 rcparse_warning
(_
("BEDIT requires DIALOGEX"));
577 res_string_to_id
(&$$
->class
, "BEDIT");
581 default_style
= BS_CHECKBOX | WS_TABSTOP
;
582 base_style
= BS_CHECKBOX | WS_TABSTOP
;
591 default_style
= CBS_SIMPLE | WS_TABSTOP
;
593 class
= CTL_COMBOBOX
;
599 | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr
600 cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
602 $$
= define_control
($2, $3, $6, $7, $8, $9, $4, style
, $10);
605 if
(dialog.ex
== NULL
)
606 rcparse_warning
(_
("control data requires DIALOGEX"));
610 | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr
611 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
613 $$
= define_control
($2, $3, $6, $7, $8, $9, $4, style
, $10);
614 if
(dialog.ex
== NULL
)
615 rcparse_warning
(_
("help ID requires DIALOGEX"));
619 | CONTROL optstringc numexpr
',' QUOTEDSTRING control_styleexpr
620 cnumexpr cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
622 $$
= define_control
($2, $3, $7, $8, $9, $10, 0, style
, $11);
625 if
(dialog.ex
== NULL
)
626 rcparse_warning
("control data requires DIALOGEX");
630 unicode_from_ascii
(&$$
->class.u.n.length
, &$$
->class.u.n.name
, $5);
632 | CONTROL optstringc numexpr
',' QUOTEDSTRING control_styleexpr
633 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
635 $$
= define_control
($2, $3, $7, $8, $9, $10, 0, style
, $11);
636 if
(dialog.ex
== NULL
)
637 rcparse_warning
("help ID requires DIALOGEX");
641 unicode_from_ascii
(&$$
->class.u.n.length
, &$$
->class.u.n.name
, $5);
645 default_style
= SS_CENTER | WS_GROUP
;
646 base_style
= SS_CENTER
;
655 default_style
= BS_DEFPUSHBUTTON | WS_TABSTOP
;
656 base_style
= BS_DEFPUSHBUTTON | WS_TABSTOP
;
665 default_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
666 base_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
675 default_style
= BS_GROUPBOX
;
676 base_style
= BS_GROUPBOX
;
685 default_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
686 base_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
692 if
(dialog.ex
== NULL
)
693 rcparse_warning
(_
("IEDIT requires DIALOGEX"));
694 res_string_to_id
(&$$
->class
, "HEDIT");
696 | ICON resref numexpr cnumexpr cnumexpr opt_control_data
698 $$
= define_icon_control
($2, $3, $4, $5, 0, 0, 0, $6,
701 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
704 $$
= define_icon_control
($2, $3, $4, $5, 0, 0, 0, $8,
707 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
708 icon_styleexpr optcnumexpr opt_control_data
710 $$
= define_icon_control
($2, $3, $4, $5, style
, $9, 0, $10,
713 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
714 icon_styleexpr cnumexpr cnumexpr opt_control_data
716 $$
= define_icon_control
($2, $3, $4, $5, style
, $9, $10, $11,
721 default_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
722 base_style
= ES_LEFT | WS_BORDER | WS_TABSTOP
;
728 if
(dialog.ex
== NULL
)
729 rcparse_warning
(_
("IEDIT requires DIALOGEX"));
730 res_string_to_id
(&$$
->class
, "IEDIT");
734 default_style
= LBS_NOTIFY | WS_BORDER
;
735 base_style
= LBS_NOTIFY | WS_BORDER
;
744 default_style
= SS_LEFT | WS_GROUP
;
745 base_style
= SS_LEFT
;
754 default_style
= BS_PUSHBOX | WS_TABSTOP
;
755 base_style
= BS_PUSHBOX
;
764 default_style
= BS_PUSHBUTTON | WS_TABSTOP
;
765 base_style
= BS_PUSHBUTTON | WS_TABSTOP
;
774 default_style
= BS_RADIOBUTTON | WS_TABSTOP
;
775 base_style
= BS_RADIOBUTTON
;
784 default_style
= SS_RIGHT | WS_GROUP
;
785 base_style
= SS_RIGHT
;
794 default_style
= SBS_HORZ
;
796 class
= CTL_SCROLLBAR
;
804 default_style
= BS_3STATE | WS_TABSTOP
;
805 base_style
= BS_3STATE
;
812 | USERBUTTON QUOTEDSTRING
',' numexpr
',' numexpr
',' numexpr
','
813 numexpr
',' numexpr
','
814 { style
= WS_CHILD | WS_VISIBLE
; }
815 styleexpr optcnumexpr
817 $$
= define_control
($2, $4, $6, $8, $10, $12, CTL_BUTTON
,
822 /* Parameters for a control. The static variables DEFAULT_STYLE,
823 BASE_STYLE, and CLASS must be initialized before this nonterminal
824 is used. DEFAULT_STYLE is the style to use if no style expression
825 is specified. BASE_STYLE is the base style to use if a style
826 expression is specified; the style expression modifies the base
827 style. CLASS is the class of the control. */
830 optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
833 $$
= define_control
($1, $2, $3, $4, $5, $6, class
,
834 default_style | WS_CHILD | WS_VISIBLE
, 0);
837 if
(dialog.ex
== NULL
)
838 rcparse_warning
(_
("control data requires DIALOGEX"));
842 | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
843 control_params_styleexpr optcnumexpr opt_control_data
845 $$
= define_control
($1, $2, $3, $4, $5, $6, class
, style
, $8);
848 if
(dialog.ex
== NULL
)
849 rcparse_warning
(_
("control data requires DIALOGEX"));
853 | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
854 control_params_styleexpr cnumexpr cnumexpr opt_control_data
856 $$
= define_control
($1, $2, $3, $4, $5, $6, class
, style
, $8);
857 if
(dialog.ex
== NULL
)
858 rcparse_warning
(_
("help ID requires DIALOGEX"));
884 | BEG optrcdata_data END
890 /* These only exist to parse a reduction out of a common case. */
894 { style
= WS_CHILD | WS_VISIBLE
; }
900 { style
= SS_ICON | WS_CHILD | WS_VISIBLE
; }
904 control_params_styleexpr:
906 { style
= base_style | WS_CHILD | WS_VISIBLE
; }
910 /* Font resources. */
913 id FONT memflags_move_discard file_name
915 define_font
($1, &$3, $4);
916 if
(yychar != YYEMPTY
)
918 rcparse_discard_strings
();
922 /* Icon resources. */
925 id ICON memflags_move_discard file_name
927 define_icon
($1, &$3, $4);
928 if
(yychar != YYEMPTY
)
930 rcparse_discard_strings
();
934 /* Language command. This changes the static variable language, which
935 affects all subsequent resources. */
938 LANGUAGE numexpr cnumexpr
940 language
= $2 |
($3 << SUBLANG_SHIFT
);
944 /* Menu resources. */
947 id MENU suboptions BEG menuitems END
949 define_menu
($1, &$3, $5);
950 if
(yychar != YYEMPTY
)
952 rcparse_discard_strings
();
967 struct menuitem
**pp
;
969 for
(pp
= &$1->next
; *pp
!= NULL
; pp
= &(*pp
)->next
)
978 MENUITEM QUOTEDSTRING cnumexpr menuitem_flags
980 $$
= define_menuitem
($2, $3, $4, 0, 0, NULL
);
984 $$
= define_menuitem
(NULL
, 0, 0, 0, 0, NULL
);
986 | POPUP QUOTEDSTRING menuitem_flags BEG menuitems END
988 $$
= define_menuitem
($2, 0, $3, 0, 0, $5);
997 | menuitem_flags
',' menuitem_flag
1001 | menuitem_flags menuitem_flag
1010 $$
= MENUITEM_CHECKED
;
1014 $$
= MENUITEM_GRAYED
;
1022 $$
= MENUITEM_INACTIVE
;
1026 $$
= MENUITEM_MENUBARBREAK
;
1030 $$
= MENUITEM_MENUBREAK
;
1034 /* Menuex resources. */
1037 id MENUEX suboptions BEG menuexitems END
1039 define_menu
($1, &$3, $5);
1040 if
(yychar != YYEMPTY
)
1042 rcparse_discard_strings
();
1051 | menuexitems menuexitem
1057 struct menuitem
**pp
;
1059 for
(pp
= &$1->next
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1068 MENUITEM QUOTEDSTRING
1070 $$
= define_menuitem
($2, 0, 0, 0, 0, NULL
);
1072 | MENUITEM QUOTEDSTRING cnumexpr
1074 $$
= define_menuitem
($2, $3, 0, 0, 0, NULL
);
1076 | MENUITEM QUOTEDSTRING cnumexpr cnumexpr optcnumexpr
1078 $$
= define_menuitem
($2, $3, $4, $5, 0, NULL
);
1080 | MENUITEM SEPARATOR
1082 $$
= define_menuitem
(NULL
, 0, 0, 0, 0, NULL
);
1084 | POPUP QUOTEDSTRING BEG menuexitems END
1086 $$
= define_menuitem
($2, 0, 0, 0, 0, $4);
1088 | POPUP QUOTEDSTRING cnumexpr BEG menuexitems END
1090 $$
= define_menuitem
($2, $3, 0, 0, 0, $5);
1092 | POPUP QUOTEDSTRING cnumexpr cnumexpr BEG menuexitems END
1094 $$
= define_menuitem
($2, $3, $4, 0, 0, $6);
1096 | POPUP QUOTEDSTRING cnumexpr cnumexpr cnumexpr optcnumexpr
1099 $$
= define_menuitem
($2, $3, $4, $5, $6, $8);
1103 /* Messagetable resources. */
1106 id MESSAGETABLE memflags_move file_name
1108 define_messagetable
($1, &$3, $4);
1109 if
(yychar != YYEMPTY
)
1111 rcparse_discard_strings
();
1115 /* Rcdata resources. */
1118 id RCDATA suboptions BEG optrcdata_data END
1120 define_rcdata
($1, &$3, $5.first
);
1121 if
(yychar != YYEMPTY
)
1123 rcparse_discard_strings
();
1127 /* We use a different lexing algorithm, because rcdata strings may
1128 contain embedded null bytes, and we need to know the length to use. */
1156 struct rcdata_item
*ri
;
1158 ri
= define_rcdata_string
($1.s
, $1.length
);
1164 struct rcdata_item
*ri
;
1166 ri
= define_rcdata_number
($1.val
, $1.dword
);
1170 | rcdata_data
',' SIZEDSTRING
1172 struct rcdata_item
*ri
;
1174 ri
= define_rcdata_string
($3.s
, $3.length
);
1175 $$.first
= $1.first
;
1179 | rcdata_data
',' sizednumexpr
1181 struct rcdata_item
*ri
;
1183 ri
= define_rcdata_number
($3.val
, $3.dword
);
1184 $$.first
= $1.first
;
1190 /* Stringtable resources. */
1193 STRINGTABLE suboptions BEG
1194 { sub_res_info
= $2; }
1200 | string_data numexpr QUOTEDSTRING
1202 define_stringtable
(&sub_res_info
, $2, $3);
1203 if
(yychar != YYEMPTY
)
1205 rcparse_discard_strings
();
1207 | string_data numexpr
',' QUOTEDSTRING
1209 define_stringtable
(&sub_res_info
, $2, $4);
1210 if
(yychar != YYEMPTY
)
1212 rcparse_discard_strings
();
1216 /* User defined resources. We accept general suboptions in the
1217 file_name case to keep the parser happy. */
1220 id id suboptions BEG optrcdata_data END
1222 define_user_data
($1, $2, &$3, $5.first
);
1223 if
(yychar != YYEMPTY
)
1225 rcparse_discard_strings
();
1227 | id id suboptions file_name
1229 define_user_file
($1, $2, &$3, $4);
1230 if
(yychar != YYEMPTY
)
1232 rcparse_discard_strings
();
1236 /* Versioninfo resources. */
1239 id VERSIONINFO fixedverinfo BEG verblocks END
1241 define_versioninfo
($1, language
, $3, $5);
1242 if
(yychar != YYEMPTY
)
1244 rcparse_discard_strings
();
1251 $$
= ((struct fixed_versioninfo
*)
1252 res_alloc
(sizeof
(struct fixed_versioninfo
)));
1253 memset
($$
, 0, sizeof
(struct fixed_versioninfo
));
1255 | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr
1257 $1->file_version_ms
= ($3 << 16) |
$4;
1258 $1->file_version_ls
= ($5 << 16) |
$6;
1261 | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr
1263 $1->product_version_ms
= ($3 << 16) |
$4;
1264 $1->product_version_ls
= ($5 << 16) |
$6;
1267 | fixedverinfo FILEFLAGSMASK numexpr
1269 $1->file_flags_mask
= $3;
1272 | fixedverinfo FILEFLAGS numexpr
1274 $1->file_flags
= $3;
1277 | fixedverinfo FILEOS numexpr
1282 | fixedverinfo FILETYPE numexpr
1287 | fixedverinfo FILESUBTYPE numexpr
1289 $1->file_subtype
= $3;
1294 /* To handle verblocks successfully, the lexer handles BLOCK
1295 specially. A BLOCK "StringFileInfo" is returned as
1296 BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as
1297 BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK
1298 with the string as the value. */
1305 | verblocks BLOCKSTRINGFILEINFO BEG BLOCK BEG vervals END END
1307 $$
= append_ver_stringfileinfo
($1, $4, $6);
1309 | verblocks BLOCKVARFILEINFO BEG VALUE QUOTEDSTRING vertrans END
1311 $$
= append_ver_varfileinfo
($1, $5, $6);
1320 | vervals VALUE QUOTEDSTRING
',' QUOTEDSTRING
1322 $$
= append_verval
($1, $3, $5);
1331 | vertrans cnumexpr cnumexpr
1333 $$
= append_vertrans
($1, $2, $3);
1337 /* A resource ID. */
1349 /* It seems that resource ID's are forced to upper case. */
1350 copy
= xstrdup
($1);
1351 for
(s
= copy
; *s
!= '\0'; s
++)
1353 res_string_to_id
(&$$
, copy
);
1358 /* A resource reference. */
1386 /* It seems that resource ID's are forced to upper case. */
1387 copy
= xstrdup
($1);
1388 for
(s
= copy
; *s
!= '\0'; s
++)
1390 res_string_to_id
(&$$
, copy
);
1395 /* Generic suboptions. These may appear before the BEGIN in any
1396 multiline statement. */
1401 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1402 $$.language
= language
;
1403 /* FIXME: Is this the right default? */
1404 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE
;
1406 | suboptions memflag
1409 $$.memflags |
= $2.on
;
1410 $$.memflags
&=~
$2.off
;
1412 | suboptions CHARACTERISTICS numexpr
1415 $$.characteristics
= $3;
1417 | suboptions LANGUAGE numexpr cnumexpr
1420 $$.language
= $3 |
($4 << SUBLANG_SHIFT
);
1422 | suboptions VERSIONK numexpr
1429 /* Memory flags which default to MOVEABLE and DISCARDABLE. */
1431 memflags_move_discard:
1434 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1435 $$.language
= language
;
1436 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE
;
1438 | memflags_move_discard memflag
1441 $$.memflags |
= $2.on
;
1442 $$.memflags
&=~
$2.off
;
1446 /* Memory flags which default to MOVEABLE. */
1451 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1452 $$.language
= language
;
1453 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE
;
1455 | memflags_move memflag
1458 $$.memflags |
= $2.on
;
1459 $$.memflags
&=~
$2.off
;
1463 /* Memory flags. This returns a struct with two integers, because we
1464 sometimes want to set bits and we sometimes want to clear them. */
1469 $$.on
= MEMFLAG_MOVEABLE
;
1475 $$.off
= MEMFLAG_MOVEABLE
;
1479 $$.on
= MEMFLAG_PURE
;
1485 $$.off
= MEMFLAG_PURE
;
1489 $$.on
= MEMFLAG_PRELOAD
;
1495 $$.off
= MEMFLAG_PRELOAD
;
1499 $$.on
= MEMFLAG_DISCARDABLE
;
1517 /* A style expression. This changes the static variable STYLE. We do
1518 it this way because rc appears to permit a style to be set to
1520 WS_GROUP | NOT WS_TABSTOP
1521 to mean that a default of WS_TABSTOP should be removed. Anything
1522 which wants to accept a style must first set STYLE to the default
1523 value. The styleexpr nonterminal will change STYLE as specified by
1524 the user. Note that we do not accept arbitrary expressions here,
1525 just numbers separated by '|'. */
1536 | styleexpr
'|' parennumber
1540 | styleexpr
'|' NOT parennumber
1557 /* An optional expression with a leading comma. */
1570 /* An expression with a leading comma. */
1579 /* A possibly negated numeric expression. */
1588 /* A possibly negated expression with a size. */
1595 |
'(' sizednumexpr
')'
1599 |
'~' sizednumexpr %prec
'~'
1602 $$.dword
= $2.dword
;
1604 |
'-' sizednumexpr %prec NEG
1607 $$.dword
= $2.dword
;
1609 | sizednumexpr
'*' sizednumexpr
1611 $$.val
= $1.val
* $3.val
;
1612 $$.dword
= $1.dword ||
$3.dword
;
1614 | sizednumexpr
'/' sizednumexpr
1616 $$.val
= $1.val
/ $3.val
;
1617 $$.dword
= $1.dword ||
$3.dword
;
1619 | sizednumexpr
'%' sizednumexpr
1621 $$.val
= $1.val %
$3.val
;
1622 $$.dword
= $1.dword ||
$3.dword
;
1624 | sizednumexpr
'+' sizednumexpr
1626 $$.val
= $1.val
+ $3.val
;
1627 $$.dword
= $1.dword ||
$3.dword
;
1629 | sizednumexpr
'-' sizednumexpr
1631 $$.val
= $1.val
- $3.val
;
1632 $$.dword
= $1.dword ||
$3.dword
;
1634 | sizednumexpr
'&' sizednumexpr
1636 $$.val
= $1.val
& $3.val
;
1637 $$.dword
= $1.dword ||
$3.dword
;
1639 | sizednumexpr
'^' sizednumexpr
1641 $$.val
= $1.val ^
$3.val
;
1642 $$.dword
= $1.dword ||
$3.dword
;
1644 | sizednumexpr
'|' sizednumexpr
1646 $$.val
= $1.val |
$3.val
;
1647 $$.dword
= $1.dword ||
$3.dword
;
1651 /* An expression with a leading comma which does not use unary
1661 /* An expression which does not use unary negation. */
1670 /* An expression which does not use unary negation. We separate unary
1671 negation to avoid parsing conflicts when two numeric expressions
1672 appear consecutively. */
1679 |
'(' sizednumexpr
')'
1683 |
'~' sizednumexpr %prec
'~'
1686 $$.dword
= $2.dword
;
1688 | sizedposnumexpr
'*' sizednumexpr
1690 $$.val
= $1.val
* $3.val
;
1691 $$.dword
= $1.dword ||
$3.dword
;
1693 | sizedposnumexpr
'/' sizednumexpr
1695 $$.val
= $1.val
/ $3.val
;
1696 $$.dword
= $1.dword ||
$3.dword
;
1698 | sizedposnumexpr
'%' sizednumexpr
1700 $$.val
= $1.val %
$3.val
;
1701 $$.dword
= $1.dword ||
$3.dword
;
1703 | sizedposnumexpr
'+' sizednumexpr
1705 $$.val
= $1.val
+ $3.val
;
1706 $$.dword
= $1.dword ||
$3.dword
;
1708 | sizedposnumexpr
'-' sizednumexpr
1710 $$.val
= $1.val
- $3.val
;
1711 $$.dword
= $1.dword ||
$3.dword
;
1713 | sizedposnumexpr
'&' sizednumexpr
1715 $$.val
= $1.val
& $3.val
;
1716 $$.dword
= $1.dword ||
$3.dword
;
1718 | sizedposnumexpr
'^' sizednumexpr
1720 $$.val
= $1.val ^
$3.val
;
1721 $$.dword
= $1.dword ||
$3.dword
;
1723 | sizedposnumexpr
'|' sizednumexpr
1725 $$.val
= $1.val |
$3.val
;
1726 $$.dword
= $1.dword ||
$3.dword
;
1732 /* Set the language from the command line. */
1735 rcparse_set_language
(lang
)