1 %
{ /* rcparse.y -- parser for Windows rc files
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 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
138 %type
<id
> id optresidc resref
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
> 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 optresidc 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 optresidc 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 optresidc 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 optresidc 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 resref numexpr
',' numexpr
',' numexpr
','
813 numexpr
',' numexpr
','
814 { style
= WS_CHILD | WS_VISIBLE
; }
815 styleexpr optcnumexpr
817 $$
= define_control
($2, $3, $5, $7, $9, $11, 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 optresidc 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 | optresidc 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 | optresidc 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"));
867 res_string_to_id
(&$$
, "");
876 res_string_to_id
(&$$
, $1);
880 res_string_to_id
(&$$
, $1);
889 | BEG optrcdata_data END
895 /* These only exist to parse a reduction out of a common case. */
899 { style
= WS_CHILD | WS_VISIBLE
; }
905 { style
= SS_ICON | WS_CHILD | WS_VISIBLE
; }
909 control_params_styleexpr:
911 { style
= base_style | WS_CHILD | WS_VISIBLE
; }
915 /* Font resources. */
918 id FONT memflags_move_discard file_name
920 define_font
($1, &$3, $4);
921 if
(yychar != YYEMPTY
)
923 rcparse_discard_strings
();
927 /* Icon resources. */
930 id ICON memflags_move_discard file_name
932 define_icon
($1, &$3, $4);
933 if
(yychar != YYEMPTY
)
935 rcparse_discard_strings
();
939 /* Language command. This changes the static variable language, which
940 affects all subsequent resources. */
943 LANGUAGE numexpr cnumexpr
945 language
= $2 |
($3 << SUBLANG_SHIFT
);
949 /* Menu resources. */
952 id MENU suboptions BEG menuitems END
954 define_menu
($1, &$3, $5);
955 if
(yychar != YYEMPTY
)
957 rcparse_discard_strings
();
972 struct menuitem
**pp
;
974 for
(pp
= &$1->next
; *pp
!= NULL
; pp
= &(*pp
)->next
)
983 MENUITEM QUOTEDSTRING cnumexpr menuitem_flags
985 $$
= define_menuitem
($2, $3, $4, 0, 0, NULL
);
989 $$
= define_menuitem
(NULL
, 0, 0, 0, 0, NULL
);
991 | POPUP QUOTEDSTRING menuitem_flags BEG menuitems END
993 $$
= define_menuitem
($2, 0, $3, 0, 0, $5);
1002 | menuitem_flags
',' menuitem_flag
1006 | menuitem_flags menuitem_flag
1015 $$
= MENUITEM_CHECKED
;
1019 $$
= MENUITEM_GRAYED
;
1027 $$
= MENUITEM_INACTIVE
;
1031 $$
= MENUITEM_MENUBARBREAK
;
1035 $$
= MENUITEM_MENUBREAK
;
1039 /* Menuex resources. */
1042 id MENUEX suboptions BEG menuexitems END
1044 define_menu
($1, &$3, $5);
1045 if
(yychar != YYEMPTY
)
1047 rcparse_discard_strings
();
1056 | menuexitems menuexitem
1062 struct menuitem
**pp
;
1064 for
(pp
= &$1->next
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1073 MENUITEM QUOTEDSTRING
1075 $$
= define_menuitem
($2, 0, 0, 0, 0, NULL
);
1077 | MENUITEM QUOTEDSTRING cnumexpr
1079 $$
= define_menuitem
($2, $3, 0, 0, 0, NULL
);
1081 | MENUITEM QUOTEDSTRING cnumexpr cnumexpr optcnumexpr
1083 $$
= define_menuitem
($2, $3, $4, $5, 0, NULL
);
1085 | MENUITEM SEPARATOR
1087 $$
= define_menuitem
(NULL
, 0, 0, 0, 0, NULL
);
1089 | POPUP QUOTEDSTRING BEG menuexitems END
1091 $$
= define_menuitem
($2, 0, 0, 0, 0, $4);
1093 | POPUP QUOTEDSTRING cnumexpr BEG menuexitems END
1095 $$
= define_menuitem
($2, $3, 0, 0, 0, $5);
1097 | POPUP QUOTEDSTRING cnumexpr cnumexpr BEG menuexitems END
1099 $$
= define_menuitem
($2, $3, $4, 0, 0, $6);
1101 | POPUP QUOTEDSTRING cnumexpr cnumexpr cnumexpr optcnumexpr
1104 $$
= define_menuitem
($2, $3, $4, $5, $6, $8);
1108 /* Messagetable resources. */
1111 id MESSAGETABLE memflags_move file_name
1113 define_messagetable
($1, &$3, $4);
1114 if
(yychar != YYEMPTY
)
1116 rcparse_discard_strings
();
1120 /* Rcdata resources. */
1123 id RCDATA suboptions BEG optrcdata_data END
1125 define_rcdata
($1, &$3, $5.first
);
1126 if
(yychar != YYEMPTY
)
1128 rcparse_discard_strings
();
1132 /* We use a different lexing algorithm, because rcdata strings may
1133 contain embedded null bytes, and we need to know the length to use. */
1161 struct rcdata_item
*ri
;
1163 ri
= define_rcdata_string
($1.s
, $1.length
);
1169 struct rcdata_item
*ri
;
1171 ri
= define_rcdata_number
($1.val
, $1.dword
);
1175 | rcdata_data
',' SIZEDSTRING
1177 struct rcdata_item
*ri
;
1179 ri
= define_rcdata_string
($3.s
, $3.length
);
1180 $$.first
= $1.first
;
1184 | rcdata_data
',' sizednumexpr
1186 struct rcdata_item
*ri
;
1188 ri
= define_rcdata_number
($3.val
, $3.dword
);
1189 $$.first
= $1.first
;
1195 /* Stringtable resources. */
1198 STRINGTABLE suboptions BEG
1199 { sub_res_info
= $2; }
1205 | string_data numexpr QUOTEDSTRING
1207 define_stringtable
(&sub_res_info
, $2, $3);
1208 if
(yychar != YYEMPTY
)
1210 rcparse_discard_strings
();
1212 | string_data numexpr
',' QUOTEDSTRING
1214 define_stringtable
(&sub_res_info
, $2, $4);
1215 if
(yychar != YYEMPTY
)
1217 rcparse_discard_strings
();
1221 /* User defined resources. We accept general suboptions in the
1222 file_name case to keep the parser happy. */
1225 id id suboptions BEG optrcdata_data END
1227 define_user_data
($1, $2, &$3, $5.first
);
1228 if
(yychar != YYEMPTY
)
1230 rcparse_discard_strings
();
1232 | id id suboptions file_name
1234 define_user_file
($1, $2, &$3, $4);
1235 if
(yychar != YYEMPTY
)
1237 rcparse_discard_strings
();
1241 /* Versioninfo resources. */
1244 id VERSIONINFO fixedverinfo BEG verblocks END
1246 define_versioninfo
($1, language
, $3, $5);
1247 if
(yychar != YYEMPTY
)
1249 rcparse_discard_strings
();
1256 $$
= ((struct fixed_versioninfo
*)
1257 res_alloc
(sizeof
(struct fixed_versioninfo
)));
1258 memset
($$
, 0, sizeof
(struct fixed_versioninfo
));
1260 | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr
1262 $1->file_version_ms
= ($3 << 16) |
$4;
1263 $1->file_version_ls
= ($5 << 16) |
$6;
1266 | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr
1268 $1->product_version_ms
= ($3 << 16) |
$4;
1269 $1->product_version_ls
= ($5 << 16) |
$6;
1272 | fixedverinfo FILEFLAGSMASK numexpr
1274 $1->file_flags_mask
= $3;
1277 | fixedverinfo FILEFLAGS numexpr
1279 $1->file_flags
= $3;
1282 | fixedverinfo FILEOS numexpr
1287 | fixedverinfo FILETYPE numexpr
1292 | fixedverinfo FILESUBTYPE numexpr
1294 $1->file_subtype
= $3;
1299 /* To handle verblocks successfully, the lexer handles BLOCK
1300 specially. A BLOCK "StringFileInfo" is returned as
1301 BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as
1302 BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK
1303 with the string as the value. */
1310 | verblocks BLOCKSTRINGFILEINFO BEG BLOCK BEG vervals END END
1312 $$
= append_ver_stringfileinfo
($1, $4, $6);
1314 | verblocks BLOCKVARFILEINFO BEG VALUE QUOTEDSTRING vertrans END
1316 $$
= append_ver_varfileinfo
($1, $5, $6);
1325 | vervals VALUE QUOTEDSTRING
',' QUOTEDSTRING
1327 $$
= append_verval
($1, $3, $5);
1336 | vertrans cnumexpr cnumexpr
1338 $$
= append_vertrans
($1, $2, $3);
1342 /* A resource ID. */
1354 /* It seems that resource ID's are forced to upper case. */
1355 copy
= xstrdup
($1);
1356 for
(s
= copy
; *s
!= '\0'; s
++)
1358 res_string_to_id
(&$$
, copy
);
1363 /* A resource reference. */
1391 /* It seems that resource ID's are forced to upper case. */
1392 copy
= xstrdup
($1);
1393 for
(s
= copy
; *s
!= '\0'; s
++)
1395 res_string_to_id
(&$$
, copy
);
1400 /* Generic suboptions. These may appear before the BEGIN in any
1401 multiline statement. */
1406 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1407 $$.language
= language
;
1408 /* FIXME: Is this the right default? */
1409 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE
;
1411 | suboptions memflag
1414 $$.memflags |
= $2.on
;
1415 $$.memflags
&=~
$2.off
;
1417 | suboptions CHARACTERISTICS numexpr
1420 $$.characteristics
= $3;
1422 | suboptions LANGUAGE numexpr cnumexpr
1425 $$.language
= $3 |
($4 << SUBLANG_SHIFT
);
1427 | suboptions VERSIONK numexpr
1434 /* Memory flags which default to MOVEABLE and DISCARDABLE. */
1436 memflags_move_discard:
1439 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1440 $$.language
= language
;
1441 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE
;
1443 | memflags_move_discard memflag
1446 $$.memflags |
= $2.on
;
1447 $$.memflags
&=~
$2.off
;
1451 /* Memory flags which default to MOVEABLE. */
1456 memset
(&$$
, 0, sizeof
(struct res_res_info
));
1457 $$.language
= language
;
1458 $$.memflags
= MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE
;
1460 | memflags_move memflag
1463 $$.memflags |
= $2.on
;
1464 $$.memflags
&=~
$2.off
;
1468 /* Memory flags. This returns a struct with two integers, because we
1469 sometimes want to set bits and we sometimes want to clear them. */
1474 $$.on
= MEMFLAG_MOVEABLE
;
1480 $$.off
= MEMFLAG_MOVEABLE
;
1484 $$.on
= MEMFLAG_PURE
;
1490 $$.off
= MEMFLAG_PURE
;
1494 $$.on
= MEMFLAG_PRELOAD
;
1500 $$.off
= MEMFLAG_PRELOAD
;
1504 $$.on
= MEMFLAG_DISCARDABLE
;
1522 /* A style expression. This changes the static variable STYLE. We do
1523 it this way because rc appears to permit a style to be set to
1525 WS_GROUP | NOT WS_TABSTOP
1526 to mean that a default of WS_TABSTOP should be removed. Anything
1527 which wants to accept a style must first set STYLE to the default
1528 value. The styleexpr nonterminal will change STYLE as specified by
1529 the user. Note that we do not accept arbitrary expressions here,
1530 just numbers separated by '|'. */
1541 | styleexpr
'|' parennumber
1545 | styleexpr
'|' NOT parennumber
1562 /* An optional expression with a leading comma. */
1575 /* An expression with a leading comma. */
1584 /* A possibly negated numeric expression. */
1593 /* A possibly negated expression with a size. */
1600 |
'(' sizednumexpr
')'
1604 |
'~' sizednumexpr %prec
'~'
1607 $$.dword
= $2.dword
;
1609 |
'-' sizednumexpr %prec NEG
1612 $$.dword
= $2.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
;
1649 | sizednumexpr
'|' sizednumexpr
1651 $$.val
= $1.val |
$3.val
;
1652 $$.dword
= $1.dword ||
$3.dword
;
1656 /* An expression with a leading comma which does not use unary
1666 /* An expression which does not use unary negation. */
1675 /* An expression which does not use unary negation. We separate unary
1676 negation to avoid parsing conflicts when two numeric expressions
1677 appear consecutively. */
1684 |
'(' sizednumexpr
')'
1688 |
'~' sizednumexpr %prec
'~'
1691 $$.dword
= $2.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
;
1728 | sizedposnumexpr
'|' sizednumexpr
1730 $$.val
= $1.val |
$3.val
;
1731 $$.dword
= $1.dword ||
$3.dword
;
1737 /* Set the language from the command line. */
1740 rcparse_set_language
(lang
)