175fd0b74Schristos %{ /* rcparse.y -- parser for Windows rc files 2*e992f068Schristos Copyright (C) 1997-2022 Free Software Foundation, Inc. 375fd0b74Schristos Written by Ian Lance Taylor, Cygnus Support. 475fd0b74Schristos Extended by Kai Tietz, Onevision. 575fd0b74Schristos 675fd0b74Schristos This file is part of GNU Binutils. 775fd0b74Schristos 875fd0b74Schristos This program is free software; you can redistribute it and/or modify 975fd0b74Schristos it under the terms of the GNU General Public License as published by 1075fd0b74Schristos the Free Software Foundation; either version 3 of the License, or 1175fd0b74Schristos (at your option) any later version. 1275fd0b74Schristos 1375fd0b74Schristos This program is distributed in the hope that it will be useful, 1475fd0b74Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 1575fd0b74Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1675fd0b74Schristos GNU General Public License for more details. 1775fd0b74Schristos 1875fd0b74Schristos You should have received a copy of the GNU General Public License 1975fd0b74Schristos along with this program; if not, write to the Free Software 2075fd0b74Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 2175fd0b74Schristos 02110-1301, USA. */ 2275fd0b74Schristos 2375fd0b74Schristos 2475fd0b74Schristos /* This is a parser for Windows rc files. It is based on the parser 2575fd0b74Schristos by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */ 2675fd0b74Schristos 2775fd0b74Schristos #include "sysdep.h" 2875fd0b74Schristos #include "bfd.h" 2975fd0b74Schristos #include "bucomm.h" 3075fd0b74Schristos #include "libiberty.h" 3175fd0b74Schristos #include "windres.h" 3275fd0b74Schristos #include "safe-ctype.h" 3375fd0b74Schristos 3475fd0b74Schristos /* The current language. */ 3575fd0b74Schristos 3675fd0b74Schristos static unsigned short language; 3775fd0b74Schristos 3875fd0b74Schristos /* The resource information during a sub statement. */ 3975fd0b74Schristos 4075fd0b74Schristos static rc_res_res_info sub_res_info; 4175fd0b74Schristos 4275fd0b74Schristos /* Dialog information. This is built by the nonterminals styles and 4375fd0b74Schristos controls. */ 4475fd0b74Schristos 4575fd0b74Schristos static rc_dialog dialog; 4675fd0b74Schristos 4775fd0b74Schristos /* This is used when building a style. It is modified by the 4875fd0b74Schristos nonterminal styleexpr. */ 4975fd0b74Schristos 5075fd0b74Schristos static unsigned long style; 5175fd0b74Schristos 5275fd0b74Schristos /* These are used when building a control. They are set before using 5375fd0b74Schristos control_params. */ 5475fd0b74Schristos 5575fd0b74Schristos static rc_uint_type base_style; 5675fd0b74Schristos static rc_uint_type default_style; 5775fd0b74Schristos static rc_res_id class; 5875fd0b74Schristos static rc_res_id res_text_field; 5975fd0b74Schristos static unichar null_unichar; 6075fd0b74Schristos 6175fd0b74Schristos /* This is used for COMBOBOX, LISTBOX and EDITTEXT which 6275fd0b74Schristos do not allow resource 'text' field in control definition. */ 6375fd0b74Schristos static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}}; 6475fd0b74Schristos 6575fd0b74Schristos %} 6675fd0b74Schristos 6775fd0b74Schristos %union 6875fd0b74Schristos { 6975fd0b74Schristos rc_accelerator acc; 7075fd0b74Schristos rc_accelerator *pacc; 7175fd0b74Schristos rc_dialog_control *dialog_control; 7275fd0b74Schristos rc_menuitem *menuitem; 7375fd0b74Schristos struct 7475fd0b74Schristos { 7575fd0b74Schristos rc_rcdata_item *first; 7675fd0b74Schristos rc_rcdata_item *last; 7775fd0b74Schristos } rcdata; 7875fd0b74Schristos rc_rcdata_item *rcdata_item; 7975fd0b74Schristos rc_fixed_versioninfo *fixver; 8075fd0b74Schristos rc_ver_info *verinfo; 8175fd0b74Schristos rc_ver_stringtable *verstringtable; 8275fd0b74Schristos rc_ver_stringinfo *verstring; 8375fd0b74Schristos rc_ver_varinfo *vervar; 8475fd0b74Schristos rc_toolbar_item *toobar_item; 8575fd0b74Schristos rc_res_id id; 8675fd0b74Schristos rc_res_res_info res_info; 8775fd0b74Schristos struct 8875fd0b74Schristos { 8975fd0b74Schristos rc_uint_type on; 9075fd0b74Schristos rc_uint_type off; 9175fd0b74Schristos } memflags; 9275fd0b74Schristos struct 9375fd0b74Schristos { 9475fd0b74Schristos rc_uint_type val; 9575fd0b74Schristos /* Nonzero if this number was explicitly specified as long. */ 9675fd0b74Schristos int dword; 9775fd0b74Schristos } i; 9875fd0b74Schristos rc_uint_type il; 9975fd0b74Schristos rc_uint_type is; 10075fd0b74Schristos const char *s; 10175fd0b74Schristos struct 10275fd0b74Schristos { 10375fd0b74Schristos rc_uint_type length; 10475fd0b74Schristos const char *s; 10575fd0b74Schristos } ss; 10675fd0b74Schristos unichar *uni; 10775fd0b74Schristos struct 10875fd0b74Schristos { 10975fd0b74Schristos rc_uint_type length; 11075fd0b74Schristos const unichar *s; 11175fd0b74Schristos } suni; 11275fd0b74Schristos }; 11375fd0b74Schristos 11475fd0b74Schristos %token BEG END 11575fd0b74Schristos %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT 11675fd0b74Schristos %token BITMAP 11775fd0b74Schristos %token CURSOR 11875fd0b74Schristos %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE 11975fd0b74Schristos %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT 12075fd0b74Schristos %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON 12175fd0b74Schristos %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON 12275fd0b74Schristos %token BEDIT HEDIT IEDIT 12375fd0b74Schristos %token FONT 12475fd0b74Schristos %token ICON 12575fd0b74Schristos %token ANICURSOR ANIICON DLGINCLUDE DLGINIT FONTDIR HTML MANIFEST PLUGPLAY VXD TOOLBAR BUTTON 12675fd0b74Schristos %token LANGUAGE CHARACTERISTICS VERSIONK 127*e992f068Schristos %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE OWNERDRAW 12875fd0b74Schristos %token MENUBARBREAK MENUBREAK 12975fd0b74Schristos %token MESSAGETABLE 13075fd0b74Schristos %token RCDATA 13175fd0b74Schristos %token STRINGTABLE 13275fd0b74Schristos %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS 13375fd0b74Schristos %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO 13475fd0b74Schristos %token VALUE 13575fd0b74Schristos %token <s> BLOCK 13675fd0b74Schristos %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE 13775fd0b74Schristos %token NOT 13875fd0b74Schristos %token <uni> QUOTEDUNISTRING 13975fd0b74Schristos %token <s> QUOTEDSTRING STRING 14075fd0b74Schristos %token <i> NUMBER 14175fd0b74Schristos %token <suni> SIZEDUNISTRING 14275fd0b74Schristos %token <ss> SIZEDSTRING 14375fd0b74Schristos %token IGNORED_TOKEN 14475fd0b74Schristos 14575fd0b74Schristos %type <pacc> acc_entries 14675fd0b74Schristos %type <acc> acc_entry acc_event 14775fd0b74Schristos %type <dialog_control> control control_params 14875fd0b74Schristos %type <menuitem> menuitems menuitem menuexitems menuexitem 14975fd0b74Schristos %type <rcdata> optrcdata_data optrcdata_data_int rcdata_data 15075fd0b74Schristos %type <rcdata_item> opt_control_data 15175fd0b74Schristos %type <fixver> fixedverinfo 15275fd0b74Schristos %type <verinfo> verblocks 15375fd0b74Schristos %type <verstringtable> verstringtables 15475fd0b74Schristos %type <verstring> vervals 15575fd0b74Schristos %type <vervar> vertrans 15675fd0b74Schristos %type <toobar_item> toolbar_data 15775fd0b74Schristos %type <res_info> suboptions memflags_move_discard memflags_move 15875fd0b74Schristos %type <memflags> memflag 15975fd0b74Schristos %type <id> id rcdata_id optresidc resref resid cresid 16075fd0b74Schristos %type <il> exstyle parennumber 16175fd0b74Schristos %type <il> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr 16275fd0b74Schristos %type <is> acc_options acc_option menuitem_flags menuitem_flag 16375fd0b74Schristos %type <s> file_name 16475fd0b74Schristos %type <uni> res_unicode_string resname res_unicode_string_concat 16575fd0b74Schristos %type <ss> sizedstring 16675fd0b74Schristos %type <suni> sizedunistring res_unicode_sizedstring res_unicode_sizedstring_concat 16775fd0b74Schristos %type <i> sizednumexpr sizedposnumexpr 16875fd0b74Schristos 16975fd0b74Schristos %left '|' 17075fd0b74Schristos %left '^' 17175fd0b74Schristos %left '&' 17275fd0b74Schristos %left '+' '-' 17375fd0b74Schristos %left '*' '/' '%' 17475fd0b74Schristos %right '~' NEG 17575fd0b74Schristos 17675fd0b74Schristos %% 17775fd0b74Schristos 17875fd0b74Schristos input: 17975fd0b74Schristos /* empty */ 18075fd0b74Schristos | input accelerator 18175fd0b74Schristos | input bitmap 18275fd0b74Schristos | input cursor 18375fd0b74Schristos | input dialog 18475fd0b74Schristos | input font 18575fd0b74Schristos | input icon 18675fd0b74Schristos | input language 18775fd0b74Schristos | input menu 18875fd0b74Schristos | input menuex 18975fd0b74Schristos | input messagetable 19075fd0b74Schristos | input stringtable 19175fd0b74Schristos | input toolbar 19275fd0b74Schristos | input user 19375fd0b74Schristos | input versioninfo 19475fd0b74Schristos | input IGNORED_TOKEN 19575fd0b74Schristos ; 19675fd0b74Schristos 19775fd0b74Schristos /* Accelerator resources. */ 19875fd0b74Schristos 19975fd0b74Schristos accelerator: 20075fd0b74Schristos id ACCELERATORS suboptions BEG acc_entries END 20175fd0b74Schristos { 20275fd0b74Schristos define_accelerator ($1, &$3, $5); 20375fd0b74Schristos if (yychar != YYEMPTY) 20475fd0b74Schristos YYERROR; 20575fd0b74Schristos rcparse_discard_strings (); 20675fd0b74Schristos } 20775fd0b74Schristos ; 20875fd0b74Schristos 20975fd0b74Schristos acc_entries: 21075fd0b74Schristos /* empty */ 21175fd0b74Schristos { 21275fd0b74Schristos $$ = NULL; 21375fd0b74Schristos } 21475fd0b74Schristos | acc_entries acc_entry 21575fd0b74Schristos { 21675fd0b74Schristos rc_accelerator *a; 21775fd0b74Schristos 21875fd0b74Schristos a = (rc_accelerator *) res_alloc (sizeof *a); 21975fd0b74Schristos *a = $2; 22075fd0b74Schristos if ($1 == NULL) 22175fd0b74Schristos $$ = a; 22275fd0b74Schristos else 22375fd0b74Schristos { 22475fd0b74Schristos rc_accelerator **pp; 22575fd0b74Schristos 22675fd0b74Schristos for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) 22775fd0b74Schristos ; 22875fd0b74Schristos *pp = a; 22975fd0b74Schristos $$ = $1; 23075fd0b74Schristos } 23175fd0b74Schristos } 23275fd0b74Schristos ; 23375fd0b74Schristos 23475fd0b74Schristos acc_entry: 23575fd0b74Schristos acc_event cposnumexpr 23675fd0b74Schristos { 23775fd0b74Schristos $$ = $1; 23875fd0b74Schristos $$.id = $2; 23975fd0b74Schristos } 24075fd0b74Schristos | acc_event cposnumexpr ',' acc_options 24175fd0b74Schristos { 24275fd0b74Schristos $$ = $1; 24375fd0b74Schristos $$.id = $2; 24475fd0b74Schristos $$.flags |= $4; 24575fd0b74Schristos if (($$.flags & ACC_VIRTKEY) == 0 24675fd0b74Schristos && ($$.flags & (ACC_SHIFT | ACC_CONTROL)) != 0) 24775fd0b74Schristos rcparse_warning (_("inappropriate modifiers for non-VIRTKEY")); 24875fd0b74Schristos } 24975fd0b74Schristos ; 25075fd0b74Schristos 25175fd0b74Schristos acc_event: 25275fd0b74Schristos QUOTEDSTRING 25375fd0b74Schristos { 25475fd0b74Schristos const char *s = $1; 25575fd0b74Schristos char ch; 25675fd0b74Schristos 25775fd0b74Schristos $$.next = NULL; 25875fd0b74Schristos $$.id = 0; 25975fd0b74Schristos ch = *s; 26075fd0b74Schristos if (ch != '^') 26175fd0b74Schristos $$.flags = 0; 26275fd0b74Schristos else 26375fd0b74Schristos { 26475fd0b74Schristos $$.flags = ACC_CONTROL | ACC_VIRTKEY; 26575fd0b74Schristos ++s; 26675fd0b74Schristos ch = TOUPPER (s[0]); 26775fd0b74Schristos } 26875fd0b74Schristos $$.key = ch; 26975fd0b74Schristos if (s[1] != '\0') 27075fd0b74Schristos rcparse_warning (_("accelerator should only be one character")); 27175fd0b74Schristos } 27275fd0b74Schristos | posnumexpr 27375fd0b74Schristos { 27475fd0b74Schristos $$.next = NULL; 27575fd0b74Schristos $$.flags = 0; 27675fd0b74Schristos $$.id = 0; 27775fd0b74Schristos $$.key = $1; 27875fd0b74Schristos } 27975fd0b74Schristos ; 28075fd0b74Schristos 28175fd0b74Schristos acc_options: 28275fd0b74Schristos acc_option 28375fd0b74Schristos { 28475fd0b74Schristos $$ = $1; 28575fd0b74Schristos } 28675fd0b74Schristos | acc_options ',' acc_option 28775fd0b74Schristos { 28875fd0b74Schristos $$ = $1 | $3; 28975fd0b74Schristos } 29075fd0b74Schristos /* I've had one report that the comma is optional. */ 29175fd0b74Schristos | acc_options acc_option 29275fd0b74Schristos { 29375fd0b74Schristos $$ = $1 | $2; 29475fd0b74Schristos } 29575fd0b74Schristos ; 29675fd0b74Schristos 29775fd0b74Schristos acc_option: 29875fd0b74Schristos VIRTKEY 29975fd0b74Schristos { 30075fd0b74Schristos $$ = ACC_VIRTKEY; 30175fd0b74Schristos } 30275fd0b74Schristos | ASCII 30375fd0b74Schristos { 30475fd0b74Schristos /* This is just the absence of VIRTKEY. */ 30575fd0b74Schristos $$ = 0; 30675fd0b74Schristos } 30775fd0b74Schristos | NOINVERT 30875fd0b74Schristos { 30975fd0b74Schristos $$ = ACC_NOINVERT; 31075fd0b74Schristos } 31175fd0b74Schristos | SHIFT 31275fd0b74Schristos { 31375fd0b74Schristos $$ = ACC_SHIFT; 31475fd0b74Schristos } 31575fd0b74Schristos | CONTROL 31675fd0b74Schristos { 31775fd0b74Schristos $$ = ACC_CONTROL; 31875fd0b74Schristos } 31975fd0b74Schristos | ALT 32075fd0b74Schristos { 32175fd0b74Schristos $$ = ACC_ALT; 32275fd0b74Schristos } 32375fd0b74Schristos ; 32475fd0b74Schristos 32575fd0b74Schristos /* Bitmap resources. */ 32675fd0b74Schristos 32775fd0b74Schristos bitmap: 32875fd0b74Schristos id BITMAP memflags_move file_name 32975fd0b74Schristos { 33075fd0b74Schristos define_bitmap ($1, &$3, $4); 33175fd0b74Schristos if (yychar != YYEMPTY) 33275fd0b74Schristos YYERROR; 33375fd0b74Schristos rcparse_discard_strings (); 33475fd0b74Schristos } 33575fd0b74Schristos ; 33675fd0b74Schristos 33775fd0b74Schristos /* Cursor resources. */ 33875fd0b74Schristos 33975fd0b74Schristos cursor: 34075fd0b74Schristos id CURSOR memflags_move_discard file_name 34175fd0b74Schristos { 34275fd0b74Schristos define_cursor ($1, &$3, $4); 34375fd0b74Schristos if (yychar != YYEMPTY) 34475fd0b74Schristos YYERROR; 34575fd0b74Schristos rcparse_discard_strings (); 34675fd0b74Schristos } 34775fd0b74Schristos ; 34875fd0b74Schristos 34975fd0b74Schristos /* Dialog resources. */ 35075fd0b74Schristos 35175fd0b74Schristos dialog: 35275fd0b74Schristos id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr 35375fd0b74Schristos cnumexpr 35475fd0b74Schristos { 35575fd0b74Schristos memset (&dialog, 0, sizeof dialog); 35675fd0b74Schristos dialog.x = $5; 35775fd0b74Schristos dialog.y = $6; 35875fd0b74Schristos dialog.width = $7; 35975fd0b74Schristos dialog.height = $8; 36075fd0b74Schristos dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; 36175fd0b74Schristos dialog.exstyle = $4; 36275fd0b74Schristos dialog.menu.named = 1; 36375fd0b74Schristos dialog.class.named = 1; 36475fd0b74Schristos dialog.font = NULL; 36575fd0b74Schristos dialog.ex = NULL; 36675fd0b74Schristos dialog.controls = NULL; 36775fd0b74Schristos sub_res_info = $3; 36875fd0b74Schristos style = 0; 36975fd0b74Schristos } 37075fd0b74Schristos styles BEG controls END 37175fd0b74Schristos { 37275fd0b74Schristos define_dialog ($1, &sub_res_info, &dialog); 37375fd0b74Schristos if (yychar != YYEMPTY) 37475fd0b74Schristos YYERROR; 37575fd0b74Schristos rcparse_discard_strings (); 37675fd0b74Schristos } 37775fd0b74Schristos | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr 37875fd0b74Schristos cnumexpr 37975fd0b74Schristos { 38075fd0b74Schristos memset (&dialog, 0, sizeof dialog); 38175fd0b74Schristos dialog.x = $5; 38275fd0b74Schristos dialog.y = $6; 38375fd0b74Schristos dialog.width = $7; 38475fd0b74Schristos dialog.height = $8; 38575fd0b74Schristos dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; 38675fd0b74Schristos dialog.exstyle = $4; 38775fd0b74Schristos dialog.menu.named = 1; 38875fd0b74Schristos dialog.class.named = 1; 38975fd0b74Schristos dialog.font = NULL; 39075fd0b74Schristos dialog.ex = ((rc_dialog_ex *) 39175fd0b74Schristos res_alloc (sizeof (rc_dialog_ex))); 39275fd0b74Schristos memset (dialog.ex, 0, sizeof (rc_dialog_ex)); 39375fd0b74Schristos dialog.controls = NULL; 39475fd0b74Schristos sub_res_info = $3; 39575fd0b74Schristos style = 0; 39675fd0b74Schristos } 39775fd0b74Schristos styles BEG controls END 39875fd0b74Schristos { 39975fd0b74Schristos define_dialog ($1, &sub_res_info, &dialog); 40075fd0b74Schristos if (yychar != YYEMPTY) 40175fd0b74Schristos YYERROR; 40275fd0b74Schristos rcparse_discard_strings (); 40375fd0b74Schristos } 40475fd0b74Schristos | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr 40575fd0b74Schristos cnumexpr cnumexpr 40675fd0b74Schristos { 40775fd0b74Schristos memset (&dialog, 0, sizeof dialog); 40875fd0b74Schristos dialog.x = $5; 40975fd0b74Schristos dialog.y = $6; 41075fd0b74Schristos dialog.width = $7; 41175fd0b74Schristos dialog.height = $8; 41275fd0b74Schristos dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; 41375fd0b74Schristos dialog.exstyle = $4; 41475fd0b74Schristos dialog.menu.named = 1; 41575fd0b74Schristos dialog.class.named = 1; 41675fd0b74Schristos dialog.font = NULL; 41775fd0b74Schristos dialog.ex = ((rc_dialog_ex *) 41875fd0b74Schristos res_alloc (sizeof (rc_dialog_ex))); 41975fd0b74Schristos memset (dialog.ex, 0, sizeof (rc_dialog_ex)); 42075fd0b74Schristos dialog.ex->help = $9; 42175fd0b74Schristos dialog.controls = NULL; 42275fd0b74Schristos sub_res_info = $3; 42375fd0b74Schristos style = 0; 42475fd0b74Schristos } 42575fd0b74Schristos styles BEG controls END 42675fd0b74Schristos { 42775fd0b74Schristos define_dialog ($1, &sub_res_info, &dialog); 42875fd0b74Schristos if (yychar != YYEMPTY) 42975fd0b74Schristos YYERROR; 43075fd0b74Schristos rcparse_discard_strings (); 43175fd0b74Schristos } 43275fd0b74Schristos ; 43375fd0b74Schristos 43475fd0b74Schristos exstyle: 43575fd0b74Schristos /* empty */ 43675fd0b74Schristos { 43775fd0b74Schristos $$ = 0; 43875fd0b74Schristos } 43975fd0b74Schristos | EXSTYLE '=' numexpr 44075fd0b74Schristos { 44175fd0b74Schristos $$ = $3; 44275fd0b74Schristos } 44375fd0b74Schristos ; 44475fd0b74Schristos 44575fd0b74Schristos styles: 44675fd0b74Schristos /* empty */ 44775fd0b74Schristos | styles CAPTION res_unicode_string_concat 44875fd0b74Schristos { 44975fd0b74Schristos dialog.style |= WS_CAPTION; 45075fd0b74Schristos style |= WS_CAPTION; 45175fd0b74Schristos dialog.caption = $3; 45275fd0b74Schristos } 45375fd0b74Schristos | styles CLASS id 45475fd0b74Schristos { 45575fd0b74Schristos dialog.class = $3; 45675fd0b74Schristos } 45775fd0b74Schristos | styles STYLE 45875fd0b74Schristos styleexpr 45975fd0b74Schristos { 46075fd0b74Schristos dialog.style = style; 46175fd0b74Schristos } 46275fd0b74Schristos | styles EXSTYLE numexpr 46375fd0b74Schristos { 46475fd0b74Schristos dialog.exstyle = $3; 46575fd0b74Schristos } 46675fd0b74Schristos | styles CLASS res_unicode_string_concat 46775fd0b74Schristos { 46875fd0b74Schristos res_unistring_to_id (& dialog.class, $3); 46975fd0b74Schristos } 47075fd0b74Schristos | styles FONT numexpr ',' res_unicode_string_concat 47175fd0b74Schristos { 47275fd0b74Schristos dialog.style |= DS_SETFONT; 47375fd0b74Schristos style |= DS_SETFONT; 47475fd0b74Schristos dialog.pointsize = $3; 47575fd0b74Schristos dialog.font = $5; 47675fd0b74Schristos if (dialog.ex != NULL) 47775fd0b74Schristos { 47875fd0b74Schristos dialog.ex->weight = 0; 47975fd0b74Schristos dialog.ex->italic = 0; 48075fd0b74Schristos dialog.ex->charset = 1; 48175fd0b74Schristos } 48275fd0b74Schristos } 48375fd0b74Schristos | styles FONT numexpr ',' res_unicode_string_concat cnumexpr 48475fd0b74Schristos { 48575fd0b74Schristos dialog.style |= DS_SETFONT; 48675fd0b74Schristos style |= DS_SETFONT; 48775fd0b74Schristos dialog.pointsize = $3; 48875fd0b74Schristos dialog.font = $5; 48975fd0b74Schristos if (dialog.ex == NULL) 49075fd0b74Schristos rcparse_warning (_("extended FONT requires DIALOGEX")); 49175fd0b74Schristos else 49275fd0b74Schristos { 49375fd0b74Schristos dialog.ex->weight = $6; 49475fd0b74Schristos dialog.ex->italic = 0; 49575fd0b74Schristos dialog.ex->charset = 1; 49675fd0b74Schristos } 49775fd0b74Schristos } 49875fd0b74Schristos | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr 49975fd0b74Schristos { 50075fd0b74Schristos dialog.style |= DS_SETFONT; 50175fd0b74Schristos style |= DS_SETFONT; 50275fd0b74Schristos dialog.pointsize = $3; 50375fd0b74Schristos dialog.font = $5; 50475fd0b74Schristos if (dialog.ex == NULL) 50575fd0b74Schristos rcparse_warning (_("extended FONT requires DIALOGEX")); 50675fd0b74Schristos else 50775fd0b74Schristos { 50875fd0b74Schristos dialog.ex->weight = $6; 50975fd0b74Schristos dialog.ex->italic = $7; 51075fd0b74Schristos dialog.ex->charset = 1; 51175fd0b74Schristos } 51275fd0b74Schristos } 51375fd0b74Schristos | styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr cnumexpr 51475fd0b74Schristos { 51575fd0b74Schristos dialog.style |= DS_SETFONT; 51675fd0b74Schristos style |= DS_SETFONT; 51775fd0b74Schristos dialog.pointsize = $3; 51875fd0b74Schristos dialog.font = $5; 51975fd0b74Schristos if (dialog.ex == NULL) 52075fd0b74Schristos rcparse_warning (_("extended FONT requires DIALOGEX")); 52175fd0b74Schristos else 52275fd0b74Schristos { 52375fd0b74Schristos dialog.ex->weight = $6; 52475fd0b74Schristos dialog.ex->italic = $7; 52575fd0b74Schristos dialog.ex->charset = $8; 52675fd0b74Schristos } 52775fd0b74Schristos } 52875fd0b74Schristos | styles MENU id 52975fd0b74Schristos { 53075fd0b74Schristos dialog.menu = $3; 53175fd0b74Schristos } 53275fd0b74Schristos | styles CHARACTERISTICS numexpr 53375fd0b74Schristos { 53475fd0b74Schristos sub_res_info.characteristics = $3; 53575fd0b74Schristos } 53675fd0b74Schristos | styles LANGUAGE numexpr cnumexpr 53775fd0b74Schristos { 53875fd0b74Schristos sub_res_info.language = $3 | ($4 << SUBLANG_SHIFT); 53975fd0b74Schristos } 54075fd0b74Schristos | styles VERSIONK numexpr 54175fd0b74Schristos { 54275fd0b74Schristos sub_res_info.version = $3; 54375fd0b74Schristos } 54475fd0b74Schristos ; 54575fd0b74Schristos 54675fd0b74Schristos controls: 54775fd0b74Schristos /* empty */ 54875fd0b74Schristos | controls control 54975fd0b74Schristos { 55075fd0b74Schristos rc_dialog_control **pp; 55175fd0b74Schristos 55275fd0b74Schristos for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next) 55375fd0b74Schristos ; 55475fd0b74Schristos *pp = $2; 55575fd0b74Schristos } 55675fd0b74Schristos ; 55775fd0b74Schristos 55875fd0b74Schristos control: 55975fd0b74Schristos AUTO3STATE optresidc 56075fd0b74Schristos { 56175fd0b74Schristos default_style = BS_AUTO3STATE | WS_TABSTOP; 56275fd0b74Schristos base_style = BS_AUTO3STATE; 56375fd0b74Schristos class.named = 0; 56475fd0b74Schristos class.u.id = CTL_BUTTON; 56575fd0b74Schristos res_text_field = $2; 56675fd0b74Schristos } 56775fd0b74Schristos control_params 56875fd0b74Schristos { 56975fd0b74Schristos $$ = $4; 57075fd0b74Schristos } 57175fd0b74Schristos | AUTOCHECKBOX optresidc 57275fd0b74Schristos { 57375fd0b74Schristos default_style = BS_AUTOCHECKBOX | WS_TABSTOP; 574*e992f068Schristos base_style = BS_AUTOCHECKBOX | WS_TABSTOP; 57575fd0b74Schristos class.named = 0; 57675fd0b74Schristos class.u.id = CTL_BUTTON; 57775fd0b74Schristos res_text_field = $2; 57875fd0b74Schristos } 57975fd0b74Schristos control_params 58075fd0b74Schristos { 58175fd0b74Schristos $$ = $4; 58275fd0b74Schristos } 58375fd0b74Schristos | AUTORADIOBUTTON optresidc 58475fd0b74Schristos { 58575fd0b74Schristos default_style = BS_AUTORADIOBUTTON | WS_TABSTOP; 58675fd0b74Schristos base_style = BS_AUTORADIOBUTTON; 58775fd0b74Schristos class.named = 0; 58875fd0b74Schristos class.u.id = CTL_BUTTON; 58975fd0b74Schristos res_text_field = $2; 59075fd0b74Schristos } 59175fd0b74Schristos control_params 59275fd0b74Schristos { 59375fd0b74Schristos $$ = $4; 59475fd0b74Schristos } 59575fd0b74Schristos | BEDIT optresidc 59675fd0b74Schristos { 59775fd0b74Schristos default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 59875fd0b74Schristos base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 59975fd0b74Schristos class.named = 0; 60075fd0b74Schristos class.u.id = CTL_EDIT; 60175fd0b74Schristos res_text_field = $2; 60275fd0b74Schristos } 60375fd0b74Schristos control_params 60475fd0b74Schristos { 60575fd0b74Schristos $$ = $4; 60675fd0b74Schristos if (dialog.ex == NULL) 60775fd0b74Schristos rcparse_warning (_("BEDIT requires DIALOGEX")); 60875fd0b74Schristos res_string_to_id (&$$->class, "BEDIT"); 60975fd0b74Schristos } 61075fd0b74Schristos | CHECKBOX optresidc 61175fd0b74Schristos { 61275fd0b74Schristos default_style = BS_CHECKBOX | WS_TABSTOP; 61375fd0b74Schristos base_style = BS_CHECKBOX | WS_TABSTOP; 61475fd0b74Schristos class.named = 0; 61575fd0b74Schristos class.u.id = CTL_BUTTON; 61675fd0b74Schristos res_text_field = $2; 61775fd0b74Schristos } 61875fd0b74Schristos control_params 61975fd0b74Schristos { 62075fd0b74Schristos $$ = $4; 62175fd0b74Schristos } 62275fd0b74Schristos | COMBOBOX 62375fd0b74Schristos { 62475fd0b74Schristos /* This is as per MSDN documentation. With some (???) 62575fd0b74Schristos versions of MS rc.exe their is no default style. */ 62675fd0b74Schristos default_style = CBS_SIMPLE | WS_TABSTOP; 62775fd0b74Schristos base_style = 0; 62875fd0b74Schristos class.named = 0; 62975fd0b74Schristos class.u.id = CTL_COMBOBOX; 63075fd0b74Schristos res_text_field = res_null_text; 63175fd0b74Schristos } 63275fd0b74Schristos control_params 63375fd0b74Schristos { 63475fd0b74Schristos $$ = $3; 63575fd0b74Schristos } 63675fd0b74Schristos | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr 63775fd0b74Schristos cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data 63875fd0b74Schristos { 63975fd0b74Schristos $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10); 64075fd0b74Schristos if ($11 != NULL) 64175fd0b74Schristos { 64275fd0b74Schristos if (dialog.ex == NULL) 64375fd0b74Schristos rcparse_warning (_("control data requires DIALOGEX")); 64475fd0b74Schristos $$->data = $11; 64575fd0b74Schristos } 64675fd0b74Schristos } 64775fd0b74Schristos | CONTROL optresidc numexpr cresid control_styleexpr cnumexpr 64875fd0b74Schristos cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data 64975fd0b74Schristos { 65075fd0b74Schristos $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10); 65175fd0b74Schristos if (dialog.ex == NULL) 65275fd0b74Schristos rcparse_warning (_("help ID requires DIALOGEX")); 65375fd0b74Schristos $$->help = $11; 65475fd0b74Schristos $$->data = $12; 65575fd0b74Schristos } 65675fd0b74Schristos | CTEXT optresidc 65775fd0b74Schristos { 65875fd0b74Schristos default_style = SS_CENTER | WS_GROUP; 65975fd0b74Schristos base_style = SS_CENTER; 66075fd0b74Schristos class.named = 0; 66175fd0b74Schristos class.u.id = CTL_STATIC; 66275fd0b74Schristos res_text_field = $2; 66375fd0b74Schristos } 66475fd0b74Schristos control_params 66575fd0b74Schristos { 66675fd0b74Schristos $$ = $4; 66775fd0b74Schristos } 66875fd0b74Schristos | DEFPUSHBUTTON optresidc 66975fd0b74Schristos { 67075fd0b74Schristos default_style = BS_DEFPUSHBUTTON | WS_TABSTOP; 67175fd0b74Schristos base_style = BS_DEFPUSHBUTTON | WS_TABSTOP; 67275fd0b74Schristos class.named = 0; 67375fd0b74Schristos class.u.id = CTL_BUTTON; 67475fd0b74Schristos res_text_field = $2; 67575fd0b74Schristos } 67675fd0b74Schristos control_params 67775fd0b74Schristos { 67875fd0b74Schristos $$ = $4; 67975fd0b74Schristos } 68075fd0b74Schristos | EDITTEXT 68175fd0b74Schristos { 68275fd0b74Schristos default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 68375fd0b74Schristos base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 68475fd0b74Schristos class.named = 0; 68575fd0b74Schristos class.u.id = CTL_EDIT; 68675fd0b74Schristos res_text_field = res_null_text; 68775fd0b74Schristos } 68875fd0b74Schristos control_params 68975fd0b74Schristos { 69075fd0b74Schristos $$ = $3; 69175fd0b74Schristos } 69275fd0b74Schristos | GROUPBOX optresidc 69375fd0b74Schristos { 69475fd0b74Schristos default_style = BS_GROUPBOX; 69575fd0b74Schristos base_style = BS_GROUPBOX; 69675fd0b74Schristos class.named = 0; 69775fd0b74Schristos class.u.id = CTL_BUTTON; 69875fd0b74Schristos res_text_field = $2; 69975fd0b74Schristos } 70075fd0b74Schristos control_params 70175fd0b74Schristos { 70275fd0b74Schristos $$ = $4; 70375fd0b74Schristos } 70475fd0b74Schristos | HEDIT optresidc 70575fd0b74Schristos { 70675fd0b74Schristos default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 70775fd0b74Schristos base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 70875fd0b74Schristos class.named = 0; 70975fd0b74Schristos class.u.id = CTL_EDIT; 71075fd0b74Schristos res_text_field = $2; 71175fd0b74Schristos } 71275fd0b74Schristos control_params 71375fd0b74Schristos { 71475fd0b74Schristos $$ = $4; 71575fd0b74Schristos if (dialog.ex == NULL) 71675fd0b74Schristos rcparse_warning (_("IEDIT requires DIALOGEX")); 71775fd0b74Schristos res_string_to_id (&$$->class, "HEDIT"); 71875fd0b74Schristos } 71975fd0b74Schristos | ICON resref numexpr cnumexpr cnumexpr opt_control_data 72075fd0b74Schristos { 72175fd0b74Schristos $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $6, 72275fd0b74Schristos dialog.ex); 72375fd0b74Schristos } 72475fd0b74Schristos | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr 72575fd0b74Schristos opt_control_data 72675fd0b74Schristos { 72775fd0b74Schristos $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $8, 72875fd0b74Schristos dialog.ex); 72975fd0b74Schristos } 73075fd0b74Schristos | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr 73175fd0b74Schristos icon_styleexpr optcnumexpr opt_control_data 73275fd0b74Schristos { 73375fd0b74Schristos $$ = define_icon_control ($2, $3, $4, $5, style, $9, 0, $10, 73475fd0b74Schristos dialog.ex); 73575fd0b74Schristos } 73675fd0b74Schristos | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr 73775fd0b74Schristos icon_styleexpr cnumexpr cnumexpr opt_control_data 73875fd0b74Schristos { 73975fd0b74Schristos $$ = define_icon_control ($2, $3, $4, $5, style, $9, $10, $11, 74075fd0b74Schristos dialog.ex); 74175fd0b74Schristos } 74275fd0b74Schristos | IEDIT optresidc 74375fd0b74Schristos { 74475fd0b74Schristos default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 74575fd0b74Schristos base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; 74675fd0b74Schristos class.named = 0; 74775fd0b74Schristos class.u.id = CTL_EDIT; 74875fd0b74Schristos res_text_field = $2; 74975fd0b74Schristos } 75075fd0b74Schristos control_params 75175fd0b74Schristos { 75275fd0b74Schristos $$ = $4; 75375fd0b74Schristos if (dialog.ex == NULL) 75475fd0b74Schristos rcparse_warning (_("IEDIT requires DIALOGEX")); 75575fd0b74Schristos res_string_to_id (&$$->class, "IEDIT"); 75675fd0b74Schristos } 75775fd0b74Schristos | LISTBOX 75875fd0b74Schristos { 75975fd0b74Schristos default_style = LBS_NOTIFY | WS_BORDER; 76075fd0b74Schristos base_style = LBS_NOTIFY | WS_BORDER; 76175fd0b74Schristos class.named = 0; 76275fd0b74Schristos class.u.id = CTL_LISTBOX; 76375fd0b74Schristos res_text_field = res_null_text; 76475fd0b74Schristos } 76575fd0b74Schristos control_params 76675fd0b74Schristos { 76775fd0b74Schristos $$ = $3; 76875fd0b74Schristos } 76975fd0b74Schristos | LTEXT optresidc 77075fd0b74Schristos { 77175fd0b74Schristos default_style = SS_LEFT | WS_GROUP; 77275fd0b74Schristos base_style = SS_LEFT; 77375fd0b74Schristos class.named = 0; 77475fd0b74Schristos class.u.id = CTL_STATIC; 77575fd0b74Schristos res_text_field = $2; 77675fd0b74Schristos } 77775fd0b74Schristos control_params 77875fd0b74Schristos { 77975fd0b74Schristos $$ = $4; 78075fd0b74Schristos } 78175fd0b74Schristos | PUSHBOX optresidc 78275fd0b74Schristos { 78375fd0b74Schristos default_style = BS_PUSHBOX | WS_TABSTOP; 78475fd0b74Schristos base_style = BS_PUSHBOX; 78575fd0b74Schristos class.named = 0; 78675fd0b74Schristos class.u.id = CTL_BUTTON; 78775fd0b74Schristos } 78875fd0b74Schristos control_params 78975fd0b74Schristos { 79075fd0b74Schristos $$ = $4; 79175fd0b74Schristos } 79275fd0b74Schristos | PUSHBUTTON optresidc 79375fd0b74Schristos { 79475fd0b74Schristos default_style = BS_PUSHBUTTON | WS_TABSTOP; 79575fd0b74Schristos base_style = BS_PUSHBUTTON | WS_TABSTOP; 79675fd0b74Schristos class.named = 0; 79775fd0b74Schristos class.u.id = CTL_BUTTON; 79875fd0b74Schristos res_text_field = $2; 79975fd0b74Schristos } 80075fd0b74Schristos control_params 80175fd0b74Schristos { 80275fd0b74Schristos $$ = $4; 80375fd0b74Schristos } 80475fd0b74Schristos | RADIOBUTTON optresidc 80575fd0b74Schristos { 80675fd0b74Schristos default_style = BS_RADIOBUTTON | WS_TABSTOP; 80775fd0b74Schristos base_style = BS_RADIOBUTTON; 80875fd0b74Schristos class.named = 0; 80975fd0b74Schristos class.u.id = CTL_BUTTON; 81075fd0b74Schristos res_text_field = $2; 81175fd0b74Schristos } 81275fd0b74Schristos control_params 81375fd0b74Schristos { 81475fd0b74Schristos $$ = $4; 81575fd0b74Schristos } 81675fd0b74Schristos | RTEXT optresidc 81775fd0b74Schristos { 81875fd0b74Schristos default_style = SS_RIGHT | WS_GROUP; 81975fd0b74Schristos base_style = SS_RIGHT; 82075fd0b74Schristos class.named = 0; 82175fd0b74Schristos class.u.id = CTL_STATIC; 82275fd0b74Schristos res_text_field = $2; 82375fd0b74Schristos } 82475fd0b74Schristos control_params 82575fd0b74Schristos { 82675fd0b74Schristos $$ = $4; 82775fd0b74Schristos } 82875fd0b74Schristos | SCROLLBAR 82975fd0b74Schristos { 83075fd0b74Schristos default_style = SBS_HORZ; 83175fd0b74Schristos base_style = 0; 83275fd0b74Schristos class.named = 0; 83375fd0b74Schristos class.u.id = CTL_SCROLLBAR; 83475fd0b74Schristos res_text_field = res_null_text; 83575fd0b74Schristos } 83675fd0b74Schristos control_params 83775fd0b74Schristos { 83875fd0b74Schristos $$ = $3; 83975fd0b74Schristos } 84075fd0b74Schristos | STATE3 optresidc 84175fd0b74Schristos { 84275fd0b74Schristos default_style = BS_3STATE | WS_TABSTOP; 84375fd0b74Schristos base_style = BS_3STATE; 84475fd0b74Schristos class.named = 0; 84575fd0b74Schristos class.u.id = CTL_BUTTON; 84675fd0b74Schristos res_text_field = $2; 84775fd0b74Schristos } 84875fd0b74Schristos control_params 84975fd0b74Schristos { 85075fd0b74Schristos $$ = $4; 85175fd0b74Schristos } 85275fd0b74Schristos | USERBUTTON resref numexpr ',' numexpr ',' numexpr ',' 85375fd0b74Schristos numexpr ',' numexpr ',' 85475fd0b74Schristos { style = WS_CHILD | WS_VISIBLE; } 85575fd0b74Schristos styleexpr optcnumexpr 85675fd0b74Schristos { 85775fd0b74Schristos rc_res_id cid; 85875fd0b74Schristos cid.named = 0; 85975fd0b74Schristos cid.u.id = CTL_BUTTON; 86075fd0b74Schristos $$ = define_control ($2, $3, $5, $7, $9, $11, cid, 86175fd0b74Schristos style, $15); 86275fd0b74Schristos } 86375fd0b74Schristos ; 86475fd0b74Schristos 86575fd0b74Schristos /* Parameters for a control. The static variables DEFAULT_STYLE, 86675fd0b74Schristos BASE_STYLE, and CLASS must be initialized before this nonterminal 86775fd0b74Schristos is used. DEFAULT_STYLE is the style to use if no style expression 86875fd0b74Schristos is specified. BASE_STYLE is the base style to use if a style 86975fd0b74Schristos expression is specified; the style expression modifies the base 87075fd0b74Schristos style. CLASS is the class of the control. */ 87175fd0b74Schristos 87275fd0b74Schristos control_params: 87375fd0b74Schristos numexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data 87475fd0b74Schristos { 87575fd0b74Schristos $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, 87675fd0b74Schristos default_style | WS_CHILD | WS_VISIBLE, 0); 87775fd0b74Schristos if ($6 != NULL) 87875fd0b74Schristos { 87975fd0b74Schristos if (dialog.ex == NULL) 88075fd0b74Schristos rcparse_warning (_("control data requires DIALOGEX")); 88175fd0b74Schristos $$->data = $6; 88275fd0b74Schristos } 88375fd0b74Schristos } 88475fd0b74Schristos | numexpr cnumexpr cnumexpr cnumexpr cnumexpr 88575fd0b74Schristos control_params_styleexpr optcnumexpr opt_control_data 88675fd0b74Schristos { 88775fd0b74Schristos $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7); 88875fd0b74Schristos if ($8 != NULL) 88975fd0b74Schristos { 89075fd0b74Schristos if (dialog.ex == NULL) 89175fd0b74Schristos rcparse_warning (_("control data requires DIALOGEX")); 89275fd0b74Schristos $$->data = $8; 89375fd0b74Schristos } 89475fd0b74Schristos } 89575fd0b74Schristos | numexpr cnumexpr cnumexpr cnumexpr cnumexpr 89675fd0b74Schristos control_params_styleexpr cnumexpr cnumexpr opt_control_data 89775fd0b74Schristos { 89875fd0b74Schristos $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7); 89975fd0b74Schristos if (dialog.ex == NULL) 90075fd0b74Schristos rcparse_warning (_("help ID requires DIALOGEX")); 90175fd0b74Schristos $$->help = $8; 90275fd0b74Schristos $$->data = $9; 90375fd0b74Schristos } 90475fd0b74Schristos ; 90575fd0b74Schristos 90675fd0b74Schristos cresid: 90775fd0b74Schristos ',' resid 90875fd0b74Schristos { 90975fd0b74Schristos if ($2.named) 91075fd0b74Schristos res_unistring_to_id (&$$, $2.u.n.name); 91175fd0b74Schristos else 91275fd0b74Schristos $$=$2; 91375fd0b74Schristos } 91475fd0b74Schristos ; 91575fd0b74Schristos 91675fd0b74Schristos optresidc: 91775fd0b74Schristos /* empty */ 91875fd0b74Schristos { 91975fd0b74Schristos res_string_to_id (&$$, ""); 92075fd0b74Schristos } 92175fd0b74Schristos | resid ',' { $$=$1; } 92275fd0b74Schristos ; 92375fd0b74Schristos 92475fd0b74Schristos resid: 92575fd0b74Schristos posnumexpr 92675fd0b74Schristos { 92775fd0b74Schristos $$.named = 0; 92875fd0b74Schristos $$.u.id = $1; 92975fd0b74Schristos } 93075fd0b74Schristos | res_unicode_string_concat 93175fd0b74Schristos { 93275fd0b74Schristos $$.named = 1; 93375fd0b74Schristos $$.u.n.name = $1; 93475fd0b74Schristos $$.u.n.length = unichar_len ($1); 93575fd0b74Schristos } 93675fd0b74Schristos ; 93775fd0b74Schristos 93875fd0b74Schristos opt_control_data: 93975fd0b74Schristos /* empty */ 94075fd0b74Schristos { 94175fd0b74Schristos $$ = NULL; 94275fd0b74Schristos } 94375fd0b74Schristos | BEG optrcdata_data END 94475fd0b74Schristos { 94575fd0b74Schristos $$ = $2.first; 94675fd0b74Schristos } 94775fd0b74Schristos ; 94875fd0b74Schristos 94975fd0b74Schristos /* These only exist to parse a reduction out of a common case. */ 95075fd0b74Schristos 95175fd0b74Schristos control_styleexpr: 95275fd0b74Schristos ',' 95375fd0b74Schristos { style = WS_CHILD | WS_VISIBLE; } 95475fd0b74Schristos styleexpr 95575fd0b74Schristos ; 95675fd0b74Schristos 95775fd0b74Schristos icon_styleexpr: 95875fd0b74Schristos ',' 95975fd0b74Schristos { style = SS_ICON | WS_CHILD | WS_VISIBLE; } 96075fd0b74Schristos styleexpr 96175fd0b74Schristos ; 96275fd0b74Schristos 96375fd0b74Schristos control_params_styleexpr: 96475fd0b74Schristos ',' 96575fd0b74Schristos { style = base_style | WS_CHILD | WS_VISIBLE; } 96675fd0b74Schristos styleexpr 96775fd0b74Schristos ; 96875fd0b74Schristos 96975fd0b74Schristos /* Font resources. */ 97075fd0b74Schristos 97175fd0b74Schristos font: 97275fd0b74Schristos id FONT memflags_move_discard file_name 97375fd0b74Schristos { 97475fd0b74Schristos define_font ($1, &$3, $4); 97575fd0b74Schristos if (yychar != YYEMPTY) 97675fd0b74Schristos YYERROR; 97775fd0b74Schristos rcparse_discard_strings (); 97875fd0b74Schristos } 97975fd0b74Schristos ; 98075fd0b74Schristos 98175fd0b74Schristos /* Icon resources. */ 98275fd0b74Schristos 98375fd0b74Schristos icon: 98475fd0b74Schristos id ICON memflags_move_discard file_name 98575fd0b74Schristos { 98675fd0b74Schristos define_icon ($1, &$3, $4); 98775fd0b74Schristos if (yychar != YYEMPTY) 98875fd0b74Schristos YYERROR; 98975fd0b74Schristos rcparse_discard_strings (); 99075fd0b74Schristos } 99175fd0b74Schristos ; 99275fd0b74Schristos 99375fd0b74Schristos /* Language command. This changes the static variable language, which 99475fd0b74Schristos affects all subsequent resources. */ 99575fd0b74Schristos 99675fd0b74Schristos language: 99775fd0b74Schristos LANGUAGE numexpr cnumexpr 99875fd0b74Schristos { 99975fd0b74Schristos language = $2 | ($3 << SUBLANG_SHIFT); 100075fd0b74Schristos } 100175fd0b74Schristos ; 100275fd0b74Schristos 100375fd0b74Schristos /* Menu resources. */ 100475fd0b74Schristos 100575fd0b74Schristos menu: 100675fd0b74Schristos id MENU suboptions BEG menuitems END 100775fd0b74Schristos { 100875fd0b74Schristos define_menu ($1, &$3, $5); 100975fd0b74Schristos if (yychar != YYEMPTY) 101075fd0b74Schristos YYERROR; 101175fd0b74Schristos rcparse_discard_strings (); 101275fd0b74Schristos } 101375fd0b74Schristos ; 101475fd0b74Schristos 101575fd0b74Schristos menuitems: 101675fd0b74Schristos /* empty */ 101775fd0b74Schristos { 101875fd0b74Schristos $$ = NULL; 101975fd0b74Schristos } 102075fd0b74Schristos | menuitems menuitem 102175fd0b74Schristos { 102275fd0b74Schristos if ($1 == NULL) 102375fd0b74Schristos $$ = $2; 102475fd0b74Schristos else 102575fd0b74Schristos { 102675fd0b74Schristos rc_menuitem **pp; 102775fd0b74Schristos 102875fd0b74Schristos for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) 102975fd0b74Schristos ; 103075fd0b74Schristos *pp = $2; 103175fd0b74Schristos $$ = $1; 103275fd0b74Schristos } 103375fd0b74Schristos } 103475fd0b74Schristos ; 103575fd0b74Schristos 103675fd0b74Schristos menuitem: 103775fd0b74Schristos MENUITEM res_unicode_string_concat cnumexpr menuitem_flags 103875fd0b74Schristos { 103975fd0b74Schristos $$ = define_menuitem ($2, $3, $4, 0, 0, NULL); 104075fd0b74Schristos } 104175fd0b74Schristos | MENUITEM SEPARATOR 104275fd0b74Schristos { 104375fd0b74Schristos $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL); 104475fd0b74Schristos } 104575fd0b74Schristos | POPUP res_unicode_string_concat menuitem_flags BEG menuitems END 104675fd0b74Schristos { 104775fd0b74Schristos $$ = define_menuitem ($2, 0, $3, 0, 0, $5); 104875fd0b74Schristos } 104975fd0b74Schristos ; 105075fd0b74Schristos 105175fd0b74Schristos menuitem_flags: 105275fd0b74Schristos /* empty */ 105375fd0b74Schristos { 105475fd0b74Schristos $$ = 0; 105575fd0b74Schristos } 105675fd0b74Schristos | menuitem_flags ',' menuitem_flag 105775fd0b74Schristos { 105875fd0b74Schristos $$ = $1 | $3; 105975fd0b74Schristos } 106075fd0b74Schristos | menuitem_flags menuitem_flag 106175fd0b74Schristos { 106275fd0b74Schristos $$ = $1 | $2; 106375fd0b74Schristos } 106475fd0b74Schristos ; 106575fd0b74Schristos 106675fd0b74Schristos menuitem_flag: 106775fd0b74Schristos CHECKED 106875fd0b74Schristos { 106975fd0b74Schristos $$ = MENUITEM_CHECKED; 107075fd0b74Schristos } 107175fd0b74Schristos | GRAYED 107275fd0b74Schristos { 107375fd0b74Schristos $$ = MENUITEM_GRAYED; 107475fd0b74Schristos } 107575fd0b74Schristos | HELP 107675fd0b74Schristos { 107775fd0b74Schristos $$ = MENUITEM_HELP; 107875fd0b74Schristos } 107975fd0b74Schristos | INACTIVE 108075fd0b74Schristos { 108175fd0b74Schristos $$ = MENUITEM_INACTIVE; 108275fd0b74Schristos } 108375fd0b74Schristos | MENUBARBREAK 108475fd0b74Schristos { 108575fd0b74Schristos $$ = MENUITEM_MENUBARBREAK; 108675fd0b74Schristos } 108775fd0b74Schristos | MENUBREAK 108875fd0b74Schristos { 108975fd0b74Schristos $$ = MENUITEM_MENUBREAK; 109075fd0b74Schristos } 1091*e992f068Schristos | BITMAP 1092*e992f068Schristos { 1093*e992f068Schristos $$ = MENUITEM_BITMAP; 1094*e992f068Schristos } 1095*e992f068Schristos | OWNERDRAW 1096*e992f068Schristos { 1097*e992f068Schristos $$ = MENUITEM_OWNERDRAW; 1098*e992f068Schristos } 109975fd0b74Schristos ; 110075fd0b74Schristos 110175fd0b74Schristos /* Menuex resources. */ 110275fd0b74Schristos 110375fd0b74Schristos menuex: 110475fd0b74Schristos id MENUEX suboptions BEG menuexitems END 110575fd0b74Schristos { 110675fd0b74Schristos define_menu ($1, &$3, $5); 110775fd0b74Schristos if (yychar != YYEMPTY) 110875fd0b74Schristos YYERROR; 110975fd0b74Schristos rcparse_discard_strings (); 111075fd0b74Schristos } 111175fd0b74Schristos ; 111275fd0b74Schristos 111375fd0b74Schristos menuexitems: 111475fd0b74Schristos /* empty */ 111575fd0b74Schristos { 111675fd0b74Schristos $$ = NULL; 111775fd0b74Schristos } 111875fd0b74Schristos | menuexitems menuexitem 111975fd0b74Schristos { 112075fd0b74Schristos if ($1 == NULL) 112175fd0b74Schristos $$ = $2; 112275fd0b74Schristos else 112375fd0b74Schristos { 112475fd0b74Schristos rc_menuitem **pp; 112575fd0b74Schristos 112675fd0b74Schristos for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) 112775fd0b74Schristos ; 112875fd0b74Schristos *pp = $2; 112975fd0b74Schristos $$ = $1; 113075fd0b74Schristos } 113175fd0b74Schristos } 113275fd0b74Schristos ; 113375fd0b74Schristos 113475fd0b74Schristos menuexitem: 113575fd0b74Schristos MENUITEM res_unicode_string_concat 113675fd0b74Schristos { 113775fd0b74Schristos $$ = define_menuitem ($2, 0, 0, 0, 0, NULL); 113875fd0b74Schristos } 113975fd0b74Schristos | MENUITEM res_unicode_string_concat cnumexpr 114075fd0b74Schristos { 114175fd0b74Schristos $$ = define_menuitem ($2, $3, 0, 0, 0, NULL); 114275fd0b74Schristos } 114375fd0b74Schristos | MENUITEM res_unicode_string_concat cnumexpr cnumexpr optcnumexpr 114475fd0b74Schristos { 114575fd0b74Schristos $$ = define_menuitem ($2, $3, $4, $5, 0, NULL); 114675fd0b74Schristos } 114775fd0b74Schristos | MENUITEM SEPARATOR 114875fd0b74Schristos { 114975fd0b74Schristos $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL); 115075fd0b74Schristos } 115175fd0b74Schristos | POPUP res_unicode_string_concat BEG menuexitems END 115275fd0b74Schristos { 115375fd0b74Schristos $$ = define_menuitem ($2, 0, 0, 0, 0, $4); 115475fd0b74Schristos } 115575fd0b74Schristos | POPUP res_unicode_string_concat cnumexpr BEG menuexitems END 115675fd0b74Schristos { 115775fd0b74Schristos $$ = define_menuitem ($2, $3, 0, 0, 0, $5); 115875fd0b74Schristos } 115975fd0b74Schristos | POPUP res_unicode_string_concat cnumexpr cnumexpr BEG menuexitems END 116075fd0b74Schristos { 116175fd0b74Schristos $$ = define_menuitem ($2, $3, $4, 0, 0, $6); 116275fd0b74Schristos } 116375fd0b74Schristos | POPUP res_unicode_string_concat cnumexpr cnumexpr cnumexpr optcnumexpr 116475fd0b74Schristos BEG menuexitems END 116575fd0b74Schristos { 116675fd0b74Schristos $$ = define_menuitem ($2, $3, $4, $5, $6, $8); 116775fd0b74Schristos } 116875fd0b74Schristos ; 116975fd0b74Schristos 117075fd0b74Schristos /* Messagetable resources. */ 117175fd0b74Schristos 117275fd0b74Schristos messagetable: 117375fd0b74Schristos id MESSAGETABLE memflags_move file_name 117475fd0b74Schristos { 117575fd0b74Schristos define_messagetable ($1, &$3, $4); 117675fd0b74Schristos if (yychar != YYEMPTY) 117775fd0b74Schristos YYERROR; 117875fd0b74Schristos rcparse_discard_strings (); 117975fd0b74Schristos } 118075fd0b74Schristos ; 118175fd0b74Schristos 118275fd0b74Schristos /* We use a different lexing algorithm, because rcdata strings may 118375fd0b74Schristos contain embedded null bytes, and we need to know the length to use. */ 118475fd0b74Schristos 118575fd0b74Schristos optrcdata_data: 118675fd0b74Schristos { 118775fd0b74Schristos rcparse_rcdata (); 118875fd0b74Schristos } 118975fd0b74Schristos optrcdata_data_int 119075fd0b74Schristos { 119175fd0b74Schristos rcparse_normal (); 119275fd0b74Schristos $$ = $2; 119375fd0b74Schristos } 119475fd0b74Schristos ; 119575fd0b74Schristos 119675fd0b74Schristos optrcdata_data_int: 119775fd0b74Schristos /* empty */ 119875fd0b74Schristos { 119975fd0b74Schristos $$.first = NULL; 120075fd0b74Schristos $$.last = NULL; 120175fd0b74Schristos } 120275fd0b74Schristos | rcdata_data 120375fd0b74Schristos { 120475fd0b74Schristos $$ = $1; 120575fd0b74Schristos } 120675fd0b74Schristos ; 120775fd0b74Schristos 120875fd0b74Schristos rcdata_data: 120975fd0b74Schristos sizedstring 121075fd0b74Schristos { 121175fd0b74Schristos rc_rcdata_item *ri; 121275fd0b74Schristos 121375fd0b74Schristos ri = define_rcdata_string ($1.s, $1.length); 121475fd0b74Schristos $$.first = ri; 121575fd0b74Schristos $$.last = ri; 121675fd0b74Schristos } 121775fd0b74Schristos | sizedunistring 121875fd0b74Schristos { 121975fd0b74Schristos rc_rcdata_item *ri; 122075fd0b74Schristos 122175fd0b74Schristos ri = define_rcdata_unistring ($1.s, $1.length); 122275fd0b74Schristos $$.first = ri; 122375fd0b74Schristos $$.last = ri; 122475fd0b74Schristos } 122575fd0b74Schristos | sizednumexpr 122675fd0b74Schristos { 122775fd0b74Schristos rc_rcdata_item *ri; 122875fd0b74Schristos 122975fd0b74Schristos ri = define_rcdata_number ($1.val, $1.dword); 123075fd0b74Schristos $$.first = ri; 123175fd0b74Schristos $$.last = ri; 123275fd0b74Schristos } 123375fd0b74Schristos | rcdata_data ',' sizedstring 123475fd0b74Schristos { 123575fd0b74Schristos rc_rcdata_item *ri; 123675fd0b74Schristos 123775fd0b74Schristos ri = define_rcdata_string ($3.s, $3.length); 123875fd0b74Schristos $$.first = $1.first; 123975fd0b74Schristos $1.last->next = ri; 124075fd0b74Schristos $$.last = ri; 124175fd0b74Schristos } 124275fd0b74Schristos | rcdata_data ',' sizedunistring 124375fd0b74Schristos { 124475fd0b74Schristos rc_rcdata_item *ri; 124575fd0b74Schristos 124675fd0b74Schristos ri = define_rcdata_unistring ($3.s, $3.length); 124775fd0b74Schristos $$.first = $1.first; 124875fd0b74Schristos $1.last->next = ri; 124975fd0b74Schristos $$.last = ri; 125075fd0b74Schristos } 125175fd0b74Schristos | rcdata_data ',' sizednumexpr 125275fd0b74Schristos { 125375fd0b74Schristos rc_rcdata_item *ri; 125475fd0b74Schristos 125575fd0b74Schristos ri = define_rcdata_number ($3.val, $3.dword); 125675fd0b74Schristos $$.first = $1.first; 125775fd0b74Schristos $1.last->next = ri; 125875fd0b74Schristos $$.last = ri; 125975fd0b74Schristos } 126075fd0b74Schristos | rcdata_data ',' 126175fd0b74Schristos { 126275fd0b74Schristos $$=$1; 126375fd0b74Schristos } 126475fd0b74Schristos ; 126575fd0b74Schristos 126675fd0b74Schristos /* Stringtable resources. */ 126775fd0b74Schristos 126875fd0b74Schristos stringtable: 126975fd0b74Schristos STRINGTABLE suboptions BEG 127075fd0b74Schristos { sub_res_info = $2; rcparse_rcdata (); } 127175fd0b74Schristos string_data END { rcparse_normal (); } 127275fd0b74Schristos ; 127375fd0b74Schristos 127475fd0b74Schristos string_data: 127575fd0b74Schristos /* empty */ 127675fd0b74Schristos | string_data numexpr res_unicode_sizedstring_concat 127775fd0b74Schristos { 127875fd0b74Schristos define_stringtable (&sub_res_info, $2, $3.s, $3.length); 127975fd0b74Schristos rcparse_discard_strings (); 128075fd0b74Schristos } 128175fd0b74Schristos | string_data numexpr ',' res_unicode_sizedstring_concat 128275fd0b74Schristos { 128375fd0b74Schristos define_stringtable (&sub_res_info, $2, $4.s, $4.length); 128475fd0b74Schristos rcparse_discard_strings (); 128575fd0b74Schristos } 128675fd0b74Schristos | string_data error 128775fd0b74Schristos { 128875fd0b74Schristos rcparse_warning (_("invalid stringtable resource.")); 128975fd0b74Schristos abort (); 129075fd0b74Schristos } 129175fd0b74Schristos ; 129275fd0b74Schristos 129375fd0b74Schristos rcdata_id: 129475fd0b74Schristos id 129575fd0b74Schristos { 129675fd0b74Schristos $$=$1; 129775fd0b74Schristos } 129875fd0b74Schristos | HTML 129975fd0b74Schristos { 130075fd0b74Schristos $$.named = 0; 130175fd0b74Schristos $$.u.id = 23; 130275fd0b74Schristos } 130375fd0b74Schristos | RCDATA 130475fd0b74Schristos { 130575fd0b74Schristos $$.named = 0; 130675fd0b74Schristos $$.u.id = RT_RCDATA; 130775fd0b74Schristos } 130875fd0b74Schristos | MANIFEST 130975fd0b74Schristos { 131075fd0b74Schristos $$.named = 0; 131175fd0b74Schristos $$.u.id = RT_MANIFEST; 131275fd0b74Schristos } 131375fd0b74Schristos | PLUGPLAY 131475fd0b74Schristos { 131575fd0b74Schristos $$.named = 0; 131675fd0b74Schristos $$.u.id = RT_PLUGPLAY; 131775fd0b74Schristos } 131875fd0b74Schristos | VXD 131975fd0b74Schristos { 132075fd0b74Schristos $$.named = 0; 132175fd0b74Schristos $$.u.id = RT_VXD; 132275fd0b74Schristos } 132375fd0b74Schristos | DLGINCLUDE 132475fd0b74Schristos { 132575fd0b74Schristos $$.named = 0; 132675fd0b74Schristos $$.u.id = RT_DLGINCLUDE; 132775fd0b74Schristos } 132875fd0b74Schristos | DLGINIT 132975fd0b74Schristos { 133075fd0b74Schristos $$.named = 0; 133175fd0b74Schristos $$.u.id = RT_DLGINIT; 133275fd0b74Schristos } 133375fd0b74Schristos | ANICURSOR 133475fd0b74Schristos { 133575fd0b74Schristos $$.named = 0; 133675fd0b74Schristos $$.u.id = RT_ANICURSOR; 133775fd0b74Schristos } 133875fd0b74Schristos | ANIICON 133975fd0b74Schristos { 134075fd0b74Schristos $$.named = 0; 134175fd0b74Schristos $$.u.id = RT_ANIICON; 134275fd0b74Schristos } 134375fd0b74Schristos ; 134475fd0b74Schristos 134575fd0b74Schristos /* User defined resources. We accept general suboptions in the 134675fd0b74Schristos file_name case to keep the parser happy. */ 134775fd0b74Schristos 134875fd0b74Schristos user: 134975fd0b74Schristos id rcdata_id suboptions BEG optrcdata_data END 135075fd0b74Schristos { 135175fd0b74Schristos define_user_data ($1, $2, &$3, $5.first); 135275fd0b74Schristos if (yychar != YYEMPTY) 135375fd0b74Schristos YYERROR; 135475fd0b74Schristos rcparse_discard_strings (); 135575fd0b74Schristos } 135675fd0b74Schristos | id rcdata_id suboptions file_name 135775fd0b74Schristos { 135875fd0b74Schristos define_user_file ($1, $2, &$3, $4); 135975fd0b74Schristos if (yychar != YYEMPTY) 136075fd0b74Schristos YYERROR; 136175fd0b74Schristos rcparse_discard_strings (); 136275fd0b74Schristos } 136375fd0b74Schristos ; 136475fd0b74Schristos 136575fd0b74Schristos toolbar: 136675fd0b74Schristos id TOOLBAR suboptions numexpr cnumexpr BEG toolbar_data END 136775fd0b74Schristos { 136875fd0b74Schristos define_toolbar ($1, &$3, $4, $5, $7); 136975fd0b74Schristos } 137075fd0b74Schristos ; 137175fd0b74Schristos 137275fd0b74Schristos toolbar_data: /* empty */ { $$= NULL; } 137375fd0b74Schristos | toolbar_data BUTTON id 137475fd0b74Schristos { 137575fd0b74Schristos rc_toolbar_item *c,*n; 137675fd0b74Schristos c = $1; 137775fd0b74Schristos n= (rc_toolbar_item *) 137875fd0b74Schristos res_alloc (sizeof (rc_toolbar_item)); 137975fd0b74Schristos if (c != NULL) 138075fd0b74Schristos while (c->next != NULL) 138175fd0b74Schristos c = c->next; 138275fd0b74Schristos n->prev = c; 138375fd0b74Schristos n->next = NULL; 138475fd0b74Schristos if (c != NULL) 138575fd0b74Schristos c->next = n; 138675fd0b74Schristos n->id = $3; 138775fd0b74Schristos if ($1 == NULL) 138875fd0b74Schristos $$ = n; 138975fd0b74Schristos else 139075fd0b74Schristos $$ = $1; 139175fd0b74Schristos } 139275fd0b74Schristos | toolbar_data SEPARATOR 139375fd0b74Schristos { 139475fd0b74Schristos rc_toolbar_item *c,*n; 139575fd0b74Schristos c = $1; 139675fd0b74Schristos n= (rc_toolbar_item *) 139775fd0b74Schristos res_alloc (sizeof (rc_toolbar_item)); 139875fd0b74Schristos if (c != NULL) 139975fd0b74Schristos while (c->next != NULL) 140075fd0b74Schristos c = c->next; 140175fd0b74Schristos n->prev = c; 140275fd0b74Schristos n->next = NULL; 140375fd0b74Schristos if (c != NULL) 140475fd0b74Schristos c->next = n; 140575fd0b74Schristos n->id.named = 0; 140675fd0b74Schristos n->id.u.id = 0; 140775fd0b74Schristos if ($1 == NULL) 140875fd0b74Schristos $$ = n; 140975fd0b74Schristos else 141075fd0b74Schristos $$ = $1; 141175fd0b74Schristos } 141275fd0b74Schristos ; 141375fd0b74Schristos 141475fd0b74Schristos /* Versioninfo resources. */ 141575fd0b74Schristos 141675fd0b74Schristos versioninfo: 141775fd0b74Schristos id VERSIONINFO fixedverinfo BEG verblocks END 141875fd0b74Schristos { 141975fd0b74Schristos define_versioninfo ($1, language, $3, $5); 142075fd0b74Schristos if (yychar != YYEMPTY) 142175fd0b74Schristos YYERROR; 142275fd0b74Schristos rcparse_discard_strings (); 142375fd0b74Schristos } 142475fd0b74Schristos ; 142575fd0b74Schristos 142675fd0b74Schristos fixedverinfo: 142775fd0b74Schristos /* empty */ 142875fd0b74Schristos { 142975fd0b74Schristos $$ = ((rc_fixed_versioninfo *) 143075fd0b74Schristos res_alloc (sizeof (rc_fixed_versioninfo))); 143175fd0b74Schristos memset ($$, 0, sizeof (rc_fixed_versioninfo)); 143275fd0b74Schristos } 143375fd0b74Schristos | fixedverinfo FILEVERSION numexpr optcnumexpr optcnumexpr 143475fd0b74Schristos optcnumexpr 143575fd0b74Schristos { 143675fd0b74Schristos $1->file_version_ms = ($3 << 16) | ($4 & 0xffff); 143775fd0b74Schristos $1->file_version_ls = ($5 << 16) | ($6 & 0xffff); 143875fd0b74Schristos $$ = $1; 143975fd0b74Schristos } 144075fd0b74Schristos | fixedverinfo PRODUCTVERSION numexpr optcnumexpr optcnumexpr 144175fd0b74Schristos optcnumexpr 144275fd0b74Schristos { 144375fd0b74Schristos $1->product_version_ms = ($3 << 16) | ($4 & 0xffff); 144475fd0b74Schristos $1->product_version_ls = ($5 << 16) | ($6 & 0xffff); 144575fd0b74Schristos $$ = $1; 144675fd0b74Schristos } 144775fd0b74Schristos | fixedverinfo FILEFLAGSMASK numexpr 144875fd0b74Schristos { 144975fd0b74Schristos $1->file_flags_mask = $3; 145075fd0b74Schristos $$ = $1; 145175fd0b74Schristos } 145275fd0b74Schristos | fixedverinfo FILEFLAGS numexpr 145375fd0b74Schristos { 145475fd0b74Schristos $1->file_flags = $3; 145575fd0b74Schristos $$ = $1; 145675fd0b74Schristos } 145775fd0b74Schristos | fixedverinfo FILEOS numexpr 145875fd0b74Schristos { 145975fd0b74Schristos $1->file_os = $3; 146075fd0b74Schristos $$ = $1; 146175fd0b74Schristos } 146275fd0b74Schristos | fixedverinfo FILETYPE numexpr 146375fd0b74Schristos { 146475fd0b74Schristos $1->file_type = $3; 146575fd0b74Schristos $$ = $1; 146675fd0b74Schristos } 146775fd0b74Schristos | fixedverinfo FILESUBTYPE numexpr 146875fd0b74Schristos { 146975fd0b74Schristos $1->file_subtype = $3; 147075fd0b74Schristos $$ = $1; 147175fd0b74Schristos } 147275fd0b74Schristos ; 147375fd0b74Schristos 147475fd0b74Schristos /* To handle verblocks successfully, the lexer handles BLOCK 147575fd0b74Schristos specially. A BLOCK "StringFileInfo" is returned as 147675fd0b74Schristos BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as 147775fd0b74Schristos BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK 147875fd0b74Schristos with the string as the value. */ 147975fd0b74Schristos 148075fd0b74Schristos verblocks: 148175fd0b74Schristos /* empty */ 148275fd0b74Schristos { 148375fd0b74Schristos $$ = NULL; 148475fd0b74Schristos } 148575fd0b74Schristos | verblocks BLOCKSTRINGFILEINFO BEG verstringtables END 148675fd0b74Schristos { 148775fd0b74Schristos $$ = append_ver_stringfileinfo ($1, $4); 148875fd0b74Schristos } 148975fd0b74Schristos | verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END 149075fd0b74Schristos { 149175fd0b74Schristos $$ = append_ver_varfileinfo ($1, $5, $6); 149275fd0b74Schristos } 149375fd0b74Schristos ; 149475fd0b74Schristos 149575fd0b74Schristos verstringtables: 149675fd0b74Schristos /* empty */ 149775fd0b74Schristos { 149875fd0b74Schristos $$ = NULL; 149975fd0b74Schristos } 150075fd0b74Schristos | verstringtables BLOCK BEG vervals END 150175fd0b74Schristos { 150275fd0b74Schristos $$ = append_ver_stringtable ($1, $2, $4); 150375fd0b74Schristos } 150475fd0b74Schristos ; 150575fd0b74Schristos 150675fd0b74Schristos vervals: 150775fd0b74Schristos /* empty */ 150875fd0b74Schristos { 150975fd0b74Schristos $$ = NULL; 151075fd0b74Schristos } 151175fd0b74Schristos | vervals VALUE res_unicode_string_concat ',' res_unicode_string_concat 151275fd0b74Schristos { 151375fd0b74Schristos $$ = append_verval ($1, $3, $5); 151475fd0b74Schristos } 151575fd0b74Schristos ; 151675fd0b74Schristos 151775fd0b74Schristos vertrans: 151875fd0b74Schristos /* empty */ 151975fd0b74Schristos { 152075fd0b74Schristos $$ = NULL; 152175fd0b74Schristos } 152275fd0b74Schristos | vertrans cnumexpr cnumexpr 152375fd0b74Schristos { 152475fd0b74Schristos $$ = append_vertrans ($1, $2, $3); 152575fd0b74Schristos } 152675fd0b74Schristos ; 152775fd0b74Schristos 152875fd0b74Schristos /* A resource ID. */ 152975fd0b74Schristos 153075fd0b74Schristos id: 153175fd0b74Schristos posnumexpr 153275fd0b74Schristos { 153375fd0b74Schristos $$.named = 0; 153475fd0b74Schristos $$.u.id = $1; 153575fd0b74Schristos } 153675fd0b74Schristos | resname 153775fd0b74Schristos { 153875fd0b74Schristos res_unistring_to_id (&$$, $1); 153975fd0b74Schristos } 154075fd0b74Schristos ; 154175fd0b74Schristos 154275fd0b74Schristos /* A resource reference. */ 154375fd0b74Schristos 154475fd0b74Schristos resname: 154575fd0b74Schristos res_unicode_string 154675fd0b74Schristos { 154775fd0b74Schristos $$ = $1; 154875fd0b74Schristos } 154975fd0b74Schristos | STRING 155075fd0b74Schristos { 155175fd0b74Schristos unichar *h = NULL; 155275fd0b74Schristos unicode_from_ascii ((rc_uint_type *) NULL, &h, $1); 155375fd0b74Schristos $$ = h; 155475fd0b74Schristos } 155575fd0b74Schristos ; 155675fd0b74Schristos 155775fd0b74Schristos 155875fd0b74Schristos resref: 155975fd0b74Schristos posnumexpr ',' 156075fd0b74Schristos { 156175fd0b74Schristos $$.named = 0; 156275fd0b74Schristos $$.u.id = $1; 156375fd0b74Schristos } 156475fd0b74Schristos | resname 156575fd0b74Schristos { 156675fd0b74Schristos res_unistring_to_id (&$$, $1); 156775fd0b74Schristos } 156875fd0b74Schristos | resname ',' 156975fd0b74Schristos { 157075fd0b74Schristos res_unistring_to_id (&$$, $1); 157175fd0b74Schristos } 157275fd0b74Schristos ; 157375fd0b74Schristos 157475fd0b74Schristos /* Generic suboptions. These may appear before the BEGIN in any 157575fd0b74Schristos multiline statement. */ 157675fd0b74Schristos 157775fd0b74Schristos suboptions: 157875fd0b74Schristos /* empty */ 157975fd0b74Schristos { 158075fd0b74Schristos memset (&$$, 0, sizeof (rc_res_res_info)); 158175fd0b74Schristos $$.language = language; 158275fd0b74Schristos /* FIXME: Is this the right default? */ 158375fd0b74Schristos $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE; 158475fd0b74Schristos } 158575fd0b74Schristos | suboptions memflag 158675fd0b74Schristos { 158775fd0b74Schristos $$ = $1; 158875fd0b74Schristos $$.memflags |= $2.on; 158975fd0b74Schristos $$.memflags &=~ $2.off; 159075fd0b74Schristos } 159175fd0b74Schristos | suboptions CHARACTERISTICS numexpr 159275fd0b74Schristos { 159375fd0b74Schristos $$ = $1; 159475fd0b74Schristos $$.characteristics = $3; 159575fd0b74Schristos } 159675fd0b74Schristos | suboptions LANGUAGE numexpr cnumexpr 159775fd0b74Schristos { 159875fd0b74Schristos $$ = $1; 159975fd0b74Schristos $$.language = $3 | ($4 << SUBLANG_SHIFT); 160075fd0b74Schristos } 160175fd0b74Schristos | suboptions VERSIONK numexpr 160275fd0b74Schristos { 160375fd0b74Schristos $$ = $1; 160475fd0b74Schristos $$.version = $3; 160575fd0b74Schristos } 160675fd0b74Schristos ; 160775fd0b74Schristos 160875fd0b74Schristos /* Memory flags which default to MOVEABLE and DISCARDABLE. */ 160975fd0b74Schristos 161075fd0b74Schristos memflags_move_discard: 161175fd0b74Schristos /* empty */ 161275fd0b74Schristos { 161375fd0b74Schristos memset (&$$, 0, sizeof (rc_res_res_info)); 161475fd0b74Schristos $$.language = language; 161575fd0b74Schristos $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE; 161675fd0b74Schristos } 161775fd0b74Schristos | memflags_move_discard memflag 161875fd0b74Schristos { 161975fd0b74Schristos $$ = $1; 162075fd0b74Schristos $$.memflags |= $2.on; 162175fd0b74Schristos $$.memflags &=~ $2.off; 162275fd0b74Schristos } 162375fd0b74Schristos ; 162475fd0b74Schristos 162575fd0b74Schristos /* Memory flags which default to MOVEABLE. */ 162675fd0b74Schristos 162775fd0b74Schristos memflags_move: 162875fd0b74Schristos /* empty */ 162975fd0b74Schristos { 163075fd0b74Schristos memset (&$$, 0, sizeof (rc_res_res_info)); 163175fd0b74Schristos $$.language = language; 163275fd0b74Schristos $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE; 163375fd0b74Schristos } 163475fd0b74Schristos | memflags_move memflag 163575fd0b74Schristos { 163675fd0b74Schristos $$ = $1; 163775fd0b74Schristos $$.memflags |= $2.on; 163875fd0b74Schristos $$.memflags &=~ $2.off; 163975fd0b74Schristos } 164075fd0b74Schristos ; 164175fd0b74Schristos 164275fd0b74Schristos /* Memory flags. This returns a struct with two integers, because we 164375fd0b74Schristos sometimes want to set bits and we sometimes want to clear them. */ 164475fd0b74Schristos 164575fd0b74Schristos memflag: 164675fd0b74Schristos MOVEABLE 164775fd0b74Schristos { 164875fd0b74Schristos $$.on = MEMFLAG_MOVEABLE; 164975fd0b74Schristos $$.off = 0; 165075fd0b74Schristos } 165175fd0b74Schristos | FIXED 165275fd0b74Schristos { 165375fd0b74Schristos $$.on = 0; 165475fd0b74Schristos $$.off = MEMFLAG_MOVEABLE; 165575fd0b74Schristos } 165675fd0b74Schristos | PURE 165775fd0b74Schristos { 165875fd0b74Schristos $$.on = MEMFLAG_PURE; 165975fd0b74Schristos $$.off = 0; 166075fd0b74Schristos } 166175fd0b74Schristos | IMPURE 166275fd0b74Schristos { 166375fd0b74Schristos $$.on = 0; 166475fd0b74Schristos $$.off = MEMFLAG_PURE; 166575fd0b74Schristos } 166675fd0b74Schristos | PRELOAD 166775fd0b74Schristos { 166875fd0b74Schristos $$.on = MEMFLAG_PRELOAD; 166975fd0b74Schristos $$.off = 0; 167075fd0b74Schristos } 167175fd0b74Schristos | LOADONCALL 167275fd0b74Schristos { 167375fd0b74Schristos $$.on = 0; 167475fd0b74Schristos $$.off = MEMFLAG_PRELOAD; 167575fd0b74Schristos } 167675fd0b74Schristos | DISCARDABLE 167775fd0b74Schristos { 167875fd0b74Schristos $$.on = MEMFLAG_DISCARDABLE; 167975fd0b74Schristos $$.off = 0; 168075fd0b74Schristos } 168175fd0b74Schristos ; 168275fd0b74Schristos 168375fd0b74Schristos /* A file name. */ 168475fd0b74Schristos 168575fd0b74Schristos file_name: 168675fd0b74Schristos QUOTEDSTRING 168775fd0b74Schristos { 168875fd0b74Schristos $$ = $1; 168975fd0b74Schristos } 169075fd0b74Schristos | STRING 169175fd0b74Schristos { 169275fd0b74Schristos $$ = $1; 169375fd0b74Schristos } 169475fd0b74Schristos ; 169575fd0b74Schristos 169675fd0b74Schristos /* Concat string */ 169775fd0b74Schristos res_unicode_string_concat: 169875fd0b74Schristos res_unicode_string 169975fd0b74Schristos { 170075fd0b74Schristos $$ = $1; 170175fd0b74Schristos } 170275fd0b74Schristos | 170375fd0b74Schristos res_unicode_string_concat res_unicode_string 170475fd0b74Schristos { 170575fd0b74Schristos rc_uint_type l1 = unichar_len ($1); 170675fd0b74Schristos rc_uint_type l2 = unichar_len ($2); 170775fd0b74Schristos unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); 170875fd0b74Schristos if (l1 != 0) 170975fd0b74Schristos memcpy (h, $1, l1 * sizeof (unichar)); 171075fd0b74Schristos if (l2 != 0) 171175fd0b74Schristos memcpy (h + l1, $2, l2 * sizeof (unichar)); 171275fd0b74Schristos h[l1 + l2] = 0; 171375fd0b74Schristos $$ = h; 171475fd0b74Schristos } 171575fd0b74Schristos ; 171675fd0b74Schristos 171775fd0b74Schristos res_unicode_string: 171875fd0b74Schristos QUOTEDUNISTRING 171975fd0b74Schristos { 172075fd0b74Schristos $$ = unichar_dup ($1); 172175fd0b74Schristos } 172275fd0b74Schristos | QUOTEDSTRING 172375fd0b74Schristos { 172475fd0b74Schristos unichar *h = NULL; 172575fd0b74Schristos unicode_from_ascii ((rc_uint_type *) NULL, &h, $1); 172675fd0b74Schristos $$ = h; 172775fd0b74Schristos } 172875fd0b74Schristos ; 172975fd0b74Schristos 173075fd0b74Schristos res_unicode_sizedstring: 173175fd0b74Schristos sizedunistring 173275fd0b74Schristos { 173375fd0b74Schristos $$ = $1; 173475fd0b74Schristos } 173575fd0b74Schristos | sizedstring 173675fd0b74Schristos { 173775fd0b74Schristos unichar *h = NULL; 173875fd0b74Schristos rc_uint_type l = 0; 173975fd0b74Schristos unicode_from_ascii_len (&l, &h, $1.s, $1.length); 174075fd0b74Schristos $$.s = h; 174175fd0b74Schristos $$.length = l; 174275fd0b74Schristos } 174375fd0b74Schristos ; 174475fd0b74Schristos 174575fd0b74Schristos /* Concat string */ 174675fd0b74Schristos res_unicode_sizedstring_concat: 174775fd0b74Schristos res_unicode_sizedstring 174875fd0b74Schristos { 174975fd0b74Schristos $$ = $1; 175075fd0b74Schristos } 175175fd0b74Schristos | 175275fd0b74Schristos res_unicode_sizedstring_concat res_unicode_sizedstring 175375fd0b74Schristos { 175475fd0b74Schristos rc_uint_type l1 = $1.length; 175575fd0b74Schristos rc_uint_type l2 = $2.length; 175675fd0b74Schristos unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); 175775fd0b74Schristos if (l1 != 0) 175875fd0b74Schristos memcpy (h, $1.s, l1 * sizeof (unichar)); 175975fd0b74Schristos if (l2 != 0) 176075fd0b74Schristos memcpy (h + l1, $2.s, l2 * sizeof (unichar)); 176175fd0b74Schristos h[l1 + l2] = 0; 176275fd0b74Schristos $$.length = l1 + l2; 176375fd0b74Schristos $$.s = h; 176475fd0b74Schristos } 176575fd0b74Schristos ; 176675fd0b74Schristos 176775fd0b74Schristos sizedstring: 176875fd0b74Schristos SIZEDSTRING 176975fd0b74Schristos { 177075fd0b74Schristos $$ = $1; 177175fd0b74Schristos } 177275fd0b74Schristos | sizedstring SIZEDSTRING 177375fd0b74Schristos { 177475fd0b74Schristos rc_uint_type l = $1.length + $2.length; 177575fd0b74Schristos char *h = (char *) res_alloc (l); 177675fd0b74Schristos memcpy (h, $1.s, $1.length); 177775fd0b74Schristos memcpy (h + $1.length, $2.s, $2.length); 177875fd0b74Schristos $$.s = h; 177975fd0b74Schristos $$.length = l; 178075fd0b74Schristos } 178175fd0b74Schristos ; 178275fd0b74Schristos 178375fd0b74Schristos sizedunistring: 178475fd0b74Schristos SIZEDUNISTRING 178575fd0b74Schristos { 178675fd0b74Schristos $$ = $1; 178775fd0b74Schristos } 178875fd0b74Schristos | sizedunistring SIZEDUNISTRING 178975fd0b74Schristos { 179075fd0b74Schristos rc_uint_type l = $1.length + $2.length; 179175fd0b74Schristos unichar *h = (unichar *) res_alloc (l * sizeof (unichar)); 179275fd0b74Schristos memcpy (h, $1.s, $1.length * sizeof (unichar)); 179375fd0b74Schristos memcpy (h + $1.length, $2.s, $2.length * sizeof (unichar)); 179475fd0b74Schristos $$.s = h; 179575fd0b74Schristos $$.length = l; 179675fd0b74Schristos } 179775fd0b74Schristos ; 179875fd0b74Schristos 179975fd0b74Schristos /* A style expression. This changes the static variable STYLE. We do 180075fd0b74Schristos it this way because rc appears to permit a style to be set to 180175fd0b74Schristos something like 180275fd0b74Schristos WS_GROUP | NOT WS_TABSTOP 180375fd0b74Schristos to mean that a default of WS_TABSTOP should be removed. Anything 180475fd0b74Schristos which wants to accept a style must first set STYLE to the default 180575fd0b74Schristos value. The styleexpr nonterminal will change STYLE as specified by 180675fd0b74Schristos the user. Note that we do not accept arbitrary expressions here, 180775fd0b74Schristos just numbers separated by '|'. */ 180875fd0b74Schristos 180975fd0b74Schristos styleexpr: 181075fd0b74Schristos parennumber 181175fd0b74Schristos { 181275fd0b74Schristos style |= $1; 181375fd0b74Schristos } 181475fd0b74Schristos | NOT parennumber 181575fd0b74Schristos { 181675fd0b74Schristos style &=~ $2; 181775fd0b74Schristos } 181875fd0b74Schristos | styleexpr '|' parennumber 181975fd0b74Schristos { 182075fd0b74Schristos style |= $3; 182175fd0b74Schristos } 182275fd0b74Schristos | styleexpr '|' NOT parennumber 182375fd0b74Schristos { 182475fd0b74Schristos style &=~ $4; 182575fd0b74Schristos } 182675fd0b74Schristos ; 182775fd0b74Schristos 182875fd0b74Schristos parennumber: 182975fd0b74Schristos NUMBER 183075fd0b74Schristos { 183175fd0b74Schristos $$ = $1.val; 183275fd0b74Schristos } 183375fd0b74Schristos | '(' numexpr ')' 183475fd0b74Schristos { 183575fd0b74Schristos $$ = $2; 183675fd0b74Schristos } 183775fd0b74Schristos ; 183875fd0b74Schristos 183975fd0b74Schristos /* An optional expression with a leading comma. */ 184075fd0b74Schristos 184175fd0b74Schristos optcnumexpr: 184275fd0b74Schristos /* empty */ 184375fd0b74Schristos { 184475fd0b74Schristos $$ = 0; 184575fd0b74Schristos } 184675fd0b74Schristos | cnumexpr 184775fd0b74Schristos { 184875fd0b74Schristos $$ = $1; 184975fd0b74Schristos } 185075fd0b74Schristos ; 185175fd0b74Schristos 185275fd0b74Schristos /* An expression with a leading comma. */ 185375fd0b74Schristos 185475fd0b74Schristos cnumexpr: 185575fd0b74Schristos ',' numexpr 185675fd0b74Schristos { 185775fd0b74Schristos $$ = $2; 185875fd0b74Schristos } 185975fd0b74Schristos ; 186075fd0b74Schristos 186175fd0b74Schristos /* A possibly negated numeric expression. */ 186275fd0b74Schristos 186375fd0b74Schristos numexpr: 186475fd0b74Schristos sizednumexpr 186575fd0b74Schristos { 186675fd0b74Schristos $$ = $1.val; 186775fd0b74Schristos } 186875fd0b74Schristos ; 186975fd0b74Schristos 187075fd0b74Schristos /* A possibly negated expression with a size. */ 187175fd0b74Schristos 187275fd0b74Schristos sizednumexpr: 187375fd0b74Schristos NUMBER 187475fd0b74Schristos { 187575fd0b74Schristos $$ = $1; 187675fd0b74Schristos } 187775fd0b74Schristos | '(' sizednumexpr ')' 187875fd0b74Schristos { 187975fd0b74Schristos $$ = $2; 188075fd0b74Schristos } 188175fd0b74Schristos | '~' sizednumexpr %prec '~' 188275fd0b74Schristos { 188375fd0b74Schristos $$.val = ~ $2.val; 188475fd0b74Schristos $$.dword = $2.dword; 188575fd0b74Schristos } 188675fd0b74Schristos | '-' sizednumexpr %prec NEG 188775fd0b74Schristos { 188875fd0b74Schristos $$.val = - $2.val; 188975fd0b74Schristos $$.dword = $2.dword; 189075fd0b74Schristos } 189175fd0b74Schristos | sizednumexpr '*' sizednumexpr 189275fd0b74Schristos { 189375fd0b74Schristos $$.val = $1.val * $3.val; 189475fd0b74Schristos $$.dword = $1.dword || $3.dword; 189575fd0b74Schristos } 189675fd0b74Schristos | sizednumexpr '/' sizednumexpr 189775fd0b74Schristos { 189875fd0b74Schristos $$.val = $1.val / ($3.val ? $3.val : 1); 189975fd0b74Schristos $$.dword = $1.dword || $3.dword; 190075fd0b74Schristos } 190175fd0b74Schristos | sizednumexpr '%' sizednumexpr 190275fd0b74Schristos { 190375fd0b74Schristos $$.val = $1.val % ($3.val ? $3.val : 1); 190475fd0b74Schristos $$.dword = $1.dword || $3.dword; 190575fd0b74Schristos } 190675fd0b74Schristos | sizednumexpr '+' sizednumexpr 190775fd0b74Schristos { 190875fd0b74Schristos $$.val = $1.val + $3.val; 190975fd0b74Schristos $$.dword = $1.dword || $3.dword; 191075fd0b74Schristos } 191175fd0b74Schristos | sizednumexpr '-' sizednumexpr 191275fd0b74Schristos { 191375fd0b74Schristos $$.val = $1.val - $3.val; 191475fd0b74Schristos $$.dword = $1.dword || $3.dword; 191575fd0b74Schristos } 191675fd0b74Schristos | sizednumexpr '&' sizednumexpr 191775fd0b74Schristos { 191875fd0b74Schristos $$.val = $1.val & $3.val; 191975fd0b74Schristos $$.dword = $1.dword || $3.dword; 192075fd0b74Schristos } 192175fd0b74Schristos | sizednumexpr '^' sizednumexpr 192275fd0b74Schristos { 192375fd0b74Schristos $$.val = $1.val ^ $3.val; 192475fd0b74Schristos $$.dword = $1.dword || $3.dword; 192575fd0b74Schristos } 192675fd0b74Schristos | sizednumexpr '|' sizednumexpr 192775fd0b74Schristos { 192875fd0b74Schristos $$.val = $1.val | $3.val; 192975fd0b74Schristos $$.dword = $1.dword || $3.dword; 193075fd0b74Schristos } 193175fd0b74Schristos ; 193275fd0b74Schristos 193375fd0b74Schristos /* An expression with a leading comma which does not use unary 193475fd0b74Schristos negation. */ 193575fd0b74Schristos 193675fd0b74Schristos cposnumexpr: 193775fd0b74Schristos ',' posnumexpr 193875fd0b74Schristos { 193975fd0b74Schristos $$ = $2; 194075fd0b74Schristos } 194175fd0b74Schristos ; 194275fd0b74Schristos 194375fd0b74Schristos /* An expression which does not use unary negation. */ 194475fd0b74Schristos 194575fd0b74Schristos posnumexpr: 194675fd0b74Schristos sizedposnumexpr 194775fd0b74Schristos { 194875fd0b74Schristos $$ = $1.val; 194975fd0b74Schristos } 195075fd0b74Schristos ; 195175fd0b74Schristos 195275fd0b74Schristos /* An expression which does not use unary negation. We separate unary 195375fd0b74Schristos negation to avoid parsing conflicts when two numeric expressions 195475fd0b74Schristos appear consecutively. */ 195575fd0b74Schristos 195675fd0b74Schristos sizedposnumexpr: 195775fd0b74Schristos NUMBER 195875fd0b74Schristos { 195975fd0b74Schristos $$ = $1; 196075fd0b74Schristos } 196175fd0b74Schristos | '(' sizednumexpr ')' 196275fd0b74Schristos { 196375fd0b74Schristos $$ = $2; 196475fd0b74Schristos } 196575fd0b74Schristos | '~' sizednumexpr %prec '~' 196675fd0b74Schristos { 196775fd0b74Schristos $$.val = ~ $2.val; 196875fd0b74Schristos $$.dword = $2.dword; 196975fd0b74Schristos } 197075fd0b74Schristos | sizedposnumexpr '*' sizednumexpr 197175fd0b74Schristos { 197275fd0b74Schristos $$.val = $1.val * $3.val; 197375fd0b74Schristos $$.dword = $1.dword || $3.dword; 197475fd0b74Schristos } 197575fd0b74Schristos | sizedposnumexpr '/' sizednumexpr 197675fd0b74Schristos { 197775fd0b74Schristos $$.val = $1.val / ($3.val ? $3.val : 1); 197875fd0b74Schristos $$.dword = $1.dword || $3.dword; 197975fd0b74Schristos } 198075fd0b74Schristos | sizedposnumexpr '%' sizednumexpr 198175fd0b74Schristos { 198275fd0b74Schristos /* PR 17512: file: 89105a25. */ 198375fd0b74Schristos $$.val = $1.val % ($3.val ? $3.val : 1); 198475fd0b74Schristos $$.dword = $1.dword || $3.dword; 198575fd0b74Schristos } 198675fd0b74Schristos | sizedposnumexpr '+' sizednumexpr 198775fd0b74Schristos { 198875fd0b74Schristos $$.val = $1.val + $3.val; 198975fd0b74Schristos $$.dword = $1.dword || $3.dword; 199075fd0b74Schristos } 199175fd0b74Schristos | sizedposnumexpr '-' sizednumexpr 199275fd0b74Schristos { 199375fd0b74Schristos $$.val = $1.val - $3.val; 199475fd0b74Schristos $$.dword = $1.dword || $3.dword; 199575fd0b74Schristos } 199675fd0b74Schristos | sizedposnumexpr '&' sizednumexpr 199775fd0b74Schristos { 199875fd0b74Schristos $$.val = $1.val & $3.val; 199975fd0b74Schristos $$.dword = $1.dword || $3.dword; 200075fd0b74Schristos } 200175fd0b74Schristos | sizedposnumexpr '^' sizednumexpr 200275fd0b74Schristos { 200375fd0b74Schristos $$.val = $1.val ^ $3.val; 200475fd0b74Schristos $$.dword = $1.dword || $3.dword; 200575fd0b74Schristos } 200675fd0b74Schristos | sizedposnumexpr '|' sizednumexpr 200775fd0b74Schristos { 200875fd0b74Schristos $$.val = $1.val | $3.val; 200975fd0b74Schristos $$.dword = $1.dword || $3.dword; 201075fd0b74Schristos } 201175fd0b74Schristos ; 201275fd0b74Schristos 201375fd0b74Schristos %% 201475fd0b74Schristos 201575fd0b74Schristos /* Set the language from the command line. */ 201675fd0b74Schristos 201775fd0b74Schristos void 201875fd0b74Schristos rcparse_set_language (int lang) 201975fd0b74Schristos { 202075fd0b74Schristos language = lang; 202175fd0b74Schristos } 2022