Automatic date update in version.in
[binutils-gdb.git] / binutils / rcparse.y
blob97f4a5adb1e608f339663ebea97acc5459163a33
1 %{ /* rcparse.y -- parser for Windows rc files
2 Copyright (C) 1997-2021 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
4 Extended by Kai Tietz, Onevision.
6 This file is part of GNU Binutils.
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 3 of the License, or
11 (at your option) any later version.
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.
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. */
24 /* This is a parser for Windows rc files. It is based on the parser
25 by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */
27 #include "sysdep.h"
28 #include "bfd.h"
29 #include "bucomm.h"
30 #include "libiberty.h"
31 #include "windres.h"
32 #include "safe-ctype.h"
34 /* The current language. */
36 static unsigned short language;
38 /* The resource information during a sub statement. */
40 static rc_res_res_info sub_res_info;
42 /* Dialog information. This is built by the nonterminals styles and
43 controls. */
45 static rc_dialog dialog;
47 /* This is used when building a style. It is modified by the
48 nonterminal styleexpr. */
50 static unsigned long style;
52 /* These are used when building a control. They are set before using
53 control_params. */
55 static rc_uint_type base_style;
56 static rc_uint_type default_style;
57 static rc_res_id class;
58 static rc_res_id res_text_field;
59 static unichar null_unichar;
61 /* This is used for COMBOBOX, LISTBOX and EDITTEXT which
62 do not allow resource 'text' field in control definition. */
63 static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
67 %union
69 rc_accelerator acc;
70 rc_accelerator *pacc;
71 rc_dialog_control *dialog_control;
72 rc_menuitem *menuitem;
73 struct
75 rc_rcdata_item *first;
76 rc_rcdata_item *last;
77 } rcdata;
78 rc_rcdata_item *rcdata_item;
79 rc_fixed_versioninfo *fixver;
80 rc_ver_info *verinfo;
81 rc_ver_stringtable *verstringtable;
82 rc_ver_stringinfo *verstring;
83 rc_ver_varinfo *vervar;
84 rc_toolbar_item *toobar_item;
85 rc_res_id id;
86 rc_res_res_info res_info;
87 struct
89 rc_uint_type on;
90 rc_uint_type off;
91 } memflags;
92 struct
94 rc_uint_type val;
95 /* Nonzero if this number was explicitly specified as long. */
96 int dword;
97 } i;
98 rc_uint_type il;
99 rc_uint_type is;
100 const char *s;
101 struct
103 rc_uint_type length;
104 const char *s;
105 } ss;
106 unichar *uni;
107 struct
109 rc_uint_type length;
110 const unichar *s;
111 } suni;
114 %token BEG END
115 %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
116 %token BITMAP
117 %token CURSOR
118 %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE
119 %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT
120 %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON
121 %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON
122 %token BEDIT HEDIT IEDIT
123 %token FONT
124 %token ICON
125 %token ANICURSOR ANIICON DLGINCLUDE DLGINIT FONTDIR HTML MANIFEST PLUGPLAY VXD TOOLBAR BUTTON
126 %token LANGUAGE CHARACTERISTICS VERSIONK
127 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE OWNERDRAW
128 %token MENUBARBREAK MENUBREAK
129 %token MESSAGETABLE
130 %token RCDATA
131 %token STRINGTABLE
132 %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS
133 %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO
134 %token VALUE
135 %token <s> BLOCK
136 %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE
137 %token NOT
138 %token <uni> QUOTEDUNISTRING
139 %token <s> QUOTEDSTRING STRING
140 %token <i> NUMBER
141 %token <suni> SIZEDUNISTRING
142 %token <ss> SIZEDSTRING
143 %token IGNORED_TOKEN
145 %type <pacc> acc_entries
146 %type <acc> acc_entry acc_event
147 %type <dialog_control> control control_params
148 %type <menuitem> menuitems menuitem menuexitems menuexitem
149 %type <rcdata> optrcdata_data optrcdata_data_int rcdata_data
150 %type <rcdata_item> opt_control_data
151 %type <fixver> fixedverinfo
152 %type <verinfo> verblocks
153 %type <verstringtable> verstringtables
154 %type <verstring> vervals
155 %type <vervar> vertrans
156 %type <toobar_item> toolbar_data
157 %type <res_info> suboptions memflags_move_discard memflags_move
158 %type <memflags> memflag
159 %type <id> id rcdata_id optresidc resref resid cresid
160 %type <il> exstyle parennumber
161 %type <il> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr
162 %type <is> acc_options acc_option menuitem_flags menuitem_flag
163 %type <s> file_name
164 %type <uni> res_unicode_string resname res_unicode_string_concat
165 %type <ss> sizedstring
166 %type <suni> sizedunistring res_unicode_sizedstring res_unicode_sizedstring_concat
167 %type <i> sizednumexpr sizedposnumexpr
169 %left '|'
170 %left '^'
171 %left '&'
172 %left '+' '-'
173 %left '*' '/' '%'
174 %right '~' NEG
178 input:
179 /* empty */
180 | input accelerator
181 | input bitmap
182 | input cursor
183 | input dialog
184 | input font
185 | input icon
186 | input language
187 | input menu
188 | input menuex
189 | input messagetable
190 | input stringtable
191 | input toolbar
192 | input user
193 | input versioninfo
194 | input IGNORED_TOKEN
197 /* Accelerator resources. */
199 accelerator:
200 id ACCELERATORS suboptions BEG acc_entries END
202 define_accelerator ($1, &$3, $5);
203 if (yychar != YYEMPTY)
204 YYERROR;
205 rcparse_discard_strings ();
209 acc_entries:
210 /* empty */
212 $$ = NULL;
214 | acc_entries acc_entry
216 rc_accelerator *a;
218 a = (rc_accelerator *) res_alloc (sizeof *a);
219 *a = $2;
220 if ($1 == NULL)
221 $$ = a;
222 else
224 rc_accelerator **pp;
226 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
228 *pp = a;
229 $$ = $1;
234 acc_entry:
235 acc_event cposnumexpr
237 $$ = $1;
238 $$.id = $2;
240 | acc_event cposnumexpr ',' acc_options
242 $$ = $1;
243 $$.id = $2;
244 $$.flags |= $4;
245 if (($$.flags & ACC_VIRTKEY) == 0
246 && ($$.flags & (ACC_SHIFT | ACC_CONTROL)) != 0)
247 rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
251 acc_event:
252 QUOTEDSTRING
254 const char *s = $1;
255 char ch;
257 $$.next = NULL;
258 $$.id = 0;
259 ch = *s;
260 if (ch != '^')
261 $$.flags = 0;
262 else
264 $$.flags = ACC_CONTROL | ACC_VIRTKEY;
265 ++s;
266 ch = TOUPPER (s[0]);
268 $$.key = ch;
269 if (s[1] != '\0')
270 rcparse_warning (_("accelerator should only be one character"));
272 | posnumexpr
274 $$.next = NULL;
275 $$.flags = 0;
276 $$.id = 0;
277 $$.key = $1;
281 acc_options:
282 acc_option
284 $$ = $1;
286 | acc_options ',' acc_option
288 $$ = $1 | $3;
290 /* I've had one report that the comma is optional. */
291 | acc_options acc_option
293 $$ = $1 | $2;
297 acc_option:
298 VIRTKEY
300 $$ = ACC_VIRTKEY;
302 | ASCII
304 /* This is just the absence of VIRTKEY. */
305 $$ = 0;
307 | NOINVERT
309 $$ = ACC_NOINVERT;
311 | SHIFT
313 $$ = ACC_SHIFT;
315 | CONTROL
317 $$ = ACC_CONTROL;
319 | ALT
321 $$ = ACC_ALT;
325 /* Bitmap resources. */
327 bitmap:
328 id BITMAP memflags_move file_name
330 define_bitmap ($1, &$3, $4);
331 if (yychar != YYEMPTY)
332 YYERROR;
333 rcparse_discard_strings ();
337 /* Cursor resources. */
339 cursor:
340 id CURSOR memflags_move_discard file_name
342 define_cursor ($1, &$3, $4);
343 if (yychar != YYEMPTY)
344 YYERROR;
345 rcparse_discard_strings ();
349 /* Dialog resources. */
351 dialog:
352 id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr
353 cnumexpr
355 memset (&dialog, 0, sizeof dialog);
356 dialog.x = $5;
357 dialog.y = $6;
358 dialog.width = $7;
359 dialog.height = $8;
360 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
361 dialog.exstyle = $4;
362 dialog.menu.named = 1;
363 dialog.class.named = 1;
364 dialog.font = NULL;
365 dialog.ex = NULL;
366 dialog.controls = NULL;
367 sub_res_info = $3;
368 style = 0;
370 styles BEG controls END
372 define_dialog ($1, &sub_res_info, &dialog);
373 if (yychar != YYEMPTY)
374 YYERROR;
375 rcparse_discard_strings ();
377 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
378 cnumexpr
380 memset (&dialog, 0, sizeof dialog);
381 dialog.x = $5;
382 dialog.y = $6;
383 dialog.width = $7;
384 dialog.height = $8;
385 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
386 dialog.exstyle = $4;
387 dialog.menu.named = 1;
388 dialog.class.named = 1;
389 dialog.font = NULL;
390 dialog.ex = ((rc_dialog_ex *)
391 res_alloc (sizeof (rc_dialog_ex)));
392 memset (dialog.ex, 0, sizeof (rc_dialog_ex));
393 dialog.controls = NULL;
394 sub_res_info = $3;
395 style = 0;
397 styles BEG controls END
399 define_dialog ($1, &sub_res_info, &dialog);
400 if (yychar != YYEMPTY)
401 YYERROR;
402 rcparse_discard_strings ();
404 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
405 cnumexpr cnumexpr
407 memset (&dialog, 0, sizeof dialog);
408 dialog.x = $5;
409 dialog.y = $6;
410 dialog.width = $7;
411 dialog.height = $8;
412 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
413 dialog.exstyle = $4;
414 dialog.menu.named = 1;
415 dialog.class.named = 1;
416 dialog.font = NULL;
417 dialog.ex = ((rc_dialog_ex *)
418 res_alloc (sizeof (rc_dialog_ex)));
419 memset (dialog.ex, 0, sizeof (rc_dialog_ex));
420 dialog.ex->help = $9;
421 dialog.controls = NULL;
422 sub_res_info = $3;
423 style = 0;
425 styles BEG controls END
427 define_dialog ($1, &sub_res_info, &dialog);
428 if (yychar != YYEMPTY)
429 YYERROR;
430 rcparse_discard_strings ();
434 exstyle:
435 /* empty */
437 $$ = 0;
439 | EXSTYLE '=' numexpr
441 $$ = $3;
445 styles:
446 /* empty */
447 | styles CAPTION res_unicode_string_concat
449 dialog.style |= WS_CAPTION;
450 style |= WS_CAPTION;
451 dialog.caption = $3;
453 | styles CLASS id
455 dialog.class = $3;
457 | styles STYLE
458 styleexpr
460 dialog.style = style;
462 | styles EXSTYLE numexpr
464 dialog.exstyle = $3;
466 | styles CLASS res_unicode_string_concat
468 res_unistring_to_id (& dialog.class, $3);
470 | styles FONT numexpr ',' res_unicode_string_concat
472 dialog.style |= DS_SETFONT;
473 style |= DS_SETFONT;
474 dialog.pointsize = $3;
475 dialog.font = $5;
476 if (dialog.ex != NULL)
478 dialog.ex->weight = 0;
479 dialog.ex->italic = 0;
480 dialog.ex->charset = 1;
483 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr
485 dialog.style |= DS_SETFONT;
486 style |= DS_SETFONT;
487 dialog.pointsize = $3;
488 dialog.font = $5;
489 if (dialog.ex == NULL)
490 rcparse_warning (_("extended FONT requires DIALOGEX"));
491 else
493 dialog.ex->weight = $6;
494 dialog.ex->italic = 0;
495 dialog.ex->charset = 1;
498 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr
500 dialog.style |= DS_SETFONT;
501 style |= DS_SETFONT;
502 dialog.pointsize = $3;
503 dialog.font = $5;
504 if (dialog.ex == NULL)
505 rcparse_warning (_("extended FONT requires DIALOGEX"));
506 else
508 dialog.ex->weight = $6;
509 dialog.ex->italic = $7;
510 dialog.ex->charset = 1;
513 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr cnumexpr
515 dialog.style |= DS_SETFONT;
516 style |= DS_SETFONT;
517 dialog.pointsize = $3;
518 dialog.font = $5;
519 if (dialog.ex == NULL)
520 rcparse_warning (_("extended FONT requires DIALOGEX"));
521 else
523 dialog.ex->weight = $6;
524 dialog.ex->italic = $7;
525 dialog.ex->charset = $8;
528 | styles MENU id
530 dialog.menu = $3;
532 | styles CHARACTERISTICS numexpr
534 sub_res_info.characteristics = $3;
536 | styles LANGUAGE numexpr cnumexpr
538 sub_res_info.language = $3 | ($4 << SUBLANG_SHIFT);
540 | styles VERSIONK numexpr
542 sub_res_info.version = $3;
546 controls:
547 /* empty */
548 | controls control
550 rc_dialog_control **pp;
552 for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next)
554 *pp = $2;
558 control:
559 AUTO3STATE optresidc
561 default_style = BS_AUTO3STATE | WS_TABSTOP;
562 base_style = BS_AUTO3STATE;
563 class.named = 0;
564 class.u.id = CTL_BUTTON;
565 res_text_field = $2;
567 control_params
569 $$ = $4;
571 | AUTOCHECKBOX optresidc
573 default_style = BS_AUTOCHECKBOX | WS_TABSTOP;
574 base_style = BS_AUTOCHECKBOX | WS_TABSTOP;
575 class.named = 0;
576 class.u.id = CTL_BUTTON;
577 res_text_field = $2;
579 control_params
581 $$ = $4;
583 | AUTORADIOBUTTON optresidc
585 default_style = BS_AUTORADIOBUTTON | WS_TABSTOP;
586 base_style = BS_AUTORADIOBUTTON;
587 class.named = 0;
588 class.u.id = CTL_BUTTON;
589 res_text_field = $2;
591 control_params
593 $$ = $4;
595 | BEDIT optresidc
597 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
598 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
599 class.named = 0;
600 class.u.id = CTL_EDIT;
601 res_text_field = $2;
603 control_params
605 $$ = $4;
606 if (dialog.ex == NULL)
607 rcparse_warning (_("BEDIT requires DIALOGEX"));
608 res_string_to_id (&$$->class, "BEDIT");
610 | CHECKBOX optresidc
612 default_style = BS_CHECKBOX | WS_TABSTOP;
613 base_style = BS_CHECKBOX | WS_TABSTOP;
614 class.named = 0;
615 class.u.id = CTL_BUTTON;
616 res_text_field = $2;
618 control_params
620 $$ = $4;
622 | COMBOBOX
624 /* This is as per MSDN documentation. With some (???)
625 versions of MS rc.exe their is no default style. */
626 default_style = CBS_SIMPLE | WS_TABSTOP;
627 base_style = 0;
628 class.named = 0;
629 class.u.id = CTL_COMBOBOX;
630 res_text_field = res_null_text;
632 control_params
634 $$ = $3;
636 | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
637 cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
639 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
640 if ($11 != NULL)
642 if (dialog.ex == NULL)
643 rcparse_warning (_("control data requires DIALOGEX"));
644 $$->data = $11;
647 | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
648 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
650 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
651 if (dialog.ex == NULL)
652 rcparse_warning (_("help ID requires DIALOGEX"));
653 $$->help = $11;
654 $$->data = $12;
656 | CTEXT optresidc
658 default_style = SS_CENTER | WS_GROUP;
659 base_style = SS_CENTER;
660 class.named = 0;
661 class.u.id = CTL_STATIC;
662 res_text_field = $2;
664 control_params
666 $$ = $4;
668 | DEFPUSHBUTTON optresidc
670 default_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
671 base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
672 class.named = 0;
673 class.u.id = CTL_BUTTON;
674 res_text_field = $2;
676 control_params
678 $$ = $4;
680 | EDITTEXT
682 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
683 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
684 class.named = 0;
685 class.u.id = CTL_EDIT;
686 res_text_field = res_null_text;
688 control_params
690 $$ = $3;
692 | GROUPBOX optresidc
694 default_style = BS_GROUPBOX;
695 base_style = BS_GROUPBOX;
696 class.named = 0;
697 class.u.id = CTL_BUTTON;
698 res_text_field = $2;
700 control_params
702 $$ = $4;
704 | HEDIT optresidc
706 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
707 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
708 class.named = 0;
709 class.u.id = CTL_EDIT;
710 res_text_field = $2;
712 control_params
714 $$ = $4;
715 if (dialog.ex == NULL)
716 rcparse_warning (_("IEDIT requires DIALOGEX"));
717 res_string_to_id (&$$->class, "HEDIT");
719 | ICON resref numexpr cnumexpr cnumexpr opt_control_data
721 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $6,
722 dialog.ex);
724 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
725 opt_control_data
727 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $8,
728 dialog.ex);
730 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
731 icon_styleexpr optcnumexpr opt_control_data
733 $$ = define_icon_control ($2, $3, $4, $5, style, $9, 0, $10,
734 dialog.ex);
736 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
737 icon_styleexpr cnumexpr cnumexpr opt_control_data
739 $$ = define_icon_control ($2, $3, $4, $5, style, $9, $10, $11,
740 dialog.ex);
742 | IEDIT optresidc
744 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
745 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
746 class.named = 0;
747 class.u.id = CTL_EDIT;
748 res_text_field = $2;
750 control_params
752 $$ = $4;
753 if (dialog.ex == NULL)
754 rcparse_warning (_("IEDIT requires DIALOGEX"));
755 res_string_to_id (&$$->class, "IEDIT");
757 | LISTBOX
759 default_style = LBS_NOTIFY | WS_BORDER;
760 base_style = LBS_NOTIFY | WS_BORDER;
761 class.named = 0;
762 class.u.id = CTL_LISTBOX;
763 res_text_field = res_null_text;
765 control_params
767 $$ = $3;
769 | LTEXT optresidc
771 default_style = SS_LEFT | WS_GROUP;
772 base_style = SS_LEFT;
773 class.named = 0;
774 class.u.id = CTL_STATIC;
775 res_text_field = $2;
777 control_params
779 $$ = $4;
781 | PUSHBOX optresidc
783 default_style = BS_PUSHBOX | WS_TABSTOP;
784 base_style = BS_PUSHBOX;
785 class.named = 0;
786 class.u.id = CTL_BUTTON;
788 control_params
790 $$ = $4;
792 | PUSHBUTTON optresidc
794 default_style = BS_PUSHBUTTON | WS_TABSTOP;
795 base_style = BS_PUSHBUTTON | WS_TABSTOP;
796 class.named = 0;
797 class.u.id = CTL_BUTTON;
798 res_text_field = $2;
800 control_params
802 $$ = $4;
804 | RADIOBUTTON optresidc
806 default_style = BS_RADIOBUTTON | WS_TABSTOP;
807 base_style = BS_RADIOBUTTON;
808 class.named = 0;
809 class.u.id = CTL_BUTTON;
810 res_text_field = $2;
812 control_params
814 $$ = $4;
816 | RTEXT optresidc
818 default_style = SS_RIGHT | WS_GROUP;
819 base_style = SS_RIGHT;
820 class.named = 0;
821 class.u.id = CTL_STATIC;
822 res_text_field = $2;
824 control_params
826 $$ = $4;
828 | SCROLLBAR
830 default_style = SBS_HORZ;
831 base_style = 0;
832 class.named = 0;
833 class.u.id = CTL_SCROLLBAR;
834 res_text_field = res_null_text;
836 control_params
838 $$ = $3;
840 | STATE3 optresidc
842 default_style = BS_3STATE | WS_TABSTOP;
843 base_style = BS_3STATE;
844 class.named = 0;
845 class.u.id = CTL_BUTTON;
846 res_text_field = $2;
848 control_params
850 $$ = $4;
852 | USERBUTTON resref numexpr ',' numexpr ',' numexpr ','
853 numexpr ',' numexpr ','
854 { style = WS_CHILD | WS_VISIBLE; }
855 styleexpr optcnumexpr
857 rc_res_id cid;
858 cid.named = 0;
859 cid.u.id = CTL_BUTTON;
860 $$ = define_control ($2, $3, $5, $7, $9, $11, cid,
861 style, $15);
865 /* Parameters for a control. The static variables DEFAULT_STYLE,
866 BASE_STYLE, and CLASS must be initialized before this nonterminal
867 is used. DEFAULT_STYLE is the style to use if no style expression
868 is specified. BASE_STYLE is the base style to use if a style
869 expression is specified; the style expression modifies the base
870 style. CLASS is the class of the control. */
872 control_params:
873 numexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
875 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class,
876 default_style | WS_CHILD | WS_VISIBLE, 0);
877 if ($6 != NULL)
879 if (dialog.ex == NULL)
880 rcparse_warning (_("control data requires DIALOGEX"));
881 $$->data = $6;
884 | numexpr cnumexpr cnumexpr cnumexpr cnumexpr
885 control_params_styleexpr optcnumexpr opt_control_data
887 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
888 if ($8 != NULL)
890 if (dialog.ex == NULL)
891 rcparse_warning (_("control data requires DIALOGEX"));
892 $$->data = $8;
895 | numexpr cnumexpr cnumexpr cnumexpr cnumexpr
896 control_params_styleexpr cnumexpr cnumexpr opt_control_data
898 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
899 if (dialog.ex == NULL)
900 rcparse_warning (_("help ID requires DIALOGEX"));
901 $$->help = $8;
902 $$->data = $9;
906 cresid:
907 ',' resid
909 if ($2.named)
910 res_unistring_to_id (&$$, $2.u.n.name);
911 else
912 $$=$2;
916 optresidc:
917 /* empty */
919 res_string_to_id (&$$, "");
921 | resid ',' { $$=$1; }
924 resid:
925 posnumexpr
927 $$.named = 0;
928 $$.u.id = $1;
930 | res_unicode_string_concat
932 $$.named = 1;
933 $$.u.n.name = $1;
934 $$.u.n.length = unichar_len ($1);
938 opt_control_data:
939 /* empty */
941 $$ = NULL;
943 | BEG optrcdata_data END
945 $$ = $2.first;
949 /* These only exist to parse a reduction out of a common case. */
951 control_styleexpr:
953 { style = WS_CHILD | WS_VISIBLE; }
954 styleexpr
957 icon_styleexpr:
959 { style = SS_ICON | WS_CHILD | WS_VISIBLE; }
960 styleexpr
963 control_params_styleexpr:
965 { style = base_style | WS_CHILD | WS_VISIBLE; }
966 styleexpr
969 /* Font resources. */
971 font:
972 id FONT memflags_move_discard file_name
974 define_font ($1, &$3, $4);
975 if (yychar != YYEMPTY)
976 YYERROR;
977 rcparse_discard_strings ();
981 /* Icon resources. */
983 icon:
984 id ICON memflags_move_discard file_name
986 define_icon ($1, &$3, $4);
987 if (yychar != YYEMPTY)
988 YYERROR;
989 rcparse_discard_strings ();
993 /* Language command. This changes the static variable language, which
994 affects all subsequent resources. */
996 language:
997 LANGUAGE numexpr cnumexpr
999 language = $2 | ($3 << SUBLANG_SHIFT);
1003 /* Menu resources. */
1005 menu:
1006 id MENU suboptions BEG menuitems END
1008 define_menu ($1, &$3, $5);
1009 if (yychar != YYEMPTY)
1010 YYERROR;
1011 rcparse_discard_strings ();
1015 menuitems:
1016 /* empty */
1018 $$ = NULL;
1020 | menuitems menuitem
1022 if ($1 == NULL)
1023 $$ = $2;
1024 else
1026 rc_menuitem **pp;
1028 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
1030 *pp = $2;
1031 $$ = $1;
1036 menuitem:
1037 MENUITEM res_unicode_string_concat cnumexpr menuitem_flags
1039 $$ = define_menuitem ($2, $3, $4, 0, 0, NULL);
1041 | MENUITEM SEPARATOR
1043 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
1045 | POPUP res_unicode_string_concat menuitem_flags BEG menuitems END
1047 $$ = define_menuitem ($2, 0, $3, 0, 0, $5);
1051 menuitem_flags:
1052 /* empty */
1054 $$ = 0;
1056 | menuitem_flags ',' menuitem_flag
1058 $$ = $1 | $3;
1060 | menuitem_flags menuitem_flag
1062 $$ = $1 | $2;
1066 menuitem_flag:
1067 CHECKED
1069 $$ = MENUITEM_CHECKED;
1071 | GRAYED
1073 $$ = MENUITEM_GRAYED;
1075 | HELP
1077 $$ = MENUITEM_HELP;
1079 | INACTIVE
1081 $$ = MENUITEM_INACTIVE;
1083 | MENUBARBREAK
1085 $$ = MENUITEM_MENUBARBREAK;
1087 | MENUBREAK
1089 $$ = MENUITEM_MENUBREAK;
1091 | BITMAP
1093 $$ = MENUITEM_BITMAP;
1095 | OWNERDRAW
1097 $$ = MENUITEM_OWNERDRAW;
1101 /* Menuex resources. */
1103 menuex:
1104 id MENUEX suboptions BEG menuexitems END
1106 define_menu ($1, &$3, $5);
1107 if (yychar != YYEMPTY)
1108 YYERROR;
1109 rcparse_discard_strings ();
1113 menuexitems:
1114 /* empty */
1116 $$ = NULL;
1118 | menuexitems menuexitem
1120 if ($1 == NULL)
1121 $$ = $2;
1122 else
1124 rc_menuitem **pp;
1126 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
1128 *pp = $2;
1129 $$ = $1;
1134 menuexitem:
1135 MENUITEM res_unicode_string_concat
1137 $$ = define_menuitem ($2, 0, 0, 0, 0, NULL);
1139 | MENUITEM res_unicode_string_concat cnumexpr
1141 $$ = define_menuitem ($2, $3, 0, 0, 0, NULL);
1143 | MENUITEM res_unicode_string_concat cnumexpr cnumexpr optcnumexpr
1145 $$ = define_menuitem ($2, $3, $4, $5, 0, NULL);
1147 | MENUITEM SEPARATOR
1149 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
1151 | POPUP res_unicode_string_concat BEG menuexitems END
1153 $$ = define_menuitem ($2, 0, 0, 0, 0, $4);
1155 | POPUP res_unicode_string_concat cnumexpr BEG menuexitems END
1157 $$ = define_menuitem ($2, $3, 0, 0, 0, $5);
1159 | POPUP res_unicode_string_concat cnumexpr cnumexpr BEG menuexitems END
1161 $$ = define_menuitem ($2, $3, $4, 0, 0, $6);
1163 | POPUP res_unicode_string_concat cnumexpr cnumexpr cnumexpr optcnumexpr
1164 BEG menuexitems END
1166 $$ = define_menuitem ($2, $3, $4, $5, $6, $8);
1170 /* Messagetable resources. */
1172 messagetable:
1173 id MESSAGETABLE memflags_move file_name
1175 define_messagetable ($1, &$3, $4);
1176 if (yychar != YYEMPTY)
1177 YYERROR;
1178 rcparse_discard_strings ();
1182 /* We use a different lexing algorithm, because rcdata strings may
1183 contain embedded null bytes, and we need to know the length to use. */
1185 optrcdata_data:
1187 rcparse_rcdata ();
1189 optrcdata_data_int
1191 rcparse_normal ();
1192 $$ = $2;
1196 optrcdata_data_int:
1197 /* empty */
1199 $$.first = NULL;
1200 $$.last = NULL;
1202 | rcdata_data
1204 $$ = $1;
1208 rcdata_data:
1209 sizedstring
1211 rc_rcdata_item *ri;
1213 ri = define_rcdata_string ($1.s, $1.length);
1214 $$.first = ri;
1215 $$.last = ri;
1217 | sizedunistring
1219 rc_rcdata_item *ri;
1221 ri = define_rcdata_unistring ($1.s, $1.length);
1222 $$.first = ri;
1223 $$.last = ri;
1225 | sizednumexpr
1227 rc_rcdata_item *ri;
1229 ri = define_rcdata_number ($1.val, $1.dword);
1230 $$.first = ri;
1231 $$.last = ri;
1233 | rcdata_data ',' sizedstring
1235 rc_rcdata_item *ri;
1237 ri = define_rcdata_string ($3.s, $3.length);
1238 $$.first = $1.first;
1239 $1.last->next = ri;
1240 $$.last = ri;
1242 | rcdata_data ',' sizedunistring
1244 rc_rcdata_item *ri;
1246 ri = define_rcdata_unistring ($3.s, $3.length);
1247 $$.first = $1.first;
1248 $1.last->next = ri;
1249 $$.last = ri;
1251 | rcdata_data ',' sizednumexpr
1253 rc_rcdata_item *ri;
1255 ri = define_rcdata_number ($3.val, $3.dword);
1256 $$.first = $1.first;
1257 $1.last->next = ri;
1258 $$.last = ri;
1260 | rcdata_data ','
1262 $$=$1;
1266 /* Stringtable resources. */
1268 stringtable:
1269 STRINGTABLE suboptions BEG
1270 { sub_res_info = $2; rcparse_rcdata (); }
1271 string_data END { rcparse_normal (); }
1274 string_data:
1275 /* empty */
1276 | string_data numexpr res_unicode_sizedstring_concat
1278 define_stringtable (&sub_res_info, $2, $3.s, $3.length);
1279 rcparse_discard_strings ();
1281 | string_data numexpr ',' res_unicode_sizedstring_concat
1283 define_stringtable (&sub_res_info, $2, $4.s, $4.length);
1284 rcparse_discard_strings ();
1286 | string_data error
1288 rcparse_warning (_("invalid stringtable resource."));
1289 abort ();
1293 rcdata_id:
1296 $$=$1;
1298 | HTML
1300 $$.named = 0;
1301 $$.u.id = 23;
1303 | RCDATA
1305 $$.named = 0;
1306 $$.u.id = RT_RCDATA;
1308 | MANIFEST
1310 $$.named = 0;
1311 $$.u.id = RT_MANIFEST;
1313 | PLUGPLAY
1315 $$.named = 0;
1316 $$.u.id = RT_PLUGPLAY;
1318 | VXD
1320 $$.named = 0;
1321 $$.u.id = RT_VXD;
1323 | DLGINCLUDE
1325 $$.named = 0;
1326 $$.u.id = RT_DLGINCLUDE;
1328 | DLGINIT
1330 $$.named = 0;
1331 $$.u.id = RT_DLGINIT;
1333 | ANICURSOR
1335 $$.named = 0;
1336 $$.u.id = RT_ANICURSOR;
1338 | ANIICON
1340 $$.named = 0;
1341 $$.u.id = RT_ANIICON;
1345 /* User defined resources. We accept general suboptions in the
1346 file_name case to keep the parser happy. */
1348 user:
1349 id rcdata_id suboptions BEG optrcdata_data END
1351 define_user_data ($1, $2, &$3, $5.first);
1352 if (yychar != YYEMPTY)
1353 YYERROR;
1354 rcparse_discard_strings ();
1356 | id rcdata_id suboptions file_name
1358 define_user_file ($1, $2, &$3, $4);
1359 if (yychar != YYEMPTY)
1360 YYERROR;
1361 rcparse_discard_strings ();
1365 toolbar:
1366 id TOOLBAR suboptions numexpr cnumexpr BEG toolbar_data END
1368 define_toolbar ($1, &$3, $4, $5, $7);
1372 toolbar_data: /* empty */ { $$= NULL; }
1373 | toolbar_data BUTTON id
1375 rc_toolbar_item *c,*n;
1376 c = $1;
1377 n= (rc_toolbar_item *)
1378 res_alloc (sizeof (rc_toolbar_item));
1379 if (c != NULL)
1380 while (c->next != NULL)
1381 c = c->next;
1382 n->prev = c;
1383 n->next = NULL;
1384 if (c != NULL)
1385 c->next = n;
1386 n->id = $3;
1387 if ($1 == NULL)
1388 $$ = n;
1389 else
1390 $$ = $1;
1392 | toolbar_data SEPARATOR
1394 rc_toolbar_item *c,*n;
1395 c = $1;
1396 n= (rc_toolbar_item *)
1397 res_alloc (sizeof (rc_toolbar_item));
1398 if (c != NULL)
1399 while (c->next != NULL)
1400 c = c->next;
1401 n->prev = c;
1402 n->next = NULL;
1403 if (c != NULL)
1404 c->next = n;
1405 n->id.named = 0;
1406 n->id.u.id = 0;
1407 if ($1 == NULL)
1408 $$ = n;
1409 else
1410 $$ = $1;
1414 /* Versioninfo resources. */
1416 versioninfo:
1417 id VERSIONINFO fixedverinfo BEG verblocks END
1419 define_versioninfo ($1, language, $3, $5);
1420 if (yychar != YYEMPTY)
1421 YYERROR;
1422 rcparse_discard_strings ();
1426 fixedverinfo:
1427 /* empty */
1429 $$ = ((rc_fixed_versioninfo *)
1430 res_alloc (sizeof (rc_fixed_versioninfo)));
1431 memset ($$, 0, sizeof (rc_fixed_versioninfo));
1433 | fixedverinfo FILEVERSION numexpr optcnumexpr optcnumexpr
1434 optcnumexpr
1436 $1->file_version_ms = ($3 << 16) | ($4 & 0xffff);
1437 $1->file_version_ls = ($5 << 16) | ($6 & 0xffff);
1438 $$ = $1;
1440 | fixedverinfo PRODUCTVERSION numexpr optcnumexpr optcnumexpr
1441 optcnumexpr
1443 $1->product_version_ms = ($3 << 16) | ($4 & 0xffff);
1444 $1->product_version_ls = ($5 << 16) | ($6 & 0xffff);
1445 $$ = $1;
1447 | fixedverinfo FILEFLAGSMASK numexpr
1449 $1->file_flags_mask = $3;
1450 $$ = $1;
1452 | fixedverinfo FILEFLAGS numexpr
1454 $1->file_flags = $3;
1455 $$ = $1;
1457 | fixedverinfo FILEOS numexpr
1459 $1->file_os = $3;
1460 $$ = $1;
1462 | fixedverinfo FILETYPE numexpr
1464 $1->file_type = $3;
1465 $$ = $1;
1467 | fixedverinfo FILESUBTYPE numexpr
1469 $1->file_subtype = $3;
1470 $$ = $1;
1474 /* To handle verblocks successfully, the lexer handles BLOCK
1475 specially. A BLOCK "StringFileInfo" is returned as
1476 BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as
1477 BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK
1478 with the string as the value. */
1480 verblocks:
1481 /* empty */
1483 $$ = NULL;
1485 | verblocks BLOCKSTRINGFILEINFO BEG verstringtables END
1487 $$ = append_ver_stringfileinfo ($1, $4);
1489 | verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END
1491 $$ = append_ver_varfileinfo ($1, $5, $6);
1495 verstringtables:
1496 /* empty */
1498 $$ = NULL;
1500 | verstringtables BLOCK BEG vervals END
1502 $$ = append_ver_stringtable ($1, $2, $4);
1506 vervals:
1507 /* empty */
1509 $$ = NULL;
1511 | vervals VALUE res_unicode_string_concat ',' res_unicode_string_concat
1513 $$ = append_verval ($1, $3, $5);
1517 vertrans:
1518 /* empty */
1520 $$ = NULL;
1522 | vertrans cnumexpr cnumexpr
1524 $$ = append_vertrans ($1, $2, $3);
1528 /* A resource ID. */
1531 posnumexpr
1533 $$.named = 0;
1534 $$.u.id = $1;
1536 | resname
1538 res_unistring_to_id (&$$, $1);
1542 /* A resource reference. */
1544 resname:
1545 res_unicode_string
1547 $$ = $1;
1549 | STRING
1551 unichar *h = NULL;
1552 unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
1553 $$ = h;
1558 resref:
1559 posnumexpr ','
1561 $$.named = 0;
1562 $$.u.id = $1;
1564 | resname
1566 res_unistring_to_id (&$$, $1);
1568 | resname ','
1570 res_unistring_to_id (&$$, $1);
1574 /* Generic suboptions. These may appear before the BEGIN in any
1575 multiline statement. */
1577 suboptions:
1578 /* empty */
1580 memset (&$$, 0, sizeof (rc_res_res_info));
1581 $$.language = language;
1582 /* FIXME: Is this the right default? */
1583 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
1585 | suboptions memflag
1587 $$ = $1;
1588 $$.memflags |= $2.on;
1589 $$.memflags &=~ $2.off;
1591 | suboptions CHARACTERISTICS numexpr
1593 $$ = $1;
1594 $$.characteristics = $3;
1596 | suboptions LANGUAGE numexpr cnumexpr
1598 $$ = $1;
1599 $$.language = $3 | ($4 << SUBLANG_SHIFT);
1601 | suboptions VERSIONK numexpr
1603 $$ = $1;
1604 $$.version = $3;
1608 /* Memory flags which default to MOVEABLE and DISCARDABLE. */
1610 memflags_move_discard:
1611 /* empty */
1613 memset (&$$, 0, sizeof (rc_res_res_info));
1614 $$.language = language;
1615 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE;
1617 | memflags_move_discard memflag
1619 $$ = $1;
1620 $$.memflags |= $2.on;
1621 $$.memflags &=~ $2.off;
1625 /* Memory flags which default to MOVEABLE. */
1627 memflags_move:
1628 /* empty */
1630 memset (&$$, 0, sizeof (rc_res_res_info));
1631 $$.language = language;
1632 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
1634 | memflags_move memflag
1636 $$ = $1;
1637 $$.memflags |= $2.on;
1638 $$.memflags &=~ $2.off;
1642 /* Memory flags. This returns a struct with two integers, because we
1643 sometimes want to set bits and we sometimes want to clear them. */
1645 memflag:
1646 MOVEABLE
1648 $$.on = MEMFLAG_MOVEABLE;
1649 $$.off = 0;
1651 | FIXED
1653 $$.on = 0;
1654 $$.off = MEMFLAG_MOVEABLE;
1656 | PURE
1658 $$.on = MEMFLAG_PURE;
1659 $$.off = 0;
1661 | IMPURE
1663 $$.on = 0;
1664 $$.off = MEMFLAG_PURE;
1666 | PRELOAD
1668 $$.on = MEMFLAG_PRELOAD;
1669 $$.off = 0;
1671 | LOADONCALL
1673 $$.on = 0;
1674 $$.off = MEMFLAG_PRELOAD;
1676 | DISCARDABLE
1678 $$.on = MEMFLAG_DISCARDABLE;
1679 $$.off = 0;
1683 /* A file name. */
1685 file_name:
1686 QUOTEDSTRING
1688 $$ = $1;
1690 | STRING
1692 $$ = $1;
1696 /* Concat string */
1697 res_unicode_string_concat:
1698 res_unicode_string
1700 $$ = $1;
1703 res_unicode_string_concat res_unicode_string
1705 rc_uint_type l1 = unichar_len ($1);
1706 rc_uint_type l2 = unichar_len ($2);
1707 unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
1708 if (l1 != 0)
1709 memcpy (h, $1, l1 * sizeof (unichar));
1710 if (l2 != 0)
1711 memcpy (h + l1, $2, l2 * sizeof (unichar));
1712 h[l1 + l2] = 0;
1713 $$ = h;
1717 res_unicode_string:
1718 QUOTEDUNISTRING
1720 $$ = unichar_dup ($1);
1722 | QUOTEDSTRING
1724 unichar *h = NULL;
1725 unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
1726 $$ = h;
1730 res_unicode_sizedstring:
1731 sizedunistring
1733 $$ = $1;
1735 | sizedstring
1737 unichar *h = NULL;
1738 rc_uint_type l = 0;
1739 unicode_from_ascii_len (&l, &h, $1.s, $1.length);
1740 $$.s = h;
1741 $$.length = l;
1745 /* Concat string */
1746 res_unicode_sizedstring_concat:
1747 res_unicode_sizedstring
1749 $$ = $1;
1752 res_unicode_sizedstring_concat res_unicode_sizedstring
1754 rc_uint_type l1 = $1.length;
1755 rc_uint_type l2 = $2.length;
1756 unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
1757 if (l1 != 0)
1758 memcpy (h, $1.s, l1 * sizeof (unichar));
1759 if (l2 != 0)
1760 memcpy (h + l1, $2.s, l2 * sizeof (unichar));
1761 h[l1 + l2] = 0;
1762 $$.length = l1 + l2;
1763 $$.s = h;
1767 sizedstring:
1768 SIZEDSTRING
1770 $$ = $1;
1772 | sizedstring SIZEDSTRING
1774 rc_uint_type l = $1.length + $2.length;
1775 char *h = (char *) res_alloc (l);
1776 memcpy (h, $1.s, $1.length);
1777 memcpy (h + $1.length, $2.s, $2.length);
1778 $$.s = h;
1779 $$.length = l;
1783 sizedunistring:
1784 SIZEDUNISTRING
1786 $$ = $1;
1788 | sizedunistring SIZEDUNISTRING
1790 rc_uint_type l = $1.length + $2.length;
1791 unichar *h = (unichar *) res_alloc (l * sizeof (unichar));
1792 memcpy (h, $1.s, $1.length * sizeof (unichar));
1793 memcpy (h + $1.length, $2.s, $2.length * sizeof (unichar));
1794 $$.s = h;
1795 $$.length = l;
1799 /* A style expression. This changes the static variable STYLE. We do
1800 it this way because rc appears to permit a style to be set to
1801 something like
1802 WS_GROUP | NOT WS_TABSTOP
1803 to mean that a default of WS_TABSTOP should be removed. Anything
1804 which wants to accept a style must first set STYLE to the default
1805 value. The styleexpr nonterminal will change STYLE as specified by
1806 the user. Note that we do not accept arbitrary expressions here,
1807 just numbers separated by '|'. */
1809 styleexpr:
1810 parennumber
1812 style |= $1;
1814 | NOT parennumber
1816 style &=~ $2;
1818 | styleexpr '|' parennumber
1820 style |= $3;
1822 | styleexpr '|' NOT parennumber
1824 style &=~ $4;
1828 parennumber:
1829 NUMBER
1831 $$ = $1.val;
1833 | '(' numexpr ')'
1835 $$ = $2;
1839 /* An optional expression with a leading comma. */
1841 optcnumexpr:
1842 /* empty */
1844 $$ = 0;
1846 | cnumexpr
1848 $$ = $1;
1852 /* An expression with a leading comma. */
1854 cnumexpr:
1855 ',' numexpr
1857 $$ = $2;
1861 /* A possibly negated numeric expression. */
1863 numexpr:
1864 sizednumexpr
1866 $$ = $1.val;
1870 /* A possibly negated expression with a size. */
1872 sizednumexpr:
1873 NUMBER
1875 $$ = $1;
1877 | '(' sizednumexpr ')'
1879 $$ = $2;
1881 | '~' sizednumexpr %prec '~'
1883 $$.val = ~ $2.val;
1884 $$.dword = $2.dword;
1886 | '-' sizednumexpr %prec NEG
1888 $$.val = - $2.val;
1889 $$.dword = $2.dword;
1891 | sizednumexpr '*' sizednumexpr
1893 $$.val = $1.val * $3.val;
1894 $$.dword = $1.dword || $3.dword;
1896 | sizednumexpr '/' sizednumexpr
1898 $$.val = $1.val / ($3.val ? $3.val : 1);
1899 $$.dword = $1.dword || $3.dword;
1901 | sizednumexpr '%' sizednumexpr
1903 $$.val = $1.val % ($3.val ? $3.val : 1);
1904 $$.dword = $1.dword || $3.dword;
1906 | sizednumexpr '+' sizednumexpr
1908 $$.val = $1.val + $3.val;
1909 $$.dword = $1.dword || $3.dword;
1911 | sizednumexpr '-' sizednumexpr
1913 $$.val = $1.val - $3.val;
1914 $$.dword = $1.dword || $3.dword;
1916 | sizednumexpr '&' sizednumexpr
1918 $$.val = $1.val & $3.val;
1919 $$.dword = $1.dword || $3.dword;
1921 | sizednumexpr '^' sizednumexpr
1923 $$.val = $1.val ^ $3.val;
1924 $$.dword = $1.dword || $3.dword;
1926 | sizednumexpr '|' sizednumexpr
1928 $$.val = $1.val | $3.val;
1929 $$.dword = $1.dword || $3.dword;
1933 /* An expression with a leading comma which does not use unary
1934 negation. */
1936 cposnumexpr:
1937 ',' posnumexpr
1939 $$ = $2;
1943 /* An expression which does not use unary negation. */
1945 posnumexpr:
1946 sizedposnumexpr
1948 $$ = $1.val;
1952 /* An expression which does not use unary negation. We separate unary
1953 negation to avoid parsing conflicts when two numeric expressions
1954 appear consecutively. */
1956 sizedposnumexpr:
1957 NUMBER
1959 $$ = $1;
1961 | '(' sizednumexpr ')'
1963 $$ = $2;
1965 | '~' sizednumexpr %prec '~'
1967 $$.val = ~ $2.val;
1968 $$.dword = $2.dword;
1970 | sizedposnumexpr '*' sizednumexpr
1972 $$.val = $1.val * $3.val;
1973 $$.dword = $1.dword || $3.dword;
1975 | sizedposnumexpr '/' sizednumexpr
1977 $$.val = $1.val / ($3.val ? $3.val : 1);
1978 $$.dword = $1.dword || $3.dword;
1980 | sizedposnumexpr '%' sizednumexpr
1982 /* PR 17512: file: 89105a25. */
1983 $$.val = $1.val % ($3.val ? $3.val : 1);
1984 $$.dword = $1.dword || $3.dword;
1986 | sizedposnumexpr '+' sizednumexpr
1988 $$.val = $1.val + $3.val;
1989 $$.dword = $1.dword || $3.dword;
1991 | sizedposnumexpr '-' sizednumexpr
1993 $$.val = $1.val - $3.val;
1994 $$.dword = $1.dword || $3.dword;
1996 | sizedposnumexpr '&' sizednumexpr
1998 $$.val = $1.val & $3.val;
1999 $$.dword = $1.dword || $3.dword;
2001 | sizedposnumexpr '^' sizednumexpr
2003 $$.val = $1.val ^ $3.val;
2004 $$.dword = $1.dword || $3.dword;
2006 | sizedposnumexpr '|' sizednumexpr
2008 $$.val = $1.val | $3.val;
2009 $$.dword = $1.dword || $3.dword;
2015 /* Set the language from the command line. */
2017 void
2018 rcparse_set_language (int lang)
2020 language = lang;