* ld-m68hc11/m68hc11.exp: Run for m68hc11-*-* and m68hc12-*-*.
[binutils.git] / binutils / rcparse.y
blobe80cbc607842046160e9bf705c35917b306ad245
1 %{ /* rcparse.y -- parser for Windows rc files
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008,
3 2011 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
5 Extended by Kai Tietz, Onevision.
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
25 /* This is a parser for Windows rc files. It is based on the parser
26 by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */
28 #include "sysdep.h"
29 #include "bfd.h"
30 #include "bucomm.h"
31 #include "libiberty.h"
32 #include "windres.h"
33 #include "safe-ctype.h"
35 /* The current language. */
37 static unsigned short language;
39 /* The resource information during a sub statement. */
41 static rc_res_res_info sub_res_info;
43 /* Dialog information. This is built by the nonterminals styles and
44 controls. */
46 static rc_dialog dialog;
48 /* This is used when building a style. It is modified by the
49 nonterminal styleexpr. */
51 static unsigned long style;
53 /* These are used when building a control. They are set before using
54 control_params. */
56 static rc_uint_type base_style;
57 static rc_uint_type default_style;
58 static rc_res_id class;
59 static rc_res_id res_text_field;
60 static unichar null_unichar;
62 /* This is used for COMBOBOX, LISTBOX and EDITTEXT which
63 do not allow resource 'text' field in control definition. */
64 static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
68 %union
70 rc_accelerator acc;
71 rc_accelerator *pacc;
72 rc_dialog_control *dialog_control;
73 rc_menuitem *menuitem;
74 struct
76 rc_rcdata_item *first;
77 rc_rcdata_item *last;
78 } rcdata;
79 rc_rcdata_item *rcdata_item;
80 rc_fixed_versioninfo *fixver;
81 rc_ver_info *verinfo;
82 rc_ver_stringtable *verstringtable;
83 rc_ver_stringinfo *verstring;
84 rc_ver_varinfo *vervar;
85 rc_toolbar_item *toobar_item;
86 rc_res_id id;
87 rc_res_res_info res_info;
88 struct
90 rc_uint_type on;
91 rc_uint_type off;
92 } memflags;
93 struct
95 rc_uint_type val;
96 /* Nonzero if this number was explicitly specified as long. */
97 int dword;
98 } i;
99 rc_uint_type il;
100 rc_uint_type is;
101 const char *s;
102 struct
104 rc_uint_type length;
105 const char *s;
106 } ss;
107 unichar *uni;
108 struct
110 rc_uint_type length;
111 const unichar *s;
112 } suni;
115 %token BEG END
116 %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
117 %token BITMAP
118 %token CURSOR
119 %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE
120 %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT
121 %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON
122 %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON
123 %token BEDIT HEDIT IEDIT
124 %token FONT
125 %token ICON
126 %token ANICURSOR ANIICON DLGINCLUDE DLGINIT FONTDIR HTML MANIFEST PLUGPLAY VXD TOOLBAR BUTTON
127 %token LANGUAGE CHARACTERISTICS VERSIONK
128 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE
129 %token MENUBARBREAK MENUBREAK
130 %token MESSAGETABLE
131 %token RCDATA
132 %token STRINGTABLE
133 %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS
134 %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO
135 %token VALUE
136 %token <s> BLOCK
137 %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE
138 %token NOT
139 %token <uni> QUOTEDUNISTRING
140 %token <s> QUOTEDSTRING STRING
141 %token <i> NUMBER
142 %token <suni> SIZEDUNISTRING
143 %token <ss> SIZEDSTRING
144 %token IGNORED_TOKEN
146 %type <pacc> acc_entries
147 %type <acc> acc_entry acc_event
148 %type <dialog_control> control control_params
149 %type <menuitem> menuitems menuitem menuexitems menuexitem
150 %type <rcdata> optrcdata_data optrcdata_data_int rcdata_data
151 %type <rcdata_item> opt_control_data
152 %type <fixver> fixedverinfo
153 %type <verinfo> verblocks
154 %type <verstringtable> verstringtables
155 %type <verstring> vervals
156 %type <vervar> vertrans
157 %type <toobar_item> toolbar_data
158 %type <res_info> suboptions memflags_move_discard memflags_move
159 %type <memflags> memflag
160 %type <id> id rcdata_id optresidc resref resid cresid
161 %type <il> exstyle parennumber
162 %type <il> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr
163 %type <is> acc_options acc_option menuitem_flags menuitem_flag
164 %type <s> file_name
165 %type <uni> res_unicode_string resname res_unicode_string_concat
166 %type <ss> sizedstring
167 %type <suni> sizedunistring res_unicode_sizedstring res_unicode_sizedstring_concat
168 %type <i> sizednumexpr sizedposnumexpr
170 %left '|'
171 %left '^'
172 %left '&'
173 %left '+' '-'
174 %left '*' '/' '%'
175 %right '~' NEG
179 input:
180 /* empty */
181 | input accelerator
182 | input bitmap
183 | input cursor
184 | input dialog
185 | input font
186 | input icon
187 | input language
188 | input menu
189 | input menuex
190 | input messagetable
191 | input stringtable
192 | input toolbar
193 | input user
194 | input versioninfo
195 | input IGNORED_TOKEN
198 /* Accelerator resources. */
200 accelerator:
201 id ACCELERATORS suboptions BEG acc_entries END
203 define_accelerator ($1, &$3, $5);
204 if (yychar != YYEMPTY)
205 YYERROR;
206 rcparse_discard_strings ();
210 acc_entries:
211 /* empty */
213 $$ = NULL;
215 | acc_entries acc_entry
217 rc_accelerator *a;
219 a = (rc_accelerator *) res_alloc (sizeof *a);
220 *a = $2;
221 if ($1 == NULL)
222 $$ = a;
223 else
225 rc_accelerator **pp;
227 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
229 *pp = a;
230 $$ = $1;
235 acc_entry:
236 acc_event cposnumexpr
238 $$ = $1;
239 $$.id = $2;
241 | acc_event cposnumexpr ',' acc_options
243 $$ = $1;
244 $$.id = $2;
245 $$.flags |= $4;
246 if (($$.flags & ACC_VIRTKEY) == 0
247 && ($$.flags & (ACC_SHIFT | ACC_CONTROL)) != 0)
248 rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
252 acc_event:
253 QUOTEDSTRING
255 const char *s = $1;
256 char ch;
258 $$.next = NULL;
259 $$.id = 0;
260 ch = *s;
261 if (ch != '^')
262 $$.flags = 0;
263 else
265 $$.flags = ACC_CONTROL | ACC_VIRTKEY;
266 ++s;
267 ch = TOUPPER (s[0]);
269 $$.key = ch;
270 if (s[1] != '\0')
271 rcparse_warning (_("accelerator should only be one character"));
273 | posnumexpr
275 $$.next = NULL;
276 $$.flags = 0;
277 $$.id = 0;
278 $$.key = $1;
282 acc_options:
283 acc_option
285 $$ = $1;
287 | acc_options ',' acc_option
289 $$ = $1 | $3;
291 /* I've had one report that the comma is optional. */
292 | acc_options acc_option
294 $$ = $1 | $2;
298 acc_option:
299 VIRTKEY
301 $$ = ACC_VIRTKEY;
303 | ASCII
305 /* This is just the absence of VIRTKEY. */
306 $$ = 0;
308 | NOINVERT
310 $$ = ACC_NOINVERT;
312 | SHIFT
314 $$ = ACC_SHIFT;
316 | CONTROL
318 $$ = ACC_CONTROL;
320 | ALT
322 $$ = ACC_ALT;
326 /* Bitmap resources. */
328 bitmap:
329 id BITMAP memflags_move file_name
331 define_bitmap ($1, &$3, $4);
332 if (yychar != YYEMPTY)
333 YYERROR;
334 rcparse_discard_strings ();
338 /* Cursor resources. */
340 cursor:
341 id CURSOR memflags_move_discard file_name
343 define_cursor ($1, &$3, $4);
344 if (yychar != YYEMPTY)
345 YYERROR;
346 rcparse_discard_strings ();
350 /* Dialog resources. */
352 dialog:
353 id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr
354 cnumexpr
356 memset (&dialog, 0, sizeof dialog);
357 dialog.x = $5;
358 dialog.y = $6;
359 dialog.width = $7;
360 dialog.height = $8;
361 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
362 dialog.exstyle = $4;
363 dialog.menu.named = 1;
364 dialog.class.named = 1;
365 dialog.font = NULL;
366 dialog.ex = NULL;
367 dialog.controls = NULL;
368 sub_res_info = $3;
369 style = 0;
371 styles BEG controls END
373 define_dialog ($1, &sub_res_info, &dialog);
374 if (yychar != YYEMPTY)
375 YYERROR;
376 rcparse_discard_strings ();
378 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
379 cnumexpr
381 memset (&dialog, 0, sizeof dialog);
382 dialog.x = $5;
383 dialog.y = $6;
384 dialog.width = $7;
385 dialog.height = $8;
386 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
387 dialog.exstyle = $4;
388 dialog.menu.named = 1;
389 dialog.class.named = 1;
390 dialog.font = NULL;
391 dialog.ex = ((rc_dialog_ex *)
392 res_alloc (sizeof (rc_dialog_ex)));
393 memset (dialog.ex, 0, sizeof (rc_dialog_ex));
394 dialog.controls = NULL;
395 sub_res_info = $3;
396 style = 0;
398 styles BEG controls END
400 define_dialog ($1, &sub_res_info, &dialog);
401 if (yychar != YYEMPTY)
402 YYERROR;
403 rcparse_discard_strings ();
405 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
406 cnumexpr cnumexpr
408 memset (&dialog, 0, sizeof dialog);
409 dialog.x = $5;
410 dialog.y = $6;
411 dialog.width = $7;
412 dialog.height = $8;
413 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
414 dialog.exstyle = $4;
415 dialog.menu.named = 1;
416 dialog.class.named = 1;
417 dialog.font = NULL;
418 dialog.ex = ((rc_dialog_ex *)
419 res_alloc (sizeof (rc_dialog_ex)));
420 memset (dialog.ex, 0, sizeof (rc_dialog_ex));
421 dialog.ex->help = $9;
422 dialog.controls = NULL;
423 sub_res_info = $3;
424 style = 0;
426 styles BEG controls END
428 define_dialog ($1, &sub_res_info, &dialog);
429 if (yychar != YYEMPTY)
430 YYERROR;
431 rcparse_discard_strings ();
435 exstyle:
436 /* empty */
438 $$ = 0;
440 | EXSTYLE '=' numexpr
442 $$ = $3;
446 styles:
447 /* empty */
448 | styles CAPTION res_unicode_string_concat
450 dialog.style |= WS_CAPTION;
451 style |= WS_CAPTION;
452 dialog.caption = $3;
454 | styles CLASS id
456 dialog.class = $3;
458 | styles STYLE
459 styleexpr
461 dialog.style = style;
463 | styles EXSTYLE numexpr
465 dialog.exstyle = $3;
467 | styles CLASS res_unicode_string_concat
469 res_unistring_to_id (& dialog.class, $3);
471 | styles FONT numexpr ',' res_unicode_string_concat
473 dialog.style |= DS_SETFONT;
474 style |= DS_SETFONT;
475 dialog.pointsize = $3;
476 dialog.font = $5;
477 if (dialog.ex != NULL)
479 dialog.ex->weight = 0;
480 dialog.ex->italic = 0;
481 dialog.ex->charset = 1;
484 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr
486 dialog.style |= DS_SETFONT;
487 style |= DS_SETFONT;
488 dialog.pointsize = $3;
489 dialog.font = $5;
490 if (dialog.ex == NULL)
491 rcparse_warning (_("extended FONT requires DIALOGEX"));
492 else
494 dialog.ex->weight = $6;
495 dialog.ex->italic = 0;
496 dialog.ex->charset = 1;
499 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr
501 dialog.style |= DS_SETFONT;
502 style |= DS_SETFONT;
503 dialog.pointsize = $3;
504 dialog.font = $5;
505 if (dialog.ex == NULL)
506 rcparse_warning (_("extended FONT requires DIALOGEX"));
507 else
509 dialog.ex->weight = $6;
510 dialog.ex->italic = $7;
511 dialog.ex->charset = 1;
514 | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr cnumexpr
516 dialog.style |= DS_SETFONT;
517 style |= DS_SETFONT;
518 dialog.pointsize = $3;
519 dialog.font = $5;
520 if (dialog.ex == NULL)
521 rcparse_warning (_("extended FONT requires DIALOGEX"));
522 else
524 dialog.ex->weight = $6;
525 dialog.ex->italic = $7;
526 dialog.ex->charset = $8;
529 | styles MENU id
531 dialog.menu = $3;
533 | styles CHARACTERISTICS numexpr
535 sub_res_info.characteristics = $3;
537 | styles LANGUAGE numexpr cnumexpr
539 sub_res_info.language = $3 | ($4 << SUBLANG_SHIFT);
541 | styles VERSIONK numexpr
543 sub_res_info.version = $3;
547 controls:
548 /* empty */
549 | controls control
551 rc_dialog_control **pp;
553 for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next)
555 *pp = $2;
559 control:
560 AUTO3STATE optresidc
562 default_style = BS_AUTO3STATE | WS_TABSTOP;
563 base_style = BS_AUTO3STATE;
564 class.named = 0;
565 class.u.id = CTL_BUTTON;
566 res_text_field = $2;
568 control_params
570 $$ = $4;
572 | AUTOCHECKBOX optresidc
574 default_style = BS_AUTOCHECKBOX | WS_TABSTOP;
575 base_style = BS_AUTOCHECKBOX;
576 class.named = 0;
577 class.u.id = CTL_BUTTON;
578 res_text_field = $2;
580 control_params
582 $$ = $4;
584 | AUTORADIOBUTTON optresidc
586 default_style = BS_AUTORADIOBUTTON | WS_TABSTOP;
587 base_style = BS_AUTORADIOBUTTON;
588 class.named = 0;
589 class.u.id = CTL_BUTTON;
590 res_text_field = $2;
592 control_params
594 $$ = $4;
596 | BEDIT optresidc
598 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
599 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
600 class.named = 0;
601 class.u.id = CTL_EDIT;
602 res_text_field = $2;
604 control_params
606 $$ = $4;
607 if (dialog.ex == NULL)
608 rcparse_warning (_("BEDIT requires DIALOGEX"));
609 res_string_to_id (&$$->class, "BEDIT");
611 | CHECKBOX optresidc
613 default_style = BS_CHECKBOX | WS_TABSTOP;
614 base_style = BS_CHECKBOX | WS_TABSTOP;
615 class.named = 0;
616 class.u.id = CTL_BUTTON;
617 res_text_field = $2;
619 control_params
621 $$ = $4;
623 | COMBOBOX
625 /* This is as per MSDN documentation. With some (???)
626 versions of MS rc.exe their is no default style. */
627 default_style = CBS_SIMPLE | WS_TABSTOP;
628 base_style = 0;
629 class.named = 0;
630 class.u.id = CTL_COMBOBOX;
631 res_text_field = res_null_text;
633 control_params
635 $$ = $3;
637 | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
638 cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
640 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
641 if ($11 != NULL)
643 if (dialog.ex == NULL)
644 rcparse_warning (_("control data requires DIALOGEX"));
645 $$->data = $11;
648 | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
649 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
651 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
652 if (dialog.ex == NULL)
653 rcparse_warning (_("help ID requires DIALOGEX"));
654 $$->help = $11;
655 $$->data = $12;
657 | CTEXT optresidc
659 default_style = SS_CENTER | WS_GROUP;
660 base_style = SS_CENTER;
661 class.named = 0;
662 class.u.id = CTL_STATIC;
663 res_text_field = $2;
665 control_params
667 $$ = $4;
669 | DEFPUSHBUTTON optresidc
671 default_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
672 base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
673 class.named = 0;
674 class.u.id = CTL_BUTTON;
675 res_text_field = $2;
677 control_params
679 $$ = $4;
681 | EDITTEXT
683 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
684 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
685 class.named = 0;
686 class.u.id = CTL_EDIT;
687 res_text_field = res_null_text;
689 control_params
691 $$ = $3;
693 | GROUPBOX optresidc
695 default_style = BS_GROUPBOX;
696 base_style = BS_GROUPBOX;
697 class.named = 0;
698 class.u.id = CTL_BUTTON;
699 res_text_field = $2;
701 control_params
703 $$ = $4;
705 | HEDIT optresidc
707 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
708 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
709 class.named = 0;
710 class.u.id = CTL_EDIT;
711 res_text_field = $2;
713 control_params
715 $$ = $4;
716 if (dialog.ex == NULL)
717 rcparse_warning (_("IEDIT requires DIALOGEX"));
718 res_string_to_id (&$$->class, "HEDIT");
720 | ICON resref numexpr cnumexpr cnumexpr opt_control_data
722 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $6,
723 dialog.ex);
725 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
726 opt_control_data
728 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $8,
729 dialog.ex);
731 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
732 icon_styleexpr optcnumexpr opt_control_data
734 $$ = define_icon_control ($2, $3, $4, $5, style, $9, 0, $10,
735 dialog.ex);
737 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
738 icon_styleexpr cnumexpr cnumexpr opt_control_data
740 $$ = define_icon_control ($2, $3, $4, $5, style, $9, $10, $11,
741 dialog.ex);
743 | IEDIT optresidc
745 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
746 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
747 class.named = 0;
748 class.u.id = CTL_EDIT;
749 res_text_field = $2;
751 control_params
753 $$ = $4;
754 if (dialog.ex == NULL)
755 rcparse_warning (_("IEDIT requires DIALOGEX"));
756 res_string_to_id (&$$->class, "IEDIT");
758 | LISTBOX
760 default_style = LBS_NOTIFY | WS_BORDER;
761 base_style = LBS_NOTIFY | WS_BORDER;
762 class.named = 0;
763 class.u.id = CTL_LISTBOX;
764 res_text_field = res_null_text;
766 control_params
768 $$ = $3;
770 | LTEXT optresidc
772 default_style = SS_LEFT | WS_GROUP;
773 base_style = SS_LEFT;
774 class.named = 0;
775 class.u.id = CTL_STATIC;
776 res_text_field = $2;
778 control_params
780 $$ = $4;
782 | PUSHBOX optresidc
784 default_style = BS_PUSHBOX | WS_TABSTOP;
785 base_style = BS_PUSHBOX;
786 class.named = 0;
787 class.u.id = CTL_BUTTON;
789 control_params
791 $$ = $4;
793 | PUSHBUTTON optresidc
795 default_style = BS_PUSHBUTTON | WS_TABSTOP;
796 base_style = BS_PUSHBUTTON | WS_TABSTOP;
797 class.named = 0;
798 class.u.id = CTL_BUTTON;
799 res_text_field = $2;
801 control_params
803 $$ = $4;
805 | RADIOBUTTON optresidc
807 default_style = BS_RADIOBUTTON | WS_TABSTOP;
808 base_style = BS_RADIOBUTTON;
809 class.named = 0;
810 class.u.id = CTL_BUTTON;
811 res_text_field = $2;
813 control_params
815 $$ = $4;
817 | RTEXT optresidc
819 default_style = SS_RIGHT | WS_GROUP;
820 base_style = SS_RIGHT;
821 class.named = 0;
822 class.u.id = CTL_STATIC;
823 res_text_field = $2;
825 control_params
827 $$ = $4;
829 | SCROLLBAR
831 default_style = SBS_HORZ;
832 base_style = 0;
833 class.named = 0;
834 class.u.id = CTL_SCROLLBAR;
835 res_text_field = res_null_text;
837 control_params
839 $$ = $3;
841 | STATE3 optresidc
843 default_style = BS_3STATE | WS_TABSTOP;
844 base_style = BS_3STATE;
845 class.named = 0;
846 class.u.id = CTL_BUTTON;
847 res_text_field = $2;
849 control_params
851 $$ = $4;
853 | USERBUTTON resref numexpr ',' numexpr ',' numexpr ','
854 numexpr ',' numexpr ','
855 { style = WS_CHILD | WS_VISIBLE; }
856 styleexpr optcnumexpr
858 rc_res_id cid;
859 cid.named = 0;
860 cid.u.id = CTL_BUTTON;
861 $$ = define_control ($2, $3, $5, $7, $9, $11, cid,
862 style, $15);
866 /* Parameters for a control. The static variables DEFAULT_STYLE,
867 BASE_STYLE, and CLASS must be initialized before this nonterminal
868 is used. DEFAULT_STYLE is the style to use if no style expression
869 is specified. BASE_STYLE is the base style to use if a style
870 expression is specified; the style expression modifies the base
871 style. CLASS is the class of the control. */
873 control_params:
874 numexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
876 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class,
877 default_style | WS_CHILD | WS_VISIBLE, 0);
878 if ($6 != NULL)
880 if (dialog.ex == NULL)
881 rcparse_warning (_("control data requires DIALOGEX"));
882 $$->data = $6;
885 | numexpr cnumexpr cnumexpr cnumexpr cnumexpr
886 control_params_styleexpr optcnumexpr opt_control_data
888 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
889 if ($8 != NULL)
891 if (dialog.ex == NULL)
892 rcparse_warning (_("control data requires DIALOGEX"));
893 $$->data = $8;
896 | numexpr cnumexpr cnumexpr cnumexpr cnumexpr
897 control_params_styleexpr cnumexpr cnumexpr opt_control_data
899 $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
900 if (dialog.ex == NULL)
901 rcparse_warning (_("help ID requires DIALOGEX"));
902 $$->help = $8;
903 $$->data = $9;
907 cresid:
908 ',' resid
910 if ($2.named)
911 res_unistring_to_id (&$$, $2.u.n.name);
912 else
913 $$=$2;
917 optresidc:
918 /* empty */
920 res_string_to_id (&$$, "");
922 | resid ',' { $$=$1; }
925 resid:
926 posnumexpr
928 $$.named = 0;
929 $$.u.id = $1;
931 | res_unicode_string_concat
933 $$.named = 1;
934 $$.u.n.name = $1;
935 $$.u.n.length = unichar_len ($1);
939 opt_control_data:
940 /* empty */
942 $$ = NULL;
944 | BEG optrcdata_data END
946 $$ = $2.first;
950 /* These only exist to parse a reduction out of a common case. */
952 control_styleexpr:
954 { style = WS_CHILD | WS_VISIBLE; }
955 styleexpr
958 icon_styleexpr:
960 { style = SS_ICON | WS_CHILD | WS_VISIBLE; }
961 styleexpr
964 control_params_styleexpr:
966 { style = base_style | WS_CHILD | WS_VISIBLE; }
967 styleexpr
970 /* Font resources. */
972 font:
973 id FONT memflags_move_discard file_name
975 define_font ($1, &$3, $4);
976 if (yychar != YYEMPTY)
977 YYERROR;
978 rcparse_discard_strings ();
982 /* Icon resources. */
984 icon:
985 id ICON memflags_move_discard file_name
987 define_icon ($1, &$3, $4);
988 if (yychar != YYEMPTY)
989 YYERROR;
990 rcparse_discard_strings ();
994 /* Language command. This changes the static variable language, which
995 affects all subsequent resources. */
997 language:
998 LANGUAGE numexpr cnumexpr
1000 language = $2 | ($3 << SUBLANG_SHIFT);
1004 /* Menu resources. */
1006 menu:
1007 id MENU suboptions BEG menuitems END
1009 define_menu ($1, &$3, $5);
1010 if (yychar != YYEMPTY)
1011 YYERROR;
1012 rcparse_discard_strings ();
1016 menuitems:
1017 /* empty */
1019 $$ = NULL;
1021 | menuitems menuitem
1023 if ($1 == NULL)
1024 $$ = $2;
1025 else
1027 rc_menuitem **pp;
1029 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
1031 *pp = $2;
1032 $$ = $1;
1037 menuitem:
1038 MENUITEM res_unicode_string_concat cnumexpr menuitem_flags
1040 $$ = define_menuitem ($2, $3, $4, 0, 0, NULL);
1042 | MENUITEM SEPARATOR
1044 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
1046 | POPUP res_unicode_string_concat menuitem_flags BEG menuitems END
1048 $$ = define_menuitem ($2, 0, $3, 0, 0, $5);
1052 menuitem_flags:
1053 /* empty */
1055 $$ = 0;
1057 | menuitem_flags ',' menuitem_flag
1059 $$ = $1 | $3;
1061 | menuitem_flags menuitem_flag
1063 $$ = $1 | $2;
1067 menuitem_flag:
1068 CHECKED
1070 $$ = MENUITEM_CHECKED;
1072 | GRAYED
1074 $$ = MENUITEM_GRAYED;
1076 | HELP
1078 $$ = MENUITEM_HELP;
1080 | INACTIVE
1082 $$ = MENUITEM_INACTIVE;
1084 | MENUBARBREAK
1086 $$ = MENUITEM_MENUBARBREAK;
1088 | MENUBREAK
1090 $$ = MENUITEM_MENUBREAK;
1094 /* Menuex resources. */
1096 menuex:
1097 id MENUEX suboptions BEG menuexitems END
1099 define_menu ($1, &$3, $5);
1100 if (yychar != YYEMPTY)
1101 YYERROR;
1102 rcparse_discard_strings ();
1106 menuexitems:
1107 /* empty */
1109 $$ = NULL;
1111 | menuexitems menuexitem
1113 if ($1 == NULL)
1114 $$ = $2;
1115 else
1117 rc_menuitem **pp;
1119 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
1121 *pp = $2;
1122 $$ = $1;
1127 menuexitem:
1128 MENUITEM res_unicode_string_concat
1130 $$ = define_menuitem ($2, 0, 0, 0, 0, NULL);
1132 | MENUITEM res_unicode_string_concat cnumexpr
1134 $$ = define_menuitem ($2, $3, 0, 0, 0, NULL);
1136 | MENUITEM res_unicode_string_concat cnumexpr cnumexpr optcnumexpr
1138 $$ = define_menuitem ($2, $3, $4, $5, 0, NULL);
1140 | MENUITEM SEPARATOR
1142 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
1144 | POPUP res_unicode_string_concat BEG menuexitems END
1146 $$ = define_menuitem ($2, 0, 0, 0, 0, $4);
1148 | POPUP res_unicode_string_concat cnumexpr BEG menuexitems END
1150 $$ = define_menuitem ($2, $3, 0, 0, 0, $5);
1152 | POPUP res_unicode_string_concat cnumexpr cnumexpr BEG menuexitems END
1154 $$ = define_menuitem ($2, $3, $4, 0, 0, $6);
1156 | POPUP res_unicode_string_concat cnumexpr cnumexpr cnumexpr optcnumexpr
1157 BEG menuexitems END
1159 $$ = define_menuitem ($2, $3, $4, $5, $6, $8);
1163 /* Messagetable resources. */
1165 messagetable:
1166 id MESSAGETABLE memflags_move file_name
1168 define_messagetable ($1, &$3, $4);
1169 if (yychar != YYEMPTY)
1170 YYERROR;
1171 rcparse_discard_strings ();
1175 /* We use a different lexing algorithm, because rcdata strings may
1176 contain embedded null bytes, and we need to know the length to use. */
1178 optrcdata_data:
1180 rcparse_rcdata ();
1182 optrcdata_data_int
1184 rcparse_normal ();
1185 $$ = $2;
1189 optrcdata_data_int:
1190 /* empty */
1192 $$.first = NULL;
1193 $$.last = NULL;
1195 | rcdata_data
1197 $$ = $1;
1201 rcdata_data:
1202 sizedstring
1204 rc_rcdata_item *ri;
1206 ri = define_rcdata_string ($1.s, $1.length);
1207 $$.first = ri;
1208 $$.last = ri;
1210 | sizedunistring
1212 rc_rcdata_item *ri;
1214 ri = define_rcdata_unistring ($1.s, $1.length);
1215 $$.first = ri;
1216 $$.last = ri;
1218 | sizednumexpr
1220 rc_rcdata_item *ri;
1222 ri = define_rcdata_number ($1.val, $1.dword);
1223 $$.first = ri;
1224 $$.last = ri;
1226 | rcdata_data ',' sizedstring
1228 rc_rcdata_item *ri;
1230 ri = define_rcdata_string ($3.s, $3.length);
1231 $$.first = $1.first;
1232 $1.last->next = ri;
1233 $$.last = ri;
1235 | rcdata_data ',' sizedunistring
1237 rc_rcdata_item *ri;
1239 ri = define_rcdata_unistring ($3.s, $3.length);
1240 $$.first = $1.first;
1241 $1.last->next = ri;
1242 $$.last = ri;
1244 | rcdata_data ',' sizednumexpr
1246 rc_rcdata_item *ri;
1248 ri = define_rcdata_number ($3.val, $3.dword);
1249 $$.first = $1.first;
1250 $1.last->next = ri;
1251 $$.last = ri;
1253 | rcdata_data ','
1255 $$=$1;
1259 /* Stringtable resources. */
1261 stringtable:
1262 STRINGTABLE suboptions BEG
1263 { sub_res_info = $2; rcparse_rcdata (); }
1264 string_data END { rcparse_normal (); }
1267 string_data:
1268 /* empty */
1269 | string_data numexpr res_unicode_sizedstring_concat
1271 define_stringtable (&sub_res_info, $2, $3.s, $3.length);
1272 rcparse_discard_strings ();
1274 | string_data numexpr ',' res_unicode_sizedstring_concat
1276 define_stringtable (&sub_res_info, $2, $4.s, $4.length);
1277 rcparse_discard_strings ();
1279 | string_data error
1281 rcparse_warning (_("invalid stringtable resource."));
1282 abort ();
1286 rcdata_id:
1289 $$=$1;
1291 | HTML
1293 $$.named = 0;
1294 $$.u.id = 23;
1296 | RCDATA
1298 $$.named = 0;
1299 $$.u.id = RT_RCDATA;
1301 | MANIFEST
1303 $$.named = 0;
1304 $$.u.id = RT_MANIFEST;
1306 | PLUGPLAY
1308 $$.named = 0;
1309 $$.u.id = RT_PLUGPLAY;
1311 | VXD
1313 $$.named = 0;
1314 $$.u.id = RT_VXD;
1316 | DLGINCLUDE
1318 $$.named = 0;
1319 $$.u.id = RT_DLGINCLUDE;
1321 | DLGINIT
1323 $$.named = 0;
1324 $$.u.id = RT_DLGINIT;
1326 | ANICURSOR
1328 $$.named = 0;
1329 $$.u.id = RT_ANICURSOR;
1331 | ANIICON
1333 $$.named = 0;
1334 $$.u.id = RT_ANIICON;
1338 /* User defined resources. We accept general suboptions in the
1339 file_name case to keep the parser happy. */
1341 user:
1342 id rcdata_id suboptions BEG optrcdata_data END
1344 define_user_data ($1, $2, &$3, $5.first);
1345 if (yychar != YYEMPTY)
1346 YYERROR;
1347 rcparse_discard_strings ();
1349 | id rcdata_id suboptions file_name
1351 define_user_file ($1, $2, &$3, $4);
1352 if (yychar != YYEMPTY)
1353 YYERROR;
1354 rcparse_discard_strings ();
1358 toolbar:
1359 id TOOLBAR suboptions numexpr cnumexpr BEG toolbar_data END
1361 define_toolbar ($1, &$3, $4, $5, $7);
1365 toolbar_data: /* empty */ { $$= NULL; }
1366 | toolbar_data BUTTON id
1368 rc_toolbar_item *c,*n;
1369 c = $1;
1370 n= (rc_toolbar_item *)
1371 res_alloc (sizeof (rc_toolbar_item));
1372 if (c != NULL)
1373 while (c->next != NULL)
1374 c = c->next;
1375 n->prev = c;
1376 n->next = NULL;
1377 if (c != NULL)
1378 c->next = n;
1379 n->id = $3;
1380 if ($1 == NULL)
1381 $$ = n;
1382 else
1383 $$ = $1;
1385 | toolbar_data SEPARATOR
1387 rc_toolbar_item *c,*n;
1388 c = $1;
1389 n= (rc_toolbar_item *)
1390 res_alloc (sizeof (rc_toolbar_item));
1391 if (c != NULL)
1392 while (c->next != NULL)
1393 c = c->next;
1394 n->prev = c;
1395 n->next = NULL;
1396 if (c != NULL)
1397 c->next = n;
1398 n->id.named = 0;
1399 n->id.u.id = 0;
1400 if ($1 == NULL)
1401 $$ = n;
1402 else
1403 $$ = $1;
1407 /* Versioninfo resources. */
1409 versioninfo:
1410 id VERSIONINFO fixedverinfo BEG verblocks END
1412 define_versioninfo ($1, language, $3, $5);
1413 if (yychar != YYEMPTY)
1414 YYERROR;
1415 rcparse_discard_strings ();
1419 fixedverinfo:
1420 /* empty */
1422 $$ = ((rc_fixed_versioninfo *)
1423 res_alloc (sizeof (rc_fixed_versioninfo)));
1424 memset ($$, 0, sizeof (rc_fixed_versioninfo));
1426 | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr
1428 $1->file_version_ms = ($3 << 16) | $4;
1429 $1->file_version_ls = ($5 << 16) | $6;
1430 $$ = $1;
1432 | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr
1434 $1->product_version_ms = ($3 << 16) | $4;
1435 $1->product_version_ls = ($5 << 16) | $6;
1436 $$ = $1;
1438 | fixedverinfo FILEFLAGSMASK numexpr
1440 $1->file_flags_mask = $3;
1441 $$ = $1;
1443 | fixedverinfo FILEFLAGS numexpr
1445 $1->file_flags = $3;
1446 $$ = $1;
1448 | fixedverinfo FILEOS numexpr
1450 $1->file_os = $3;
1451 $$ = $1;
1453 | fixedverinfo FILETYPE numexpr
1455 $1->file_type = $3;
1456 $$ = $1;
1458 | fixedverinfo FILESUBTYPE numexpr
1460 $1->file_subtype = $3;
1461 $$ = $1;
1465 /* To handle verblocks successfully, the lexer handles BLOCK
1466 specially. A BLOCK "StringFileInfo" is returned as
1467 BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as
1468 BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK
1469 with the string as the value. */
1471 verblocks:
1472 /* empty */
1474 $$ = NULL;
1476 | verblocks BLOCKSTRINGFILEINFO BEG verstringtables END
1478 $$ = append_ver_stringfileinfo ($1, $4);
1480 | verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END
1482 $$ = append_ver_varfileinfo ($1, $5, $6);
1486 verstringtables:
1487 /* empty */
1489 $$ = NULL;
1491 | verstringtables BLOCK BEG vervals END
1493 $$ = append_ver_stringtable ($1, $2, $4);
1497 vervals:
1498 /* empty */
1500 $$ = NULL;
1502 | vervals VALUE res_unicode_string_concat ',' res_unicode_string_concat
1504 $$ = append_verval ($1, $3, $5);
1508 vertrans:
1509 /* empty */
1511 $$ = NULL;
1513 | vertrans cnumexpr cnumexpr
1515 $$ = append_vertrans ($1, $2, $3);
1519 /* A resource ID. */
1522 posnumexpr
1524 $$.named = 0;
1525 $$.u.id = $1;
1527 | resname
1529 res_unistring_to_id (&$$, $1);
1533 /* A resource reference. */
1535 resname:
1536 res_unicode_string
1538 $$ = $1;
1540 | STRING
1542 unichar *h = NULL;
1543 unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
1544 $$ = h;
1549 resref:
1550 posnumexpr ','
1552 $$.named = 0;
1553 $$.u.id = $1;
1555 | resname
1557 res_unistring_to_id (&$$, $1);
1559 | resname ','
1561 res_unistring_to_id (&$$, $1);
1565 /* Generic suboptions. These may appear before the BEGIN in any
1566 multiline statement. */
1568 suboptions:
1569 /* empty */
1571 memset (&$$, 0, sizeof (rc_res_res_info));
1572 $$.language = language;
1573 /* FIXME: Is this the right default? */
1574 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
1576 | suboptions memflag
1578 $$ = $1;
1579 $$.memflags |= $2.on;
1580 $$.memflags &=~ $2.off;
1582 | suboptions CHARACTERISTICS numexpr
1584 $$ = $1;
1585 $$.characteristics = $3;
1587 | suboptions LANGUAGE numexpr cnumexpr
1589 $$ = $1;
1590 $$.language = $3 | ($4 << SUBLANG_SHIFT);
1592 | suboptions VERSIONK numexpr
1594 $$ = $1;
1595 $$.version = $3;
1599 /* Memory flags which default to MOVEABLE and DISCARDABLE. */
1601 memflags_move_discard:
1602 /* empty */
1604 memset (&$$, 0, sizeof (rc_res_res_info));
1605 $$.language = language;
1606 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE;
1608 | memflags_move_discard memflag
1610 $$ = $1;
1611 $$.memflags |= $2.on;
1612 $$.memflags &=~ $2.off;
1616 /* Memory flags which default to MOVEABLE. */
1618 memflags_move:
1619 /* empty */
1621 memset (&$$, 0, sizeof (rc_res_res_info));
1622 $$.language = language;
1623 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
1625 | memflags_move memflag
1627 $$ = $1;
1628 $$.memflags |= $2.on;
1629 $$.memflags &=~ $2.off;
1633 /* Memory flags. This returns a struct with two integers, because we
1634 sometimes want to set bits and we sometimes want to clear them. */
1636 memflag:
1637 MOVEABLE
1639 $$.on = MEMFLAG_MOVEABLE;
1640 $$.off = 0;
1642 | FIXED
1644 $$.on = 0;
1645 $$.off = MEMFLAG_MOVEABLE;
1647 | PURE
1649 $$.on = MEMFLAG_PURE;
1650 $$.off = 0;
1652 | IMPURE
1654 $$.on = 0;
1655 $$.off = MEMFLAG_PURE;
1657 | PRELOAD
1659 $$.on = MEMFLAG_PRELOAD;
1660 $$.off = 0;
1662 | LOADONCALL
1664 $$.on = 0;
1665 $$.off = MEMFLAG_PRELOAD;
1667 | DISCARDABLE
1669 $$.on = MEMFLAG_DISCARDABLE;
1670 $$.off = 0;
1674 /* A file name. */
1676 file_name:
1677 QUOTEDSTRING
1679 $$ = $1;
1681 | STRING
1683 $$ = $1;
1687 /* Concat string */
1688 res_unicode_string_concat:
1689 res_unicode_string
1691 $$ = $1;
1694 res_unicode_string_concat res_unicode_string
1696 rc_uint_type l1 = unichar_len ($1);
1697 rc_uint_type l2 = unichar_len ($2);
1698 unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
1699 if (l1 != 0)
1700 memcpy (h, $1, l1 * sizeof (unichar));
1701 if (l2 != 0)
1702 memcpy (h + l1, $2, l2 * sizeof (unichar));
1703 h[l1 + l2] = 0;
1704 $$ = h;
1708 res_unicode_string:
1709 QUOTEDUNISTRING
1711 $$ = unichar_dup ($1);
1713 | QUOTEDSTRING
1715 unichar *h = NULL;
1716 unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
1717 $$ = h;
1721 res_unicode_sizedstring:
1722 sizedunistring
1724 $$ = $1;
1726 | sizedstring
1728 unichar *h = NULL;
1729 rc_uint_type l = 0;
1730 unicode_from_ascii_len (&l, &h, $1.s, $1.length);
1731 $$.s = h;
1732 $$.length = l;
1736 /* Concat string */
1737 res_unicode_sizedstring_concat:
1738 res_unicode_sizedstring
1740 $$ = $1;
1743 res_unicode_sizedstring_concat res_unicode_sizedstring
1745 rc_uint_type l1 = $1.length;
1746 rc_uint_type l2 = $2.length;
1747 unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
1748 if (l1 != 0)
1749 memcpy (h, $1.s, l1 * sizeof (unichar));
1750 if (l2 != 0)
1751 memcpy (h + l1, $2.s, l2 * sizeof (unichar));
1752 h[l1 + l2] = 0;
1753 $$.length = l1 + l2;
1754 $$.s = h;
1758 sizedstring:
1759 SIZEDSTRING
1761 $$ = $1;
1763 | sizedstring SIZEDSTRING
1765 rc_uint_type l = $1.length + $2.length;
1766 char *h = (char *) res_alloc (l);
1767 memcpy (h, $1.s, $1.length);
1768 memcpy (h + $1.length, $2.s, $2.length);
1769 $$.s = h;
1770 $$.length = l;
1774 sizedunistring:
1775 SIZEDUNISTRING
1777 $$ = $1;
1779 | sizedunistring SIZEDUNISTRING
1781 rc_uint_type l = $1.length + $2.length;
1782 unichar *h = (unichar *) res_alloc (l * sizeof (unichar));
1783 memcpy (h, $1.s, $1.length * sizeof (unichar));
1784 memcpy (h + $1.length, $2.s, $2.length * sizeof (unichar));
1785 $$.s = h;
1786 $$.length = l;
1790 /* A style expression. This changes the static variable STYLE. We do
1791 it this way because rc appears to permit a style to be set to
1792 something like
1793 WS_GROUP | NOT WS_TABSTOP
1794 to mean that a default of WS_TABSTOP should be removed. Anything
1795 which wants to accept a style must first set STYLE to the default
1796 value. The styleexpr nonterminal will change STYLE as specified by
1797 the user. Note that we do not accept arbitrary expressions here,
1798 just numbers separated by '|'. */
1800 styleexpr:
1801 parennumber
1803 style |= $1;
1805 | NOT parennumber
1807 style &=~ $2;
1809 | styleexpr '|' parennumber
1811 style |= $3;
1813 | styleexpr '|' NOT parennumber
1815 style &=~ $4;
1819 parennumber:
1820 NUMBER
1822 $$ = $1.val;
1824 | '(' numexpr ')'
1826 $$ = $2;
1830 /* An optional expression with a leading comma. */
1832 optcnumexpr:
1833 /* empty */
1835 $$ = 0;
1837 | cnumexpr
1839 $$ = $1;
1843 /* An expression with a leading comma. */
1845 cnumexpr:
1846 ',' numexpr
1848 $$ = $2;
1852 /* A possibly negated numeric expression. */
1854 numexpr:
1855 sizednumexpr
1857 $$ = $1.val;
1861 /* A possibly negated expression with a size. */
1863 sizednumexpr:
1864 NUMBER
1866 $$ = $1;
1868 | '(' sizednumexpr ')'
1870 $$ = $2;
1872 | '~' sizednumexpr %prec '~'
1874 $$.val = ~ $2.val;
1875 $$.dword = $2.dword;
1877 | '-' sizednumexpr %prec NEG
1879 $$.val = - $2.val;
1880 $$.dword = $2.dword;
1882 | sizednumexpr '*' sizednumexpr
1884 $$.val = $1.val * $3.val;
1885 $$.dword = $1.dword || $3.dword;
1887 | sizednumexpr '/' sizednumexpr
1889 $$.val = $1.val / $3.val;
1890 $$.dword = $1.dword || $3.dword;
1892 | sizednumexpr '%' sizednumexpr
1894 $$.val = $1.val % $3.val;
1895 $$.dword = $1.dword || $3.dword;
1897 | sizednumexpr '+' sizednumexpr
1899 $$.val = $1.val + $3.val;
1900 $$.dword = $1.dword || $3.dword;
1902 | sizednumexpr '-' sizednumexpr
1904 $$.val = $1.val - $3.val;
1905 $$.dword = $1.dword || $3.dword;
1907 | sizednumexpr '&' sizednumexpr
1909 $$.val = $1.val & $3.val;
1910 $$.dword = $1.dword || $3.dword;
1912 | sizednumexpr '^' sizednumexpr
1914 $$.val = $1.val ^ $3.val;
1915 $$.dword = $1.dword || $3.dword;
1917 | sizednumexpr '|' sizednumexpr
1919 $$.val = $1.val | $3.val;
1920 $$.dword = $1.dword || $3.dword;
1924 /* An expression with a leading comma which does not use unary
1925 negation. */
1927 cposnumexpr:
1928 ',' posnumexpr
1930 $$ = $2;
1934 /* An expression which does not use unary negation. */
1936 posnumexpr:
1937 sizedposnumexpr
1939 $$ = $1.val;
1943 /* An expression which does not use unary negation. We separate unary
1944 negation to avoid parsing conflicts when two numeric expressions
1945 appear consecutively. */
1947 sizedposnumexpr:
1948 NUMBER
1950 $$ = $1;
1952 | '(' sizednumexpr ')'
1954 $$ = $2;
1956 | '~' sizednumexpr %prec '~'
1958 $$.val = ~ $2.val;
1959 $$.dword = $2.dword;
1961 | sizedposnumexpr '*' sizednumexpr
1963 $$.val = $1.val * $3.val;
1964 $$.dword = $1.dword || $3.dword;
1966 | sizedposnumexpr '/' sizednumexpr
1968 $$.val = $1.val / $3.val;
1969 $$.dword = $1.dword || $3.dword;
1971 | sizedposnumexpr '%' sizednumexpr
1973 $$.val = $1.val % $3.val;
1974 $$.dword = $1.dword || $3.dword;
1976 | sizedposnumexpr '+' sizednumexpr
1978 $$.val = $1.val + $3.val;
1979 $$.dword = $1.dword || $3.dword;
1981 | sizedposnumexpr '-' sizednumexpr
1983 $$.val = $1.val - $3.val;
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;
2005 /* Set the language from the command line. */
2007 void
2008 rcparse_set_language (int lang)
2010 language = lang;