Home | History | Annotate | Line # | Download | only in binutils
rcparse.y revision 1.9
      1  1.1  christos %{ /* rcparse.y -- parser for Windows rc files
      2  1.9  christos    Copyright (C) 1997-2024 Free Software Foundation, Inc.
      3  1.1  christos    Written by Ian Lance Taylor, Cygnus Support.
      4  1.1  christos    Extended by Kai Tietz, Onevision.
      5  1.1  christos 
      6  1.1  christos    This file is part of GNU Binutils.
      7  1.1  christos 
      8  1.1  christos    This program is free software; you can redistribute it and/or modify
      9  1.1  christos    it under the terms of the GNU General Public License as published by
     10  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     11  1.1  christos    (at your option) any later version.
     12  1.1  christos 
     13  1.1  christos    This program is distributed in the hope that it will be useful,
     14  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  christos    GNU General Public License for more details.
     17  1.1  christos 
     18  1.1  christos    You should have received a copy of the GNU General Public License
     19  1.1  christos    along with this program; if not, write to the Free Software
     20  1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     21  1.1  christos    02110-1301, USA.  */
     22  1.1  christos 
     23  1.1  christos 
     24  1.1  christos /* This is a parser for Windows rc files.  It is based on the parser
     25  1.1  christos    by Gunther Ebert <gunther.ebert (at) ixos-leipzig.de>.  */
     26  1.1  christos 
     27  1.1  christos #include "sysdep.h"
     28  1.1  christos #include "bfd.h"
     29  1.1  christos #include "bucomm.h"
     30  1.1  christos #include "libiberty.h"
     31  1.1  christos #include "windres.h"
     32  1.1  christos #include "safe-ctype.h"
     33  1.1  christos 
     34  1.1  christos /* The current language.  */
     35  1.1  christos 
     36  1.1  christos static unsigned short language;
     37  1.1  christos 
     38  1.1  christos /* The resource information during a sub statement.  */
     39  1.1  christos 
     40  1.1  christos static rc_res_res_info sub_res_info;
     41  1.1  christos 
     42  1.1  christos /* Dialog information.  This is built by the nonterminals styles and
     43  1.1  christos    controls.  */
     44  1.1  christos 
     45  1.1  christos static rc_dialog dialog;
     46  1.1  christos 
     47  1.1  christos /* This is used when building a style.  It is modified by the
     48  1.1  christos    nonterminal styleexpr.  */
     49  1.1  christos 
     50  1.1  christos static unsigned long style;
     51  1.1  christos 
     52  1.1  christos /* These are used when building a control.  They are set before using
     53  1.1  christos    control_params.  */
     54  1.1  christos 
     55  1.1  christos static rc_uint_type base_style;
     56  1.1  christos static rc_uint_type default_style;
     57  1.1  christos static rc_res_id class;
     58  1.1  christos static rc_res_id res_text_field;
     59  1.1  christos static unichar null_unichar;
     60  1.1  christos 
     61  1.1  christos /* This is used for COMBOBOX, LISTBOX and EDITTEXT which
     62  1.1  christos    do not allow resource 'text' field in control definition. */
     63  1.1  christos static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
     64  1.1  christos 
     65  1.1  christos %}
     66  1.1  christos 
     67  1.1  christos %union
     68  1.1  christos {
     69  1.1  christos   rc_accelerator acc;
     70  1.1  christos   rc_accelerator *pacc;
     71  1.1  christos   rc_dialog_control *dialog_control;
     72  1.1  christos   rc_menuitem *menuitem;
     73  1.1  christos   struct
     74  1.1  christos   {
     75  1.1  christos     rc_rcdata_item *first;
     76  1.1  christos     rc_rcdata_item *last;
     77  1.1  christos   } rcdata;
     78  1.1  christos   rc_rcdata_item *rcdata_item;
     79  1.1  christos   rc_fixed_versioninfo *fixver;
     80  1.1  christos   rc_ver_info *verinfo;
     81  1.1  christos   rc_ver_stringtable *verstringtable;
     82  1.1  christos   rc_ver_stringinfo *verstring;
     83  1.1  christos   rc_ver_varinfo *vervar;
     84  1.1  christos   rc_toolbar_item *toobar_item;
     85  1.1  christos   rc_res_id id;
     86  1.1  christos   rc_res_res_info res_info;
     87  1.1  christos   struct
     88  1.1  christos   {
     89  1.1  christos     rc_uint_type on;
     90  1.1  christos     rc_uint_type off;
     91  1.1  christos   } memflags;
     92  1.1  christos   struct
     93  1.1  christos   {
     94  1.1  christos     rc_uint_type val;
     95  1.1  christos     /* Nonzero if this number was explicitly specified as long.  */
     96  1.1  christos     int dword;
     97  1.1  christos   } i;
     98  1.1  christos   rc_uint_type il;
     99  1.1  christos   rc_uint_type is;
    100  1.1  christos   const char *s;
    101  1.1  christos   struct
    102  1.1  christos   {
    103  1.1  christos     rc_uint_type length;
    104  1.1  christos     const char *s;
    105  1.1  christos   } ss;
    106  1.1  christos   unichar *uni;
    107  1.1  christos   struct
    108  1.1  christos   {
    109  1.1  christos     rc_uint_type length;
    110  1.1  christos     const unichar *s;
    111  1.1  christos   } suni;
    112  1.1  christos };
    113  1.1  christos 
    114  1.1  christos %token BEG END
    115  1.1  christos %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
    116  1.1  christos %token BITMAP
    117  1.1  christos %token CURSOR
    118  1.1  christos %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE
    119  1.1  christos %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT
    120  1.1  christos %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON
    121  1.1  christos %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON
    122  1.1  christos %token BEDIT HEDIT IEDIT
    123  1.1  christos %token FONT
    124  1.1  christos %token ICON
    125  1.1  christos %token ANICURSOR ANIICON DLGINCLUDE DLGINIT FONTDIR HTML MANIFEST PLUGPLAY VXD TOOLBAR BUTTON
    126  1.1  christos %token LANGUAGE CHARACTERISTICS VERSIONK
    127  1.8  christos %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE OWNERDRAW
    128  1.1  christos %token MENUBARBREAK MENUBREAK
    129  1.1  christos %token MESSAGETABLE
    130  1.1  christos %token RCDATA
    131  1.1  christos %token STRINGTABLE
    132  1.1  christos %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS
    133  1.1  christos %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO
    134  1.1  christos %token VALUE
    135  1.1  christos %token <s> BLOCK
    136  1.1  christos %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE
    137  1.1  christos %token NOT
    138  1.1  christos %token <uni> QUOTEDUNISTRING
    139  1.1  christos %token <s> QUOTEDSTRING STRING
    140  1.1  christos %token <i> NUMBER
    141  1.1  christos %token <suni> SIZEDUNISTRING
    142  1.1  christos %token <ss> SIZEDSTRING
    143  1.1  christos %token IGNORED_TOKEN
    144  1.1  christos 
    145  1.1  christos %type <pacc> acc_entries
    146  1.1  christos %type <acc> acc_entry acc_event
    147  1.1  christos %type <dialog_control> control control_params
    148  1.1  christos %type <menuitem> menuitems menuitem menuexitems menuexitem
    149  1.1  christos %type <rcdata> optrcdata_data optrcdata_data_int rcdata_data
    150  1.1  christos %type <rcdata_item> opt_control_data
    151  1.1  christos %type <fixver> fixedverinfo
    152  1.1  christos %type <verinfo> verblocks
    153  1.1  christos %type <verstringtable> verstringtables
    154  1.1  christos %type <verstring> vervals
    155  1.1  christos %type <vervar> vertrans
    156  1.1  christos %type <toobar_item> toolbar_data
    157  1.1  christos %type <res_info> suboptions memflags_move_discard memflags_move
    158  1.1  christos %type <memflags> memflag
    159  1.1  christos %type <id> id rcdata_id optresidc resref resid cresid
    160  1.1  christos %type <il> exstyle parennumber
    161  1.1  christos %type <il> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr
    162  1.1  christos %type <is> acc_options acc_option menuitem_flags menuitem_flag
    163  1.1  christos %type <s> file_name
    164  1.1  christos %type <uni> res_unicode_string resname res_unicode_string_concat
    165  1.1  christos %type <ss> sizedstring
    166  1.1  christos %type <suni> sizedunistring res_unicode_sizedstring res_unicode_sizedstring_concat
    167  1.1  christos %type <i> sizednumexpr sizedposnumexpr
    168  1.1  christos 
    169  1.1  christos %left '|'
    170  1.1  christos %left '^'
    171  1.1  christos %left '&'
    172  1.1  christos %left '+' '-'
    173  1.1  christos %left '*' '/' '%'
    174  1.1  christos %right '~' NEG
    175  1.1  christos 
    176  1.1  christos %%
    177  1.1  christos 
    178  1.1  christos input:
    179  1.1  christos 	  /* empty */
    180  1.1  christos 	| input accelerator
    181  1.1  christos 	| input bitmap
    182  1.1  christos 	| input cursor
    183  1.1  christos 	| input dialog
    184  1.1  christos 	| input font
    185  1.1  christos 	| input icon
    186  1.1  christos 	| input language
    187  1.1  christos 	| input menu
    188  1.1  christos 	| input menuex
    189  1.1  christos 	| input messagetable
    190  1.1  christos 	| input stringtable
    191  1.1  christos 	| input toolbar
    192  1.1  christos 	| input user
    193  1.1  christos 	| input versioninfo
    194  1.1  christos 	| input IGNORED_TOKEN
    195  1.1  christos 	;
    196  1.1  christos 
    197  1.1  christos /* Accelerator resources.  */
    198  1.1  christos 
    199  1.1  christos accelerator:
    200  1.1  christos 	  id ACCELERATORS suboptions BEG acc_entries END
    201  1.1  christos 	  {
    202  1.1  christos 	    define_accelerator ($1, &$3, $5);
    203  1.1  christos 	    if (yychar != YYEMPTY)
    204  1.1  christos 	      YYERROR;
    205  1.1  christos 	    rcparse_discard_strings ();
    206  1.1  christos 	  }
    207  1.1  christos 	;
    208  1.1  christos 
    209  1.1  christos acc_entries:
    210  1.1  christos 	  /* empty */
    211  1.1  christos 	  {
    212  1.1  christos 	    $$ = NULL;
    213  1.1  christos 	  }
    214  1.1  christos 	| acc_entries acc_entry
    215  1.1  christos 	  {
    216  1.1  christos 	    rc_accelerator *a;
    217  1.1  christos 
    218  1.1  christos 	    a = (rc_accelerator *) res_alloc (sizeof *a);
    219  1.1  christos 	    *a = $2;
    220  1.1  christos 	    if ($1 == NULL)
    221  1.1  christos 	      $$ = a;
    222  1.1  christos 	    else
    223  1.1  christos 	      {
    224  1.1  christos 		rc_accelerator **pp;
    225  1.1  christos 
    226  1.1  christos 		for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
    227  1.1  christos 		  ;
    228  1.1  christos 		*pp = a;
    229  1.1  christos 		$$ = $1;
    230  1.1  christos 	      }
    231  1.1  christos 	  }
    232  1.1  christos 	;
    233  1.1  christos 
    234  1.1  christos acc_entry:
    235  1.1  christos 	  acc_event cposnumexpr
    236  1.1  christos 	  {
    237  1.1  christos 	    $$ = $1;
    238  1.1  christos 	    $$.id = $2;
    239  1.1  christos 	  }
    240  1.1  christos 	| acc_event cposnumexpr ',' acc_options
    241  1.1  christos 	  {
    242  1.1  christos 	    $$ = $1;
    243  1.1  christos 	    $$.id = $2;
    244  1.1  christos 	    $$.flags |= $4;
    245  1.1  christos 	    if (($$.flags & ACC_VIRTKEY) == 0
    246  1.1  christos 		&& ($$.flags & (ACC_SHIFT | ACC_CONTROL)) != 0)
    247  1.1  christos 	      rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
    248  1.1  christos 	  }
    249  1.1  christos 	;
    250  1.1  christos 
    251  1.1  christos acc_event:
    252  1.1  christos 	  QUOTEDSTRING
    253  1.1  christos 	  {
    254  1.1  christos 	    const char *s = $1;
    255  1.1  christos 	    char ch;
    256  1.1  christos 
    257  1.1  christos 	    $$.next = NULL;
    258  1.1  christos 	    $$.id = 0;
    259  1.1  christos 	    ch = *s;
    260  1.1  christos 	    if (ch != '^')
    261  1.1  christos 	      $$.flags = 0;
    262  1.1  christos 	    else
    263  1.1  christos 	      {
    264  1.1  christos 		$$.flags = ACC_CONTROL | ACC_VIRTKEY;
    265  1.1  christos 		++s;
    266  1.1  christos 		ch = TOUPPER (s[0]);
    267  1.1  christos 	      }
    268  1.1  christos 	    $$.key = ch;
    269  1.1  christos 	    if (s[1] != '\0')
    270  1.1  christos 	      rcparse_warning (_("accelerator should only be one character"));
    271  1.1  christos 	  }
    272  1.1  christos 	| posnumexpr
    273  1.1  christos 	  {
    274  1.1  christos 	    $$.next = NULL;
    275  1.1  christos 	    $$.flags = 0;
    276  1.1  christos 	    $$.id = 0;
    277  1.1  christos 	    $$.key = $1;
    278  1.1  christos 	  }
    279  1.1  christos 	;
    280  1.1  christos 
    281  1.1  christos acc_options:
    282  1.1  christos 	  acc_option
    283  1.1  christos 	  {
    284  1.1  christos 	    $$ = $1;
    285  1.1  christos 	  }
    286  1.1  christos 	| acc_options ',' acc_option
    287  1.1  christos 	  {
    288  1.1  christos 	    $$ = $1 | $3;
    289  1.1  christos 	  }
    290  1.1  christos 	/* I've had one report that the comma is optional.  */
    291  1.1  christos 	| acc_options acc_option
    292  1.1  christos 	  {
    293  1.1  christos 	    $$ = $1 | $2;
    294  1.1  christos 	  }
    295  1.1  christos 	;
    296  1.1  christos 
    297  1.1  christos acc_option:
    298  1.1  christos 	  VIRTKEY
    299  1.1  christos 	  {
    300  1.1  christos 	    $$ = ACC_VIRTKEY;
    301  1.1  christos 	  }
    302  1.1  christos 	| ASCII
    303  1.1  christos 	  {
    304  1.1  christos 	    /* This is just the absence of VIRTKEY.  */
    305  1.1  christos 	    $$ = 0;
    306  1.1  christos 	  }
    307  1.1  christos 	| NOINVERT
    308  1.1  christos 	  {
    309  1.1  christos 	    $$ = ACC_NOINVERT;
    310  1.1  christos 	  }
    311  1.1  christos 	| SHIFT
    312  1.1  christos 	  {
    313  1.1  christos 	    $$ = ACC_SHIFT;
    314  1.1  christos 	  }
    315  1.1  christos 	| CONTROL
    316  1.1  christos 	  {
    317  1.1  christos 	    $$ = ACC_CONTROL;
    318  1.1  christos 	  }
    319  1.1  christos 	| ALT
    320  1.1  christos 	  {
    321  1.1  christos 	    $$ = ACC_ALT;
    322  1.1  christos 	  }
    323  1.1  christos 	;
    324  1.1  christos 
    325  1.1  christos /* Bitmap resources.  */
    326  1.1  christos 
    327  1.1  christos bitmap:
    328  1.1  christos 	  id BITMAP memflags_move file_name
    329  1.1  christos 	  {
    330  1.1  christos 	    define_bitmap ($1, &$3, $4);
    331  1.1  christos 	    if (yychar != YYEMPTY)
    332  1.1  christos 	      YYERROR;
    333  1.1  christos 	    rcparse_discard_strings ();
    334  1.1  christos 	  }
    335  1.1  christos 	;
    336  1.1  christos 
    337  1.1  christos /* Cursor resources.  */
    338  1.1  christos 
    339  1.1  christos cursor:
    340  1.1  christos 	  id CURSOR memflags_move_discard file_name
    341  1.1  christos 	  {
    342  1.1  christos 	    define_cursor ($1, &$3, $4);
    343  1.1  christos 	    if (yychar != YYEMPTY)
    344  1.1  christos 	      YYERROR;
    345  1.1  christos 	    rcparse_discard_strings ();
    346  1.1  christos 	  }
    347  1.1  christos 	;
    348  1.1  christos 
    349  1.1  christos /* Dialog resources.  */
    350  1.1  christos 
    351  1.1  christos dialog:
    352  1.1  christos 	  id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr
    353  1.1  christos 	    cnumexpr
    354  1.1  christos 	    {
    355  1.1  christos 	      memset (&dialog, 0, sizeof dialog);
    356  1.1  christos 	      dialog.x = $5;
    357  1.1  christos 	      dialog.y = $6;
    358  1.1  christos 	      dialog.width = $7;
    359  1.1  christos 	      dialog.height = $8;
    360  1.1  christos 	      dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
    361  1.1  christos 	      dialog.exstyle = $4;
    362  1.1  christos 	      dialog.menu.named = 1;
    363  1.1  christos 	      dialog.class.named = 1;
    364  1.1  christos 	      dialog.font = NULL;
    365  1.1  christos 	      dialog.ex = NULL;
    366  1.1  christos 	      dialog.controls = NULL;
    367  1.1  christos 	      sub_res_info = $3;
    368  1.1  christos 	      style = 0;
    369  1.1  christos 	    }
    370  1.1  christos 	    styles BEG controls END
    371  1.1  christos 	  {
    372  1.1  christos 	    define_dialog ($1, &sub_res_info, &dialog);
    373  1.1  christos 	    if (yychar != YYEMPTY)
    374  1.1  christos 	      YYERROR;
    375  1.1  christos 	    rcparse_discard_strings ();
    376  1.1  christos 	  }
    377  1.1  christos 	| id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
    378  1.1  christos 	    cnumexpr
    379  1.1  christos 	    {
    380  1.1  christos 	      memset (&dialog, 0, sizeof dialog);
    381  1.1  christos 	      dialog.x = $5;
    382  1.1  christos 	      dialog.y = $6;
    383  1.1  christos 	      dialog.width = $7;
    384  1.1  christos 	      dialog.height = $8;
    385  1.1  christos 	      dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
    386  1.1  christos 	      dialog.exstyle = $4;
    387  1.1  christos 	      dialog.menu.named = 1;
    388  1.1  christos 	      dialog.class.named = 1;
    389  1.1  christos 	      dialog.font = NULL;
    390  1.1  christos 	      dialog.ex = ((rc_dialog_ex *)
    391  1.1  christos 			   res_alloc (sizeof (rc_dialog_ex)));
    392  1.1  christos 	      memset (dialog.ex, 0, sizeof (rc_dialog_ex));
    393  1.1  christos 	      dialog.controls = NULL;
    394  1.1  christos 	      sub_res_info = $3;
    395  1.1  christos 	      style = 0;
    396  1.1  christos 	    }
    397  1.1  christos 	    styles BEG controls END
    398  1.1  christos 	  {
    399  1.1  christos 	    define_dialog ($1, &sub_res_info, &dialog);
    400  1.1  christos 	    if (yychar != YYEMPTY)
    401  1.1  christos 	      YYERROR;
    402  1.1  christos 	    rcparse_discard_strings ();
    403  1.1  christos 	  }
    404  1.1  christos 	| id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
    405  1.1  christos 	    cnumexpr cnumexpr
    406  1.1  christos 	    {
    407  1.1  christos 	      memset (&dialog, 0, sizeof dialog);
    408  1.1  christos 	      dialog.x = $5;
    409  1.1  christos 	      dialog.y = $6;
    410  1.1  christos 	      dialog.width = $7;
    411  1.1  christos 	      dialog.height = $8;
    412  1.1  christos 	      dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
    413  1.1  christos 	      dialog.exstyle = $4;
    414  1.1  christos 	      dialog.menu.named = 1;
    415  1.1  christos 	      dialog.class.named = 1;
    416  1.1  christos 	      dialog.font = NULL;
    417  1.1  christos 	      dialog.ex = ((rc_dialog_ex *)
    418  1.1  christos 			   res_alloc (sizeof (rc_dialog_ex)));
    419  1.1  christos 	      memset (dialog.ex, 0, sizeof (rc_dialog_ex));
    420  1.1  christos 	      dialog.ex->help = $9;
    421  1.1  christos 	      dialog.controls = NULL;
    422  1.1  christos 	      sub_res_info = $3;
    423  1.1  christos 	      style = 0;
    424  1.1  christos 	    }
    425  1.1  christos 	    styles BEG controls END
    426  1.1  christos 	  {
    427  1.1  christos 	    define_dialog ($1, &sub_res_info, &dialog);
    428  1.1  christos 	    if (yychar != YYEMPTY)
    429  1.1  christos 	      YYERROR;
    430  1.1  christos 	    rcparse_discard_strings ();
    431  1.1  christos 	  }
    432  1.1  christos 	;
    433  1.1  christos 
    434  1.1  christos exstyle:
    435  1.1  christos 	  /* empty */
    436  1.1  christos 	  {
    437  1.1  christos 	    $$ = 0;
    438  1.1  christos 	  }
    439  1.1  christos 	| EXSTYLE '=' numexpr
    440  1.1  christos 	  {
    441  1.1  christos 	    $$ = $3;
    442  1.1  christos 	  }
    443  1.1  christos 	;
    444  1.1  christos 
    445  1.1  christos styles:
    446  1.1  christos 	  /* empty */
    447  1.1  christos 	| styles CAPTION res_unicode_string_concat
    448  1.1  christos 	  {
    449  1.1  christos 	    dialog.style |= WS_CAPTION;
    450  1.1  christos 	    style |= WS_CAPTION;
    451  1.1  christos 	    dialog.caption = $3;
    452  1.1  christos 	  }
    453  1.1  christos 	| styles CLASS id
    454  1.1  christos 	  {
    455  1.1  christos 	    dialog.class = $3;
    456  1.1  christos 	  }
    457  1.1  christos 	| styles STYLE
    458  1.1  christos 	    styleexpr
    459  1.1  christos 	  {
    460  1.1  christos 	    dialog.style = style;
    461  1.1  christos 	  }
    462  1.1  christos 	| styles EXSTYLE numexpr
    463  1.1  christos 	  {
    464  1.1  christos 	    dialog.exstyle = $3;
    465  1.1  christos 	  }
    466  1.1  christos 	| styles CLASS res_unicode_string_concat
    467  1.1  christos 	  {
    468  1.1  christos 	    res_unistring_to_id (& dialog.class, $3);
    469  1.1  christos 	  }
    470  1.1  christos 	| styles FONT numexpr ',' res_unicode_string_concat
    471  1.1  christos 	  {
    472  1.1  christos 	    dialog.style |= DS_SETFONT;
    473  1.1  christos 	    style |= DS_SETFONT;
    474  1.1  christos 	    dialog.pointsize = $3;
    475  1.1  christos 	    dialog.font = $5;
    476  1.1  christos 	    if (dialog.ex != NULL)
    477  1.1  christos 	      {
    478  1.1  christos 		dialog.ex->weight = 0;
    479  1.1  christos 		dialog.ex->italic = 0;
    480  1.1  christos 		dialog.ex->charset = 1;
    481  1.1  christos 	      }
    482  1.1  christos 	  }
    483  1.1  christos 	| styles FONT numexpr ',' res_unicode_string_concat cnumexpr
    484  1.1  christos 	  {
    485  1.1  christos 	    dialog.style |= DS_SETFONT;
    486  1.1  christos 	    style |= DS_SETFONT;
    487  1.1  christos 	    dialog.pointsize = $3;
    488  1.1  christos 	    dialog.font = $5;
    489  1.1  christos 	    if (dialog.ex == NULL)
    490  1.1  christos 	      rcparse_warning (_("extended FONT requires DIALOGEX"));
    491  1.1  christos 	    else
    492  1.1  christos 	      {
    493  1.1  christos 		dialog.ex->weight = $6;
    494  1.1  christos 		dialog.ex->italic = 0;
    495  1.1  christos 		dialog.ex->charset = 1;
    496  1.1  christos 	      }
    497  1.1  christos 	  }
    498  1.1  christos 	| styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr
    499  1.1  christos 	  {
    500  1.1  christos 	    dialog.style |= DS_SETFONT;
    501  1.1  christos 	    style |= DS_SETFONT;
    502  1.1  christos 	    dialog.pointsize = $3;
    503  1.1  christos 	    dialog.font = $5;
    504  1.1  christos 	    if (dialog.ex == NULL)
    505  1.1  christos 	      rcparse_warning (_("extended FONT requires DIALOGEX"));
    506  1.1  christos 	    else
    507  1.1  christos 	      {
    508  1.1  christos 		dialog.ex->weight = $6;
    509  1.1  christos 		dialog.ex->italic = $7;
    510  1.1  christos 		dialog.ex->charset = 1;
    511  1.1  christos 	      }
    512  1.1  christos 	  }
    513  1.1  christos 	| styles FONT numexpr ',' res_unicode_string_concat cnumexpr cnumexpr cnumexpr
    514  1.1  christos 	  {
    515  1.1  christos 	    dialog.style |= DS_SETFONT;
    516  1.1  christos 	    style |= DS_SETFONT;
    517  1.1  christos 	    dialog.pointsize = $3;
    518  1.1  christos 	    dialog.font = $5;
    519  1.1  christos 	    if (dialog.ex == NULL)
    520  1.1  christos 	      rcparse_warning (_("extended FONT requires DIALOGEX"));
    521  1.1  christos 	    else
    522  1.1  christos 	      {
    523  1.1  christos 		dialog.ex->weight = $6;
    524  1.1  christos 		dialog.ex->italic = $7;
    525  1.1  christos 		dialog.ex->charset = $8;
    526  1.1  christos 	      }
    527  1.1  christos 	  }
    528  1.1  christos 	| styles MENU id
    529  1.1  christos 	  {
    530  1.1  christos 	    dialog.menu = $3;
    531  1.1  christos 	  }
    532  1.1  christos 	| styles CHARACTERISTICS numexpr
    533  1.1  christos 	  {
    534  1.1  christos 	    sub_res_info.characteristics = $3;
    535  1.1  christos 	  }
    536  1.1  christos 	| styles LANGUAGE numexpr cnumexpr
    537  1.1  christos 	  {
    538  1.1  christos 	    sub_res_info.language = $3 | ($4 << SUBLANG_SHIFT);
    539  1.1  christos 	  }
    540  1.1  christos 	| styles VERSIONK numexpr
    541  1.1  christos 	  {
    542  1.1  christos 	    sub_res_info.version = $3;
    543  1.1  christos 	  }
    544  1.1  christos 	;
    545  1.1  christos 
    546  1.1  christos controls:
    547  1.1  christos 	  /* empty */
    548  1.1  christos 	| controls control
    549  1.1  christos 	  {
    550  1.1  christos 	    rc_dialog_control **pp;
    551  1.1  christos 
    552  1.1  christos 	    for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next)
    553  1.1  christos 	      ;
    554  1.1  christos 	    *pp = $2;
    555  1.1  christos 	  }
    556  1.1  christos 	;
    557  1.1  christos 
    558  1.1  christos control:
    559  1.1  christos 	  AUTO3STATE optresidc
    560  1.1  christos 	    {
    561  1.1  christos 	      default_style = BS_AUTO3STATE | WS_TABSTOP;
    562  1.1  christos 	      base_style = BS_AUTO3STATE;
    563  1.1  christos 	      class.named = 0;
    564  1.1  christos 	      class.u.id = CTL_BUTTON;
    565  1.3  christos 	      res_text_field = $2;
    566  1.1  christos 	    }
    567  1.1  christos 	    control_params
    568  1.1  christos 	  {
    569  1.1  christos 	    $$ = $4;
    570  1.1  christos 	  }
    571  1.1  christos 	| AUTOCHECKBOX optresidc
    572  1.1  christos 	    {
    573  1.1  christos 	      default_style = BS_AUTOCHECKBOX | WS_TABSTOP;
    574  1.8  christos 	      base_style = BS_AUTOCHECKBOX | WS_TABSTOP;
    575  1.1  christos 	      class.named = 0;
    576  1.1  christos 	      class.u.id = CTL_BUTTON;
    577  1.3  christos 	      res_text_field = $2;
    578  1.1  christos 	    }
    579  1.1  christos 	    control_params
    580  1.1  christos 	  {
    581  1.1  christos 	    $$ = $4;
    582  1.1  christos 	  }
    583  1.1  christos 	| AUTORADIOBUTTON optresidc
    584  1.1  christos 	    {
    585  1.1  christos 	      default_style = BS_AUTORADIOBUTTON | WS_TABSTOP;
    586  1.1  christos 	      base_style = BS_AUTORADIOBUTTON;
    587  1.1  christos 	      class.named = 0;
    588  1.1  christos 	      class.u.id = CTL_BUTTON;
    589  1.3  christos 	      res_text_field = $2;
    590  1.1  christos 	    }
    591  1.1  christos 	    control_params
    592  1.1  christos 	  {
    593  1.1  christos 	    $$ = $4;
    594  1.1  christos 	  }
    595  1.1  christos 	| BEDIT optresidc
    596  1.1  christos 	    {
    597  1.1  christos 	      default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    598  1.1  christos 	      base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    599  1.1  christos 	      class.named = 0;
    600  1.1  christos 	      class.u.id = CTL_EDIT;
    601  1.3  christos 	      res_text_field = $2;
    602  1.1  christos 	    }
    603  1.1  christos 	    control_params
    604  1.1  christos 	  {
    605  1.1  christos 	    $$ = $4;
    606  1.1  christos 	    if (dialog.ex == NULL)
    607  1.1  christos 	      rcparse_warning (_("BEDIT requires DIALOGEX"));
    608  1.1  christos 	    res_string_to_id (&$$->class, "BEDIT");
    609  1.1  christos 	  }
    610  1.1  christos 	| CHECKBOX optresidc
    611  1.1  christos 	    {
    612  1.1  christos 	      default_style = BS_CHECKBOX | WS_TABSTOP;
    613  1.1  christos 	      base_style = BS_CHECKBOX | WS_TABSTOP;
    614  1.1  christos 	      class.named = 0;
    615  1.1  christos 	      class.u.id = CTL_BUTTON;
    616  1.3  christos 	      res_text_field = $2;
    617  1.1  christos 	    }
    618  1.1  christos 	    control_params
    619  1.1  christos 	  {
    620  1.1  christos 	    $$ = $4;
    621  1.1  christos 	  }
    622  1.1  christos 	| COMBOBOX
    623  1.1  christos 	    {
    624  1.1  christos 	      /* This is as per MSDN documentation.  With some (???)
    625  1.1  christos 		 versions of MS rc.exe their is no default style.  */
    626  1.1  christos 	      default_style = CBS_SIMPLE | WS_TABSTOP;
    627  1.1  christos 	      base_style = 0;
    628  1.1  christos 	      class.named = 0;
    629  1.1  christos 	      class.u.id = CTL_COMBOBOX;
    630  1.3  christos 	      res_text_field = res_null_text;
    631  1.1  christos 	    }
    632  1.1  christos 	    control_params
    633  1.1  christos 	  {
    634  1.1  christos 	    $$ = $3;
    635  1.1  christos 	  }
    636  1.1  christos 	| CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
    637  1.1  christos 	    cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
    638  1.1  christos 	  {
    639  1.1  christos 	    $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
    640  1.1  christos 	    if ($11 != NULL)
    641  1.1  christos 	      {
    642  1.1  christos 		if (dialog.ex == NULL)
    643  1.1  christos 		  rcparse_warning (_("control data requires DIALOGEX"));
    644  1.1  christos 		$$->data = $11;
    645  1.1  christos 	      }
    646  1.1  christos 	  }
    647  1.1  christos 	| CONTROL optresidc numexpr cresid control_styleexpr cnumexpr
    648  1.1  christos 	    cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
    649  1.1  christos 	  {
    650  1.1  christos 	    $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
    651  1.1  christos 	    if (dialog.ex == NULL)
    652  1.1  christos 	      rcparse_warning (_("help ID requires DIALOGEX"));
    653  1.1  christos 	    $$->help = $11;
    654  1.1  christos 	    $$->data = $12;
    655  1.1  christos 	  }
    656  1.1  christos 	| CTEXT optresidc
    657  1.1  christos 	    {
    658  1.1  christos 	      default_style = SS_CENTER | WS_GROUP;
    659  1.1  christos 	      base_style = SS_CENTER;
    660  1.1  christos 	      class.named = 0;
    661  1.1  christos 	      class.u.id = CTL_STATIC;
    662  1.3  christos 	      res_text_field = $2;
    663  1.1  christos 	    }
    664  1.1  christos 	    control_params
    665  1.1  christos 	  {
    666  1.1  christos 	    $$ = $4;
    667  1.1  christos 	  }
    668  1.1  christos 	| DEFPUSHBUTTON optresidc
    669  1.1  christos 	    {
    670  1.1  christos 	      default_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
    671  1.1  christos 	      base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
    672  1.1  christos 	      class.named = 0;
    673  1.1  christos 	      class.u.id = CTL_BUTTON;
    674  1.3  christos 	      res_text_field = $2;
    675  1.1  christos 	    }
    676  1.1  christos 	    control_params
    677  1.1  christos 	  {
    678  1.1  christos 	    $$ = $4;
    679  1.1  christos 	  }
    680  1.1  christos 	| EDITTEXT
    681  1.1  christos 	    {
    682  1.1  christos 	      default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    683  1.1  christos 	      base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    684  1.1  christos 	      class.named = 0;
    685  1.1  christos 	      class.u.id = CTL_EDIT;
    686  1.3  christos 	      res_text_field = res_null_text;
    687  1.1  christos 	    }
    688  1.1  christos 	    control_params
    689  1.1  christos 	  {
    690  1.1  christos 	    $$ = $3;
    691  1.1  christos 	  }
    692  1.1  christos 	| GROUPBOX optresidc
    693  1.1  christos 	    {
    694  1.1  christos 	      default_style = BS_GROUPBOX;
    695  1.1  christos 	      base_style = BS_GROUPBOX;
    696  1.1  christos 	      class.named = 0;
    697  1.1  christos 	      class.u.id = CTL_BUTTON;
    698  1.3  christos 	      res_text_field = $2;
    699  1.1  christos 	    }
    700  1.1  christos 	    control_params
    701  1.1  christos 	  {
    702  1.1  christos 	    $$ = $4;
    703  1.1  christos 	  }
    704  1.1  christos 	| HEDIT optresidc
    705  1.1  christos 	    {
    706  1.1  christos 	      default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    707  1.1  christos 	      base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    708  1.1  christos 	      class.named = 0;
    709  1.1  christos 	      class.u.id = CTL_EDIT;
    710  1.3  christos 	      res_text_field = $2;
    711  1.1  christos 	    }
    712  1.1  christos 	    control_params
    713  1.1  christos 	  {
    714  1.1  christos 	    $$ = $4;
    715  1.1  christos 	    if (dialog.ex == NULL)
    716  1.1  christos 	      rcparse_warning (_("IEDIT requires DIALOGEX"));
    717  1.1  christos 	    res_string_to_id (&$$->class, "HEDIT");
    718  1.1  christos 	  }
    719  1.1  christos 	| ICON resref numexpr cnumexpr cnumexpr opt_control_data
    720  1.1  christos           {
    721  1.1  christos 	    $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $6,
    722  1.1  christos 				      dialog.ex);
    723  1.1  christos           }
    724  1.1  christos 	| ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
    725  1.1  christos 	    opt_control_data
    726  1.1  christos           {
    727  1.1  christos 	    $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $8,
    728  1.1  christos 				      dialog.ex);
    729  1.1  christos           }
    730  1.1  christos 	| ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
    731  1.1  christos 	    icon_styleexpr optcnumexpr opt_control_data
    732  1.1  christos           {
    733  1.1  christos 	    $$ = define_icon_control ($2, $3, $4, $5, style, $9, 0, $10,
    734  1.1  christos 				      dialog.ex);
    735  1.1  christos           }
    736  1.1  christos 	| ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
    737  1.1  christos 	    icon_styleexpr cnumexpr cnumexpr opt_control_data
    738  1.1  christos           {
    739  1.1  christos 	    $$ = define_icon_control ($2, $3, $4, $5, style, $9, $10, $11,
    740  1.1  christos 				      dialog.ex);
    741  1.1  christos           }
    742  1.1  christos 	| IEDIT optresidc
    743  1.1  christos 	    {
    744  1.1  christos 	      default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    745  1.1  christos 	      base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
    746  1.1  christos 	      class.named = 0;
    747  1.1  christos 	      class.u.id = CTL_EDIT;
    748  1.3  christos 	      res_text_field = $2;
    749  1.1  christos 	    }
    750  1.1  christos 	    control_params
    751  1.1  christos 	  {
    752  1.1  christos 	    $$ = $4;
    753  1.1  christos 	    if (dialog.ex == NULL)
    754  1.1  christos 	      rcparse_warning (_("IEDIT requires DIALOGEX"));
    755  1.1  christos 	    res_string_to_id (&$$->class, "IEDIT");
    756  1.1  christos 	  }
    757  1.1  christos 	| LISTBOX
    758  1.1  christos 	    {
    759  1.1  christos 	      default_style = LBS_NOTIFY | WS_BORDER;
    760  1.1  christos 	      base_style = LBS_NOTIFY | WS_BORDER;
    761  1.1  christos 	      class.named = 0;
    762  1.1  christos 	      class.u.id = CTL_LISTBOX;
    763  1.3  christos 	      res_text_field = res_null_text;
    764  1.1  christos 	    }
    765  1.1  christos 	    control_params
    766  1.1  christos 	  {
    767  1.1  christos 	    $$ = $3;
    768  1.1  christos 	  }
    769  1.1  christos 	| LTEXT optresidc
    770  1.1  christos 	    {
    771  1.1  christos 	      default_style = SS_LEFT | WS_GROUP;
    772  1.1  christos 	      base_style = SS_LEFT;
    773  1.1  christos 	      class.named = 0;
    774  1.1  christos 	      class.u.id = CTL_STATIC;
    775  1.3  christos 	      res_text_field = $2;
    776  1.1  christos 	    }
    777  1.1  christos 	    control_params
    778  1.1  christos 	  {
    779  1.1  christos 	    $$ = $4;
    780  1.1  christos 	  }
    781  1.1  christos 	| PUSHBOX optresidc
    782  1.1  christos 	    {
    783  1.1  christos 	      default_style = BS_PUSHBOX | WS_TABSTOP;
    784  1.1  christos 	      base_style = BS_PUSHBOX;
    785  1.1  christos 	      class.named = 0;
    786  1.1  christos 	      class.u.id = CTL_BUTTON;
    787  1.1  christos 	    }
    788  1.1  christos 	    control_params
    789  1.1  christos 	  {
    790  1.1  christos 	    $$ = $4;
    791  1.1  christos 	  }
    792  1.1  christos 	| PUSHBUTTON optresidc
    793  1.1  christos 	    {
    794  1.1  christos 	      default_style = BS_PUSHBUTTON | WS_TABSTOP;
    795  1.1  christos 	      base_style = BS_PUSHBUTTON | WS_TABSTOP;
    796  1.1  christos 	      class.named = 0;
    797  1.1  christos 	      class.u.id = CTL_BUTTON;
    798  1.3  christos 	      res_text_field = $2;
    799  1.1  christos 	    }
    800  1.1  christos 	    control_params
    801  1.1  christos 	  {
    802  1.1  christos 	    $$ = $4;
    803  1.1  christos 	  }
    804  1.1  christos 	| RADIOBUTTON optresidc
    805  1.1  christos 	    {
    806  1.1  christos 	      default_style = BS_RADIOBUTTON | WS_TABSTOP;
    807  1.1  christos 	      base_style = BS_RADIOBUTTON;
    808  1.1  christos 	      class.named = 0;
    809  1.1  christos 	      class.u.id = CTL_BUTTON;
    810  1.3  christos 	      res_text_field = $2;
    811  1.1  christos 	    }
    812  1.1  christos 	    control_params
    813  1.1  christos 	  {
    814  1.1  christos 	    $$ = $4;
    815  1.1  christos 	  }
    816  1.1  christos 	| RTEXT optresidc
    817  1.1  christos 	    {
    818  1.1  christos 	      default_style = SS_RIGHT | WS_GROUP;
    819  1.1  christos 	      base_style = SS_RIGHT;
    820  1.1  christos 	      class.named = 0;
    821  1.1  christos 	      class.u.id = CTL_STATIC;
    822  1.3  christos 	      res_text_field = $2;
    823  1.1  christos 	    }
    824  1.1  christos 	    control_params
    825  1.1  christos 	  {
    826  1.1  christos 	    $$ = $4;
    827  1.1  christos 	  }
    828  1.1  christos 	| SCROLLBAR
    829  1.1  christos 	    {
    830  1.1  christos 	      default_style = SBS_HORZ;
    831  1.1  christos 	      base_style = 0;
    832  1.1  christos 	      class.named = 0;
    833  1.1  christos 	      class.u.id = CTL_SCROLLBAR;
    834  1.3  christos 	      res_text_field = res_null_text;
    835  1.1  christos 	    }
    836  1.1  christos 	    control_params
    837  1.1  christos 	  {
    838  1.1  christos 	    $$ = $3;
    839  1.1  christos 	  }
    840  1.1  christos 	| STATE3 optresidc
    841  1.1  christos 	    {
    842  1.1  christos 	      default_style = BS_3STATE | WS_TABSTOP;
    843  1.1  christos 	      base_style = BS_3STATE;
    844  1.1  christos 	      class.named = 0;
    845  1.1  christos 	      class.u.id = CTL_BUTTON;
    846  1.3  christos 	      res_text_field = $2;
    847  1.1  christos 	    }
    848  1.1  christos 	    control_params
    849  1.1  christos 	  {
    850  1.1  christos 	    $$ = $4;
    851  1.1  christos 	  }
    852  1.1  christos 	| USERBUTTON resref numexpr ',' numexpr ',' numexpr ','
    853  1.3  christos 	    numexpr ',' numexpr ','
    854  1.1  christos 	    { style = WS_CHILD | WS_VISIBLE; }
    855  1.1  christos 	    styleexpr optcnumexpr
    856  1.1  christos 	  {
    857  1.1  christos 	    rc_res_id cid;
    858  1.1  christos 	    cid.named = 0;
    859  1.1  christos 	    cid.u.id = CTL_BUTTON;
    860  1.1  christos 	    $$ = define_control ($2, $3, $5, $7, $9, $11, cid,
    861  1.1  christos 				 style, $15);
    862  1.1  christos 	  }
    863  1.1  christos 	;
    864  1.1  christos 
    865  1.1  christos /* Parameters for a control.  The static variables DEFAULT_STYLE,
    866  1.1  christos    BASE_STYLE, and CLASS must be initialized before this nonterminal
    867  1.1  christos    is used.  DEFAULT_STYLE is the style to use if no style expression
    868  1.1  christos    is specified.  BASE_STYLE is the base style to use if a style
    869  1.1  christos    expression is specified; the style expression modifies the base
    870  1.1  christos    style.  CLASS is the class of the control.  */
    871  1.1  christos 
    872  1.1  christos control_params:
    873  1.1  christos 	  numexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
    874  1.1  christos 	  {
    875  1.1  christos 	    $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class,
    876  1.1  christos 				 default_style | WS_CHILD | WS_VISIBLE, 0);
    877  1.1  christos 	    if ($6 != NULL)
    878  1.1  christos 	      {
    879  1.1  christos 		if (dialog.ex == NULL)
    880  1.1  christos 		  rcparse_warning (_("control data requires DIALOGEX"));
    881  1.1  christos 		$$->data = $6;
    882  1.1  christos 	      }
    883  1.1  christos 	  }
    884  1.1  christos 	| numexpr cnumexpr cnumexpr cnumexpr cnumexpr
    885  1.1  christos 	    control_params_styleexpr optcnumexpr opt_control_data
    886  1.1  christos 	  {
    887  1.1  christos 	    $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
    888  1.1  christos 	    if ($8 != NULL)
    889  1.1  christos 	      {
    890  1.1  christos 		if (dialog.ex == NULL)
    891  1.1  christos 		  rcparse_warning (_("control data requires DIALOGEX"));
    892  1.1  christos 		$$->data = $8;
    893  1.1  christos 	      }
    894  1.1  christos 	  }
    895  1.1  christos 	| numexpr cnumexpr cnumexpr cnumexpr cnumexpr
    896  1.1  christos 	    control_params_styleexpr cnumexpr cnumexpr opt_control_data
    897  1.1  christos 	  {
    898  1.1  christos 	    $$ = define_control (res_text_field, $1, $2, $3, $4, $5, class, style, $7);
    899  1.1  christos 	    if (dialog.ex == NULL)
    900  1.1  christos 	      rcparse_warning (_("help ID requires DIALOGEX"));
    901  1.1  christos 	    $$->help = $8;
    902  1.1  christos 	    $$->data = $9;
    903  1.1  christos 	  }
    904  1.1  christos 	;
    905  1.1  christos 
    906  1.1  christos cresid:
    907  1.1  christos 	  ',' resid
    908  1.1  christos 	  {
    909  1.1  christos 	    if ($2.named)
    910  1.1  christos 	      res_unistring_to_id (&$$, $2.u.n.name);
    911  1.1  christos 	    else
    912  1.1  christos 	      $$=$2;
    913  1.1  christos 	  }
    914  1.1  christos 	;
    915  1.1  christos 
    916  1.1  christos optresidc:
    917  1.1  christos 	  /* empty */
    918  1.1  christos 	  {
    919  1.1  christos 	    res_string_to_id (&$$, "");
    920  1.1  christos 	  }
    921  1.1  christos 	| resid ',' { $$=$1; }
    922  1.1  christos 	;
    923  1.1  christos 
    924  1.1  christos resid:
    925  1.1  christos 	  posnumexpr
    926  1.1  christos 	  {
    927  1.1  christos 	    $$.named = 0;
    928  1.1  christos 	    $$.u.id = $1;
    929  1.1  christos 	  }
    930  1.1  christos 	| res_unicode_string_concat
    931  1.1  christos 	  {
    932  1.1  christos 	    $$.named = 1;
    933  1.1  christos 	    $$.u.n.name = $1;
    934  1.1  christos 	    $$.u.n.length = unichar_len ($1);
    935  1.1  christos 	  }
    936  1.1  christos 	;
    937  1.1  christos 
    938  1.1  christos opt_control_data:
    939  1.1  christos 	  /* empty */
    940  1.1  christos 	  {
    941  1.1  christos 	    $$ = NULL;
    942  1.1  christos 	  }
    943  1.1  christos 	| BEG optrcdata_data END
    944  1.1  christos 	  {
    945  1.1  christos 	    $$ = $2.first;
    946  1.1  christos 	  }
    947  1.1  christos 	;
    948  1.1  christos 
    949  1.1  christos /* These only exist to parse a reduction out of a common case.  */
    950  1.1  christos 
    951  1.1  christos control_styleexpr:
    952  1.1  christos 	  ','
    953  1.1  christos 	  { style = WS_CHILD | WS_VISIBLE; }
    954  1.1  christos 	  styleexpr
    955  1.1  christos 	;
    956  1.1  christos 
    957  1.1  christos icon_styleexpr:
    958  1.1  christos 	  ','
    959  1.1  christos 	  { style = SS_ICON | WS_CHILD | WS_VISIBLE; }
    960  1.1  christos 	  styleexpr
    961  1.1  christos 	;
    962  1.1  christos 
    963  1.1  christos control_params_styleexpr:
    964  1.1  christos 	  ','
    965  1.1  christos 	  { style = base_style | WS_CHILD | WS_VISIBLE; }
    966  1.1  christos 	  styleexpr
    967  1.1  christos 	;
    968  1.1  christos 
    969  1.1  christos /* Font resources.  */
    970  1.1  christos 
    971  1.1  christos font:
    972  1.1  christos 	  id FONT memflags_move_discard file_name
    973  1.1  christos 	  {
    974  1.1  christos 	    define_font ($1, &$3, $4);
    975  1.1  christos 	    if (yychar != YYEMPTY)
    976  1.1  christos 	      YYERROR;
    977  1.1  christos 	    rcparse_discard_strings ();
    978  1.1  christos 	  }
    979  1.1  christos 	;
    980  1.1  christos 
    981  1.1  christos /* Icon resources.  */
    982  1.1  christos 
    983  1.1  christos icon:
    984  1.1  christos 	  id ICON memflags_move_discard file_name
    985  1.1  christos 	  {
    986  1.1  christos 	    define_icon ($1, &$3, $4);
    987  1.1  christos 	    if (yychar != YYEMPTY)
    988  1.1  christos 	      YYERROR;
    989  1.1  christos 	    rcparse_discard_strings ();
    990  1.1  christos 	  }
    991  1.1  christos 	;
    992  1.1  christos 
    993  1.1  christos /* Language command.  This changes the static variable language, which
    994  1.1  christos    affects all subsequent resources.  */
    995  1.1  christos 
    996  1.1  christos language:
    997  1.1  christos 	  LANGUAGE numexpr cnumexpr
    998  1.1  christos 	  {
    999  1.1  christos 	    language = $2 | ($3 << SUBLANG_SHIFT);
   1000  1.1  christos 	  }
   1001  1.1  christos 	;
   1002  1.1  christos 
   1003  1.1  christos /* Menu resources.  */
   1004  1.1  christos 
   1005  1.1  christos menu:
   1006  1.1  christos 	  id MENU suboptions BEG menuitems END
   1007  1.1  christos 	  {
   1008  1.1  christos 	    define_menu ($1, &$3, $5);
   1009  1.1  christos 	    if (yychar != YYEMPTY)
   1010  1.1  christos 	      YYERROR;
   1011  1.1  christos 	    rcparse_discard_strings ();
   1012  1.1  christos 	  }
   1013  1.1  christos 	;
   1014  1.1  christos 
   1015  1.1  christos menuitems:
   1016  1.1  christos 	  /* empty */
   1017  1.1  christos 	  {
   1018  1.1  christos 	    $$ = NULL;
   1019  1.1  christos 	  }
   1020  1.1  christos 	| menuitems menuitem
   1021  1.1  christos 	  {
   1022  1.1  christos 	    if ($1 == NULL)
   1023  1.1  christos 	      $$ = $2;
   1024  1.1  christos 	    else
   1025  1.1  christos 	      {
   1026  1.1  christos 		rc_menuitem **pp;
   1027  1.1  christos 
   1028  1.1  christos 		for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
   1029  1.1  christos 		  ;
   1030  1.1  christos 		*pp = $2;
   1031  1.1  christos 		$$ = $1;
   1032  1.1  christos 	      }
   1033  1.1  christos 	  }
   1034  1.1  christos 	;
   1035  1.1  christos 
   1036  1.1  christos menuitem:
   1037  1.1  christos 	  MENUITEM res_unicode_string_concat cnumexpr menuitem_flags
   1038  1.1  christos 	  {
   1039  1.1  christos 	    $$ = define_menuitem ($2, $3, $4, 0, 0, NULL);
   1040  1.1  christos 	  }
   1041  1.1  christos 	| MENUITEM SEPARATOR
   1042  1.1  christos 	  {
   1043  1.1  christos 	    $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
   1044  1.1  christos 	  }
   1045  1.1  christos 	| POPUP res_unicode_string_concat menuitem_flags BEG menuitems END
   1046  1.1  christos 	  {
   1047  1.1  christos 	    $$ = define_menuitem ($2, 0, $3, 0, 0, $5);
   1048  1.1  christos 	  }
   1049  1.1  christos 	;
   1050  1.1  christos 
   1051  1.1  christos menuitem_flags:
   1052  1.1  christos 	  /* empty */
   1053  1.1  christos 	  {
   1054  1.1  christos 	    $$ = 0;
   1055  1.1  christos 	  }
   1056  1.1  christos 	| menuitem_flags ',' menuitem_flag
   1057  1.1  christos 	  {
   1058  1.1  christos 	    $$ = $1 | $3;
   1059  1.1  christos 	  }
   1060  1.1  christos 	| menuitem_flags menuitem_flag
   1061  1.1  christos 	  {
   1062  1.1  christos 	    $$ = $1 | $2;
   1063  1.1  christos 	  }
   1064  1.1  christos 	;
   1065  1.1  christos 
   1066  1.1  christos menuitem_flag:
   1067  1.1  christos 	  CHECKED
   1068  1.1  christos 	  {
   1069  1.1  christos 	    $$ = MENUITEM_CHECKED;
   1070  1.1  christos 	  }
   1071  1.1  christos 	| GRAYED
   1072  1.1  christos 	  {
   1073  1.1  christos 	    $$ = MENUITEM_GRAYED;
   1074  1.1  christos 	  }
   1075  1.1  christos 	| HELP
   1076  1.1  christos 	  {
   1077  1.1  christos 	    $$ = MENUITEM_HELP;
   1078  1.1  christos 	  }
   1079  1.1  christos 	| INACTIVE
   1080  1.1  christos 	  {
   1081  1.1  christos 	    $$ = MENUITEM_INACTIVE;
   1082  1.1  christos 	  }
   1083  1.1  christos 	| MENUBARBREAK
   1084  1.1  christos 	  {
   1085  1.1  christos 	    $$ = MENUITEM_MENUBARBREAK;
   1086  1.1  christos 	  }
   1087  1.1  christos 	| MENUBREAK
   1088  1.1  christos 	  {
   1089  1.1  christos 	    $$ = MENUITEM_MENUBREAK;
   1090  1.1  christos 	  }
   1091  1.8  christos 	| BITMAP
   1092  1.8  christos 	  {
   1093  1.8  christos 	    $$ = MENUITEM_BITMAP;
   1094  1.8  christos 	  }
   1095  1.8  christos 	| OWNERDRAW
   1096  1.8  christos 	  {
   1097  1.8  christos 	    $$ = MENUITEM_OWNERDRAW;
   1098  1.8  christos 	  }
   1099  1.1  christos 	;
   1100  1.1  christos 
   1101  1.1  christos /* Menuex resources.  */
   1102  1.1  christos 
   1103  1.1  christos menuex:
   1104  1.1  christos 	  id MENUEX suboptions BEG menuexitems END
   1105  1.1  christos 	  {
   1106  1.1  christos 	    define_menu ($1, &$3, $5);
   1107  1.1  christos 	    if (yychar != YYEMPTY)
   1108  1.1  christos 	      YYERROR;
   1109  1.1  christos 	    rcparse_discard_strings ();
   1110  1.1  christos 	  }
   1111  1.1  christos 	;
   1112  1.1  christos 
   1113  1.1  christos menuexitems:
   1114  1.1  christos 	  /* empty */
   1115  1.1  christos 	  {
   1116  1.1  christos 	    $$ = NULL;
   1117  1.1  christos 	  }
   1118  1.1  christos 	| menuexitems menuexitem
   1119  1.1  christos 	  {
   1120  1.1  christos 	    if ($1 == NULL)
   1121  1.1  christos 	      $$ = $2;
   1122  1.1  christos 	    else
   1123  1.1  christos 	      {
   1124  1.1  christos 		rc_menuitem **pp;
   1125  1.1  christos 
   1126  1.1  christos 		for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
   1127  1.1  christos 		  ;
   1128  1.1  christos 		*pp = $2;
   1129  1.1  christos 		$$ = $1;
   1130  1.1  christos 	      }
   1131  1.1  christos 	  }
   1132  1.1  christos 	;
   1133  1.1  christos 
   1134  1.1  christos menuexitem:
   1135  1.1  christos 	  MENUITEM res_unicode_string_concat
   1136  1.1  christos 	  {
   1137  1.1  christos 	    $$ = define_menuitem ($2, 0, 0, 0, 0, NULL);
   1138  1.1  christos 	  }
   1139  1.1  christos 	| MENUITEM res_unicode_string_concat cnumexpr
   1140  1.1  christos 	  {
   1141  1.1  christos 	    $$ = define_menuitem ($2, $3, 0, 0, 0, NULL);
   1142  1.1  christos 	  }
   1143  1.1  christos 	| MENUITEM res_unicode_string_concat cnumexpr cnumexpr optcnumexpr
   1144  1.1  christos 	  {
   1145  1.1  christos 	    $$ = define_menuitem ($2, $3, $4, $5, 0, NULL);
   1146  1.1  christos 	  }
   1147  1.1  christos  	| MENUITEM SEPARATOR
   1148  1.1  christos  	  {
   1149  1.1  christos  	    $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
   1150  1.1  christos  	  }
   1151  1.1  christos 	| POPUP res_unicode_string_concat BEG menuexitems END
   1152  1.1  christos 	  {
   1153  1.1  christos 	    $$ = define_menuitem ($2, 0, 0, 0, 0, $4);
   1154  1.1  christos 	  }
   1155  1.1  christos 	| POPUP res_unicode_string_concat cnumexpr BEG menuexitems END
   1156  1.1  christos 	  {
   1157  1.1  christos 	    $$ = define_menuitem ($2, $3, 0, 0, 0, $5);
   1158  1.1  christos 	  }
   1159  1.1  christos 	| POPUP res_unicode_string_concat cnumexpr cnumexpr BEG menuexitems END
   1160  1.1  christos 	  {
   1161  1.1  christos 	    $$ = define_menuitem ($2, $3, $4, 0, 0, $6);
   1162  1.1  christos 	  }
   1163  1.1  christos 	| POPUP res_unicode_string_concat cnumexpr cnumexpr cnumexpr optcnumexpr
   1164  1.1  christos 	    BEG menuexitems END
   1165  1.1  christos 	  {
   1166  1.1  christos 	    $$ = define_menuitem ($2, $3, $4, $5, $6, $8);
   1167  1.1  christos 	  }
   1168  1.1  christos 	;
   1169  1.1  christos 
   1170  1.1  christos /* Messagetable resources.  */
   1171  1.1  christos 
   1172  1.1  christos messagetable:
   1173  1.1  christos 	  id MESSAGETABLE memflags_move file_name
   1174  1.1  christos 	  {
   1175  1.1  christos 	    define_messagetable ($1, &$3, $4);
   1176  1.1  christos 	    if (yychar != YYEMPTY)
   1177  1.1  christos 	      YYERROR;
   1178  1.1  christos 	    rcparse_discard_strings ();
   1179  1.1  christos 	  }
   1180  1.1  christos 	;
   1181  1.1  christos 
   1182  1.1  christos /* We use a different lexing algorithm, because rcdata strings may
   1183  1.1  christos    contain embedded null bytes, and we need to know the length to use.  */
   1184  1.1  christos 
   1185  1.1  christos optrcdata_data:
   1186  1.1  christos 	  {
   1187  1.1  christos 	    rcparse_rcdata ();
   1188  1.1  christos 	  }
   1189  1.1  christos 	  optrcdata_data_int
   1190  1.1  christos 	  {
   1191  1.1  christos 	    rcparse_normal ();
   1192  1.1  christos 	    $$ = $2;
   1193  1.1  christos 	  }
   1194  1.1  christos 	;
   1195  1.1  christos 
   1196  1.1  christos optrcdata_data_int:
   1197  1.1  christos 	  /* empty */
   1198  1.1  christos 	  {
   1199  1.1  christos 	    $$.first = NULL;
   1200  1.1  christos 	    $$.last = NULL;
   1201  1.1  christos 	  }
   1202  1.1  christos 	| rcdata_data
   1203  1.1  christos 	  {
   1204  1.1  christos 	    $$ = $1;
   1205  1.1  christos 	  }
   1206  1.1  christos 	;
   1207  1.1  christos 
   1208  1.1  christos rcdata_data:
   1209  1.1  christos 	  sizedstring
   1210  1.1  christos 	  {
   1211  1.1  christos 	    rc_rcdata_item *ri;
   1212  1.1  christos 
   1213  1.1  christos 	    ri = define_rcdata_string ($1.s, $1.length);
   1214  1.1  christos 	    $$.first = ri;
   1215  1.1  christos 	    $$.last = ri;
   1216  1.1  christos 	  }
   1217  1.1  christos 	| sizedunistring
   1218  1.1  christos 	  {
   1219  1.1  christos 	    rc_rcdata_item *ri;
   1220  1.1  christos 
   1221  1.1  christos 	    ri = define_rcdata_unistring ($1.s, $1.length);
   1222  1.1  christos 	    $$.first = ri;
   1223  1.1  christos 	    $$.last = ri;
   1224  1.1  christos 	  }
   1225  1.1  christos 	| sizednumexpr
   1226  1.1  christos 	  {
   1227  1.1  christos 	    rc_rcdata_item *ri;
   1228  1.1  christos 
   1229  1.1  christos 	    ri = define_rcdata_number ($1.val, $1.dword);
   1230  1.1  christos 	    $$.first = ri;
   1231  1.1  christos 	    $$.last = ri;
   1232  1.1  christos 	  }
   1233  1.1  christos 	| rcdata_data ',' sizedstring
   1234  1.1  christos 	  {
   1235  1.1  christos 	    rc_rcdata_item *ri;
   1236  1.1  christos 
   1237  1.1  christos 	    ri = define_rcdata_string ($3.s, $3.length);
   1238  1.1  christos 	    $$.first = $1.first;
   1239  1.1  christos 	    $1.last->next = ri;
   1240  1.1  christos 	    $$.last = ri;
   1241  1.1  christos 	  }
   1242  1.1  christos 	| rcdata_data ',' sizedunistring
   1243  1.1  christos 	  {
   1244  1.1  christos 	    rc_rcdata_item *ri;
   1245  1.1  christos 
   1246  1.1  christos 	    ri = define_rcdata_unistring ($3.s, $3.length);
   1247  1.1  christos 	    $$.first = $1.first;
   1248  1.1  christos 	    $1.last->next = ri;
   1249  1.1  christos 	    $$.last = ri;
   1250  1.1  christos 	  }
   1251  1.1  christos 	| rcdata_data ',' sizednumexpr
   1252  1.1  christos 	  {
   1253  1.1  christos 	    rc_rcdata_item *ri;
   1254  1.1  christos 
   1255  1.1  christos 	    ri = define_rcdata_number ($3.val, $3.dword);
   1256  1.1  christos 	    $$.first = $1.first;
   1257  1.1  christos 	    $1.last->next = ri;
   1258  1.1  christos 	    $$.last = ri;
   1259  1.1  christos 	  }
   1260  1.1  christos 	| rcdata_data ','
   1261  1.1  christos 	  {
   1262  1.1  christos 	    $$=$1;
   1263  1.1  christos 	  }
   1264  1.1  christos 	;
   1265  1.1  christos 
   1266  1.1  christos /* Stringtable resources.  */
   1267  1.1  christos 
   1268  1.1  christos stringtable:
   1269  1.3  christos 	  STRINGTABLE suboptions BEG
   1270  1.1  christos 	    { sub_res_info = $2; rcparse_rcdata (); }
   1271  1.1  christos 	    string_data END { rcparse_normal (); }
   1272  1.1  christos 	;
   1273  1.1  christos 
   1274  1.1  christos string_data:
   1275  1.1  christos 	  /* empty */
   1276  1.1  christos 	| string_data numexpr res_unicode_sizedstring_concat
   1277  1.1  christos 	  {
   1278  1.1  christos 	    define_stringtable (&sub_res_info, $2, $3.s, $3.length);
   1279  1.1  christos 	    rcparse_discard_strings ();
   1280  1.1  christos 	  }
   1281  1.1  christos 	| string_data numexpr ',' res_unicode_sizedstring_concat
   1282  1.1  christos 	  {
   1283  1.1  christos 	    define_stringtable (&sub_res_info, $2, $4.s, $4.length);
   1284  1.1  christos 	    rcparse_discard_strings ();
   1285  1.1  christos 	  }
   1286  1.1  christos 	| string_data error
   1287  1.1  christos 	  {
   1288  1.1  christos 	    rcparse_warning (_("invalid stringtable resource."));
   1289  1.1  christos 	    abort ();
   1290  1.1  christos 	  }
   1291  1.1  christos 	;
   1292  1.1  christos 
   1293  1.1  christos rcdata_id:
   1294  1.1  christos 	id
   1295  1.1  christos 	  {
   1296  1.1  christos 	    $$=$1;
   1297  1.1  christos 	  }
   1298  1.1  christos       | HTML
   1299  1.1  christos 	{
   1300  1.1  christos 	  $$.named = 0;
   1301  1.1  christos 	  $$.u.id = 23;
   1302  1.1  christos 	}
   1303  1.1  christos       | RCDATA
   1304  1.1  christos         {
   1305  1.1  christos           $$.named = 0;
   1306  1.1  christos           $$.u.id = RT_RCDATA;
   1307  1.1  christos         }
   1308  1.1  christos       | MANIFEST
   1309  1.1  christos         {
   1310  1.1  christos           $$.named = 0;
   1311  1.1  christos           $$.u.id = RT_MANIFEST;
   1312  1.1  christos         }
   1313  1.1  christos       | PLUGPLAY
   1314  1.1  christos         {
   1315  1.1  christos           $$.named = 0;
   1316  1.1  christos           $$.u.id = RT_PLUGPLAY;
   1317  1.1  christos         }
   1318  1.1  christos       | VXD
   1319  1.1  christos         {
   1320  1.1  christos           $$.named = 0;
   1321  1.1  christos           $$.u.id = RT_VXD;
   1322  1.1  christos         }
   1323  1.1  christos       | DLGINCLUDE
   1324  1.1  christos         {
   1325  1.1  christos           $$.named = 0;
   1326  1.1  christos           $$.u.id = RT_DLGINCLUDE;
   1327  1.1  christos         }
   1328  1.1  christos       | DLGINIT
   1329  1.1  christos         {
   1330  1.1  christos           $$.named = 0;
   1331  1.1  christos           $$.u.id = RT_DLGINIT;
   1332  1.1  christos         }
   1333  1.1  christos       | ANICURSOR
   1334  1.1  christos         {
   1335  1.1  christos           $$.named = 0;
   1336  1.1  christos           $$.u.id = RT_ANICURSOR;
   1337  1.1  christos         }
   1338  1.1  christos       | ANIICON
   1339  1.1  christos         {
   1340  1.1  christos           $$.named = 0;
   1341  1.1  christos           $$.u.id = RT_ANIICON;
   1342  1.1  christos         }
   1343  1.1  christos       ;
   1344  1.1  christos 
   1345  1.1  christos /* User defined resources.  We accept general suboptions in the
   1346  1.1  christos    file_name case to keep the parser happy.  */
   1347  1.1  christos 
   1348  1.1  christos user:
   1349  1.1  christos 	  id rcdata_id suboptions BEG optrcdata_data END
   1350  1.1  christos 	  {
   1351  1.1  christos 	    define_user_data ($1, $2, &$3, $5.first);
   1352  1.1  christos 	    if (yychar != YYEMPTY)
   1353  1.1  christos 	      YYERROR;
   1354  1.1  christos 	    rcparse_discard_strings ();
   1355  1.1  christos 	  }
   1356  1.1  christos 	| id rcdata_id suboptions file_name
   1357  1.1  christos 	  {
   1358  1.1  christos 	    define_user_file ($1, $2, &$3, $4);
   1359  1.1  christos 	    if (yychar != YYEMPTY)
   1360  1.1  christos 	      YYERROR;
   1361  1.1  christos 	    rcparse_discard_strings ();
   1362  1.1  christos 	  }
   1363  1.1  christos 	;
   1364  1.1  christos 
   1365  1.1  christos toolbar:
   1366  1.1  christos 	id TOOLBAR suboptions numexpr cnumexpr BEG toolbar_data END
   1367  1.1  christos 	{
   1368  1.1  christos 	  define_toolbar ($1, &$3, $4, $5, $7);
   1369  1.1  christos 	}
   1370  1.1  christos 	;
   1371  1.1  christos 
   1372  1.1  christos toolbar_data: /* empty */ { $$= NULL; }
   1373  1.1  christos 	| toolbar_data BUTTON id
   1374  1.1  christos 	{
   1375  1.1  christos 	  rc_toolbar_item *c,*n;
   1376  1.1  christos 	  c = $1;
   1377  1.1  christos 	  n= (rc_toolbar_item *)
   1378  1.1  christos 	      res_alloc (sizeof (rc_toolbar_item));
   1379  1.1  christos 	  if (c != NULL)
   1380  1.1  christos 	    while (c->next != NULL)
   1381  1.1  christos 	      c = c->next;
   1382  1.1  christos 	  n->prev = c;
   1383  1.1  christos 	  n->next = NULL;
   1384  1.1  christos 	  if (c != NULL)
   1385  1.1  christos 	    c->next = n;
   1386  1.1  christos 	  n->id = $3;
   1387  1.1  christos 	  if ($1 == NULL)
   1388  1.1  christos 	    $$ = n;
   1389  1.1  christos 	  else
   1390  1.1  christos 	    $$ = $1;
   1391  1.1  christos 	}
   1392  1.1  christos 	| toolbar_data SEPARATOR
   1393  1.1  christos 	{
   1394  1.1  christos 	  rc_toolbar_item *c,*n;
   1395  1.1  christos 	  c = $1;
   1396  1.1  christos 	  n= (rc_toolbar_item *)
   1397  1.1  christos 	      res_alloc (sizeof (rc_toolbar_item));
   1398  1.1  christos 	  if (c != NULL)
   1399  1.1  christos 	    while (c->next != NULL)
   1400  1.1  christos 	      c = c->next;
   1401  1.1  christos 	  n->prev = c;
   1402  1.1  christos 	  n->next = NULL;
   1403  1.1  christos 	  if (c != NULL)
   1404  1.1  christos 	    c->next = n;
   1405  1.1  christos 	  n->id.named = 0;
   1406  1.1  christos 	  n->id.u.id = 0;
   1407  1.1  christos 	  if ($1 == NULL)
   1408  1.1  christos 	    $$ = n;
   1409  1.1  christos 	  else
   1410  1.1  christos 	    $$ = $1;
   1411  1.1  christos 	}
   1412  1.1  christos 	;
   1413  1.1  christos 
   1414  1.1  christos /* Versioninfo resources.  */
   1415  1.1  christos 
   1416  1.1  christos versioninfo:
   1417  1.1  christos 	  id VERSIONINFO fixedverinfo BEG verblocks END
   1418  1.1  christos 	  {
   1419  1.1  christos 	    define_versioninfo ($1, language, $3, $5);
   1420  1.1  christos 	    if (yychar != YYEMPTY)
   1421  1.1  christos 	      YYERROR;
   1422  1.1  christos 	    rcparse_discard_strings ();
   1423  1.1  christos 	  }
   1424  1.1  christos 	;
   1425  1.1  christos 
   1426  1.1  christos fixedverinfo:
   1427  1.1  christos 	  /* empty */
   1428  1.1  christos 	  {
   1429  1.1  christos 	    $$ = ((rc_fixed_versioninfo *)
   1430  1.1  christos 		  res_alloc (sizeof (rc_fixed_versioninfo)));
   1431  1.1  christos 	    memset ($$, 0, sizeof (rc_fixed_versioninfo));
   1432  1.1  christos 	  }
   1433  1.3  christos 	| fixedverinfo FILEVERSION numexpr optcnumexpr optcnumexpr
   1434  1.3  christos 	  optcnumexpr
   1435  1.1  christos 	  {
   1436  1.3  christos 	    $1->file_version_ms = ($3 << 16) | ($4 & 0xffff);
   1437  1.3  christos 	    $1->file_version_ls = ($5 << 16) | ($6 & 0xffff);
   1438  1.1  christos 	    $$ = $1;
   1439  1.1  christos 	  }
   1440  1.3  christos 	| fixedverinfo PRODUCTVERSION numexpr optcnumexpr optcnumexpr
   1441  1.3  christos 	  optcnumexpr
   1442  1.1  christos 	  {
   1443  1.3  christos 	    $1->product_version_ms = ($3 << 16) | ($4 & 0xffff);
   1444  1.3  christos 	    $1->product_version_ls = ($5 << 16) | ($6 & 0xffff);
   1445  1.1  christos 	    $$ = $1;
   1446  1.1  christos 	  }
   1447  1.1  christos 	| fixedverinfo FILEFLAGSMASK numexpr
   1448  1.1  christos 	  {
   1449  1.1  christos 	    $1->file_flags_mask = $3;
   1450  1.1  christos 	    $$ = $1;
   1451  1.1  christos 	  }
   1452  1.1  christos 	| fixedverinfo FILEFLAGS numexpr
   1453  1.1  christos 	  {
   1454  1.1  christos 	    $1->file_flags = $3;
   1455  1.1  christos 	    $$ = $1;
   1456  1.1  christos 	  }
   1457  1.1  christos 	| fixedverinfo FILEOS numexpr
   1458  1.1  christos 	  {
   1459  1.1  christos 	    $1->file_os = $3;
   1460  1.1  christos 	    $$ = $1;
   1461  1.1  christos 	  }
   1462  1.1  christos 	| fixedverinfo FILETYPE numexpr
   1463  1.1  christos 	  {
   1464  1.1  christos 	    $1->file_type = $3;
   1465  1.1  christos 	    $$ = $1;
   1466  1.1  christos 	  }
   1467  1.1  christos 	| fixedverinfo FILESUBTYPE numexpr
   1468  1.1  christos 	  {
   1469  1.1  christos 	    $1->file_subtype = $3;
   1470  1.1  christos 	    $$ = $1;
   1471  1.1  christos 	  }
   1472  1.1  christos 	;
   1473  1.1  christos 
   1474  1.1  christos /* To handle verblocks successfully, the lexer handles BLOCK
   1475  1.1  christos    specially.  A BLOCK "StringFileInfo" is returned as
   1476  1.1  christos    BLOCKSTRINGFILEINFO.  A BLOCK "VarFileInfo" is returned as
   1477  1.1  christos    BLOCKVARFILEINFO.  A BLOCK with some other string returns BLOCK
   1478  1.1  christos    with the string as the value.  */
   1479  1.1  christos 
   1480  1.1  christos verblocks:
   1481  1.1  christos 	  /* empty */
   1482  1.1  christos 	  {
   1483  1.1  christos 	    $$ = NULL;
   1484  1.1  christos 	  }
   1485  1.1  christos 	| verblocks BLOCKSTRINGFILEINFO BEG verstringtables END
   1486  1.1  christos 	  {
   1487  1.1  christos 	    $$ = append_ver_stringfileinfo ($1, $4);
   1488  1.1  christos 	  }
   1489  1.1  christos 	| verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END
   1490  1.1  christos 	  {
   1491  1.1  christos 	    $$ = append_ver_varfileinfo ($1, $5, $6);
   1492  1.1  christos 	  }
   1493  1.1  christos 	;
   1494  1.1  christos 
   1495  1.1  christos verstringtables:
   1496  1.1  christos       /* empty */
   1497  1.1  christos 	  {
   1498  1.1  christos 	    $$ = NULL;
   1499  1.1  christos 	  }
   1500  1.1  christos 	| verstringtables BLOCK BEG vervals END
   1501  1.1  christos 	  {
   1502  1.1  christos 	    $$ = append_ver_stringtable ($1, $2, $4);
   1503  1.1  christos 	  }
   1504  1.1  christos 	;
   1505  1.1  christos 
   1506  1.1  christos vervals:
   1507  1.1  christos 	  /* empty */
   1508  1.1  christos 	  {
   1509  1.1  christos 	    $$ = NULL;
   1510  1.1  christos 	  }
   1511  1.1  christos 	| vervals VALUE res_unicode_string_concat ',' res_unicode_string_concat
   1512  1.1  christos 	  {
   1513  1.1  christos 	    $$ = append_verval ($1, $3, $5);
   1514  1.1  christos 	  }
   1515  1.1  christos 	;
   1516  1.1  christos 
   1517  1.1  christos vertrans:
   1518  1.1  christos 	  /* empty */
   1519  1.1  christos 	  {
   1520  1.1  christos 	    $$ = NULL;
   1521  1.1  christos 	  }
   1522  1.1  christos 	| vertrans cnumexpr cnumexpr
   1523  1.1  christos 	  {
   1524  1.1  christos 	    $$ = append_vertrans ($1, $2, $3);
   1525  1.1  christos 	  }
   1526  1.1  christos 	;
   1527  1.1  christos 
   1528  1.1  christos /* A resource ID.  */
   1529  1.1  christos 
   1530  1.1  christos id:
   1531  1.1  christos 	  posnumexpr
   1532  1.1  christos 	  {
   1533  1.1  christos 	    $$.named = 0;
   1534  1.1  christos 	    $$.u.id = $1;
   1535  1.1  christos 	  }
   1536  1.1  christos 	| resname
   1537  1.1  christos 	  {
   1538  1.1  christos 	    res_unistring_to_id (&$$, $1);
   1539  1.1  christos 	  }
   1540  1.1  christos 	;
   1541  1.1  christos 
   1542  1.1  christos /* A resource reference.  */
   1543  1.1  christos 
   1544  1.1  christos resname:
   1545  1.1  christos 	  res_unicode_string
   1546  1.1  christos 	  {
   1547  1.1  christos 	    $$ = $1;
   1548  1.1  christos 	  }
   1549  1.1  christos 	| STRING
   1550  1.1  christos 	  {
   1551  1.1  christos 	    unichar *h = NULL;
   1552  1.1  christos 	    unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
   1553  1.1  christos 	    $$ = h;
   1554  1.1  christos 	  }
   1555  1.1  christos 	;
   1556  1.1  christos 
   1557  1.1  christos 
   1558  1.1  christos resref:
   1559  1.1  christos 	  posnumexpr ','
   1560  1.1  christos 	  {
   1561  1.1  christos 	    $$.named = 0;
   1562  1.1  christos 	    $$.u.id = $1;
   1563  1.1  christos 	  }
   1564  1.1  christos 	| resname
   1565  1.1  christos 	  {
   1566  1.1  christos 	    res_unistring_to_id (&$$, $1);
   1567  1.1  christos 	  }
   1568  1.1  christos 	| resname ','
   1569  1.1  christos 	  {
   1570  1.1  christos 	    res_unistring_to_id (&$$, $1);
   1571  1.1  christos 	  }
   1572  1.1  christos 	;
   1573  1.1  christos 
   1574  1.1  christos /* Generic suboptions.  These may appear before the BEGIN in any
   1575  1.1  christos    multiline statement.  */
   1576  1.1  christos 
   1577  1.1  christos suboptions:
   1578  1.1  christos 	  /* empty */
   1579  1.1  christos 	  {
   1580  1.1  christos 	    memset (&$$, 0, sizeof (rc_res_res_info));
   1581  1.1  christos 	    $$.language = language;
   1582  1.1  christos 	    /* FIXME: Is this the right default?  */
   1583  1.1  christos 	    $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
   1584  1.1  christos 	  }
   1585  1.1  christos 	| suboptions memflag
   1586  1.1  christos 	  {
   1587  1.1  christos 	    $$ = $1;
   1588  1.1  christos 	    $$.memflags |= $2.on;
   1589  1.1  christos 	    $$.memflags &=~ $2.off;
   1590  1.1  christos 	  }
   1591  1.1  christos 	| suboptions CHARACTERISTICS numexpr
   1592  1.1  christos 	  {
   1593  1.1  christos 	    $$ = $1;
   1594  1.1  christos 	    $$.characteristics = $3;
   1595  1.1  christos 	  }
   1596  1.1  christos 	| suboptions LANGUAGE numexpr cnumexpr
   1597  1.1  christos 	  {
   1598  1.1  christos 	    $$ = $1;
   1599  1.1  christos 	    $$.language = $3 | ($4 << SUBLANG_SHIFT);
   1600  1.1  christos 	  }
   1601  1.1  christos 	| suboptions VERSIONK numexpr
   1602  1.1  christos 	  {
   1603  1.1  christos 	    $$ = $1;
   1604  1.1  christos 	    $$.version = $3;
   1605  1.1  christos 	  }
   1606  1.1  christos 	;
   1607  1.1  christos 
   1608  1.1  christos /* Memory flags which default to MOVEABLE and DISCARDABLE.  */
   1609  1.1  christos 
   1610  1.1  christos memflags_move_discard:
   1611  1.1  christos 	  /* empty */
   1612  1.1  christos 	  {
   1613  1.1  christos 	    memset (&$$, 0, sizeof (rc_res_res_info));
   1614  1.1  christos 	    $$.language = language;
   1615  1.1  christos 	    $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE;
   1616  1.1  christos 	  }
   1617  1.1  christos 	| memflags_move_discard memflag
   1618  1.1  christos 	  {
   1619  1.1  christos 	    $$ = $1;
   1620  1.1  christos 	    $$.memflags |= $2.on;
   1621  1.1  christos 	    $$.memflags &=~ $2.off;
   1622  1.1  christos 	  }
   1623  1.1  christos 	;
   1624  1.1  christos 
   1625  1.1  christos /* Memory flags which default to MOVEABLE.  */
   1626  1.1  christos 
   1627  1.1  christos memflags_move:
   1628  1.1  christos 	  /* empty */
   1629  1.1  christos 	  {
   1630  1.1  christos 	    memset (&$$, 0, sizeof (rc_res_res_info));
   1631  1.1  christos 	    $$.language = language;
   1632  1.1  christos 	    $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
   1633  1.1  christos 	  }
   1634  1.1  christos 	| memflags_move memflag
   1635  1.1  christos 	  {
   1636  1.1  christos 	    $$ = $1;
   1637  1.1  christos 	    $$.memflags |= $2.on;
   1638  1.1  christos 	    $$.memflags &=~ $2.off;
   1639  1.1  christos 	  }
   1640  1.1  christos 	;
   1641  1.1  christos 
   1642  1.1  christos /* Memory flags.  This returns a struct with two integers, because we
   1643  1.1  christos    sometimes want to set bits and we sometimes want to clear them.  */
   1644  1.1  christos 
   1645  1.1  christos memflag:
   1646  1.1  christos 	  MOVEABLE
   1647  1.1  christos 	  {
   1648  1.1  christos 	    $$.on = MEMFLAG_MOVEABLE;
   1649  1.1  christos 	    $$.off = 0;
   1650  1.1  christos 	  }
   1651  1.1  christos 	| FIXED
   1652  1.1  christos 	  {
   1653  1.1  christos 	    $$.on = 0;
   1654  1.1  christos 	    $$.off = MEMFLAG_MOVEABLE;
   1655  1.1  christos 	  }
   1656  1.1  christos 	| PURE
   1657  1.1  christos 	  {
   1658  1.1  christos 	    $$.on = MEMFLAG_PURE;
   1659  1.1  christos 	    $$.off = 0;
   1660  1.1  christos 	  }
   1661  1.1  christos 	| IMPURE
   1662  1.1  christos 	  {
   1663  1.1  christos 	    $$.on = 0;
   1664  1.1  christos 	    $$.off = MEMFLAG_PURE;
   1665  1.1  christos 	  }
   1666  1.1  christos 	| PRELOAD
   1667  1.1  christos 	  {
   1668  1.1  christos 	    $$.on = MEMFLAG_PRELOAD;
   1669  1.1  christos 	    $$.off = 0;
   1670  1.1  christos 	  }
   1671  1.1  christos 	| LOADONCALL
   1672  1.1  christos 	  {
   1673  1.1  christos 	    $$.on = 0;
   1674  1.1  christos 	    $$.off = MEMFLAG_PRELOAD;
   1675  1.1  christos 	  }
   1676  1.1  christos 	| DISCARDABLE
   1677  1.1  christos 	  {
   1678  1.1  christos 	    $$.on = MEMFLAG_DISCARDABLE;
   1679  1.1  christos 	    $$.off = 0;
   1680  1.1  christos 	  }
   1681  1.1  christos 	;
   1682  1.1  christos 
   1683  1.1  christos /* A file name.  */
   1684  1.1  christos 
   1685  1.1  christos file_name:
   1686  1.1  christos 	  QUOTEDSTRING
   1687  1.1  christos 	  {
   1688  1.1  christos 	    $$ = $1;
   1689  1.1  christos 	  }
   1690  1.1  christos 	| STRING
   1691  1.1  christos 	  {
   1692  1.1  christos 	    $$ = $1;
   1693  1.1  christos 	  }
   1694  1.1  christos 	;
   1695  1.1  christos 
   1696  1.1  christos /* Concat string */
   1697  1.1  christos res_unicode_string_concat:
   1698  1.1  christos 	  res_unicode_string
   1699  1.1  christos 	  {
   1700  1.1  christos 	    $$ = $1;
   1701  1.1  christos 	  }
   1702  1.1  christos 	|
   1703  1.1  christos 	  res_unicode_string_concat res_unicode_string
   1704  1.1  christos 	  {
   1705  1.1  christos 	    rc_uint_type l1 = unichar_len ($1);
   1706  1.1  christos 	    rc_uint_type l2 = unichar_len ($2);
   1707  1.1  christos 	    unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
   1708  1.1  christos 	    if (l1 != 0)
   1709  1.1  christos 	      memcpy (h, $1, l1 * sizeof (unichar));
   1710  1.1  christos 	    if (l2 != 0)
   1711  1.1  christos 	      memcpy (h + l1, $2, l2  * sizeof (unichar));
   1712  1.1  christos 	    h[l1 + l2] = 0;
   1713  1.1  christos 	    $$ = h;
   1714  1.1  christos 	  }
   1715  1.1  christos 	;
   1716  1.1  christos 
   1717  1.1  christos res_unicode_string:
   1718  1.1  christos 	  QUOTEDUNISTRING
   1719  1.1  christos 	  {
   1720  1.1  christos 	    $$ = unichar_dup ($1);
   1721  1.1  christos 	  }
   1722  1.1  christos 	| QUOTEDSTRING
   1723  1.1  christos 	  {
   1724  1.1  christos 	    unichar *h = NULL;
   1725  1.1  christos 	    unicode_from_ascii ((rc_uint_type *) NULL, &h, $1);
   1726  1.1  christos 	    $$ = h;
   1727  1.1  christos 	  }
   1728  1.1  christos 	;
   1729  1.1  christos 
   1730  1.1  christos res_unicode_sizedstring:
   1731  1.1  christos 	  sizedunistring
   1732  1.1  christos 	  {
   1733  1.1  christos 	    $$ = $1;
   1734  1.1  christos 	  }
   1735  1.1  christos 	| sizedstring
   1736  1.1  christos 	  {
   1737  1.1  christos 	    unichar *h = NULL;
   1738  1.1  christos 	    rc_uint_type l = 0;
   1739  1.1  christos 	    unicode_from_ascii_len (&l, &h, $1.s, $1.length);
   1740  1.1  christos 	    $$.s = h;
   1741  1.1  christos 	    $$.length = l;
   1742  1.1  christos 	  }
   1743  1.1  christos 	;
   1744  1.1  christos 
   1745  1.1  christos /* Concat string */
   1746  1.1  christos res_unicode_sizedstring_concat:
   1747  1.1  christos 	  res_unicode_sizedstring
   1748  1.1  christos 	  {
   1749  1.1  christos 	    $$ = $1;
   1750  1.1  christos 	  }
   1751  1.1  christos 	|
   1752  1.1  christos 	  res_unicode_sizedstring_concat res_unicode_sizedstring
   1753  1.1  christos 	  {
   1754  1.1  christos 	    rc_uint_type l1 = $1.length;
   1755  1.1  christos 	    rc_uint_type l2 = $2.length;
   1756  1.1  christos 	    unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
   1757  1.1  christos 	    if (l1 != 0)
   1758  1.1  christos 	      memcpy (h, $1.s, l1 * sizeof (unichar));
   1759  1.1  christos 	    if (l2 != 0)
   1760  1.1  christos 	      memcpy (h + l1, $2.s, l2  * sizeof (unichar));
   1761  1.1  christos 	    h[l1 + l2] = 0;
   1762  1.1  christos 	    $$.length = l1 + l2;
   1763  1.1  christos 	    $$.s = h;
   1764  1.1  christos 	  }
   1765  1.1  christos 	;
   1766  1.1  christos 
   1767  1.1  christos sizedstring:
   1768  1.1  christos 	  SIZEDSTRING
   1769  1.1  christos 	  {
   1770  1.1  christos 	    $$ = $1;
   1771  1.1  christos 	  }
   1772  1.1  christos 	| sizedstring SIZEDSTRING
   1773  1.1  christos 	  {
   1774  1.1  christos 	    rc_uint_type l = $1.length + $2.length;
   1775  1.1  christos 	    char *h = (char *) res_alloc (l);
   1776  1.1  christos 	    memcpy (h, $1.s, $1.length);
   1777  1.1  christos 	    memcpy (h + $1.length, $2.s, $2.length);
   1778  1.1  christos 	    $$.s = h;
   1779  1.1  christos 	    $$.length = l;
   1780  1.1  christos 	  }
   1781  1.1  christos 	;
   1782  1.1  christos 
   1783  1.1  christos sizedunistring:
   1784  1.1  christos 	  SIZEDUNISTRING
   1785  1.1  christos 	  {
   1786  1.1  christos 	    $$ = $1;
   1787  1.1  christos 	  }
   1788  1.1  christos 	| sizedunistring SIZEDUNISTRING
   1789  1.1  christos 	  {
   1790  1.1  christos 	    rc_uint_type l = $1.length + $2.length;
   1791  1.1  christos 	    unichar *h = (unichar *) res_alloc (l * sizeof (unichar));
   1792  1.1  christos 	    memcpy (h, $1.s, $1.length * sizeof (unichar));
   1793  1.1  christos 	    memcpy (h + $1.length, $2.s, $2.length  * sizeof (unichar));
   1794  1.1  christos 	    $$.s = h;
   1795  1.1  christos 	    $$.length = l;
   1796  1.1  christos 	  }
   1797  1.1  christos 	;
   1798  1.1  christos 
   1799  1.1  christos /* A style expression.  This changes the static variable STYLE.  We do
   1800  1.1  christos    it this way because rc appears to permit a style to be set to
   1801  1.1  christos    something like
   1802  1.1  christos        WS_GROUP | NOT WS_TABSTOP
   1803  1.1  christos    to mean that a default of WS_TABSTOP should be removed.  Anything
   1804  1.1  christos    which wants to accept a style must first set STYLE to the default
   1805  1.1  christos    value.  The styleexpr nonterminal will change STYLE as specified by
   1806  1.1  christos    the user.  Note that we do not accept arbitrary expressions here,
   1807  1.1  christos    just numbers separated by '|'.  */
   1808  1.1  christos 
   1809  1.1  christos styleexpr:
   1810  1.1  christos 	  parennumber
   1811  1.1  christos 	  {
   1812  1.1  christos 	    style |= $1;
   1813  1.1  christos 	  }
   1814  1.1  christos 	| NOT parennumber
   1815  1.1  christos 	  {
   1816  1.1  christos 	    style &=~ $2;
   1817  1.1  christos 	  }
   1818  1.1  christos 	| styleexpr '|' parennumber
   1819  1.1  christos 	  {
   1820  1.1  christos 	    style |= $3;
   1821  1.1  christos 	  }
   1822  1.1  christos 	| styleexpr '|' NOT parennumber
   1823  1.1  christos 	  {
   1824  1.1  christos 	    style &=~ $4;
   1825  1.1  christos 	  }
   1826  1.1  christos 	;
   1827  1.1  christos 
   1828  1.1  christos parennumber:
   1829  1.1  christos 	  NUMBER
   1830  1.1  christos 	  {
   1831  1.1  christos 	    $$ = $1.val;
   1832  1.1  christos 	  }
   1833  1.1  christos 	| '(' numexpr ')'
   1834  1.1  christos 	  {
   1835  1.1  christos 	    $$ = $2;
   1836  1.1  christos 	  }
   1837  1.1  christos 	;
   1838  1.1  christos 
   1839  1.1  christos /* An optional expression with a leading comma.  */
   1840  1.1  christos 
   1841  1.1  christos optcnumexpr:
   1842  1.1  christos 	  /* empty */
   1843  1.1  christos 	  {
   1844  1.1  christos 	    $$ = 0;
   1845  1.1  christos 	  }
   1846  1.1  christos 	| cnumexpr
   1847  1.1  christos 	  {
   1848  1.1  christos 	    $$ = $1;
   1849  1.1  christos 	  }
   1850  1.1  christos 	;
   1851  1.1  christos 
   1852  1.1  christos /* An expression with a leading comma.  */
   1853  1.1  christos 
   1854  1.1  christos cnumexpr:
   1855  1.1  christos 	  ',' numexpr
   1856  1.1  christos 	  {
   1857  1.1  christos 	    $$ = $2;
   1858  1.1  christos 	  }
   1859  1.1  christos 	;
   1860  1.1  christos 
   1861  1.1  christos /* A possibly negated numeric expression.  */
   1862  1.1  christos 
   1863  1.1  christos numexpr:
   1864  1.1  christos 	  sizednumexpr
   1865  1.1  christos 	  {
   1866  1.1  christos 	    $$ = $1.val;
   1867  1.1  christos 	  }
   1868  1.1  christos 	;
   1869  1.1  christos 
   1870  1.1  christos /* A possibly negated expression with a size.  */
   1871  1.1  christos 
   1872  1.1  christos sizednumexpr:
   1873  1.1  christos 	  NUMBER
   1874  1.1  christos 	  {
   1875  1.1  christos 	    $$ = $1;
   1876  1.1  christos 	  }
   1877  1.1  christos 	| '(' sizednumexpr ')'
   1878  1.1  christos 	  {
   1879  1.1  christos 	    $$ = $2;
   1880  1.1  christos 	  }
   1881  1.1  christos 	| '~' sizednumexpr %prec '~'
   1882  1.1  christos 	  {
   1883  1.1  christos 	    $$.val = ~ $2.val;
   1884  1.1  christos 	    $$.dword = $2.dword;
   1885  1.1  christos 	  }
   1886  1.1  christos 	| '-' sizednumexpr %prec NEG
   1887  1.1  christos 	  {
   1888  1.1  christos 	    $$.val = - $2.val;
   1889  1.1  christos 	    $$.dword = $2.dword;
   1890  1.1  christos 	  }
   1891  1.1  christos 	| sizednumexpr '*' sizednumexpr
   1892  1.1  christos 	  {
   1893  1.1  christos 	    $$.val = $1.val * $3.val;
   1894  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1895  1.1  christos 	  }
   1896  1.1  christos 	| sizednumexpr '/' sizednumexpr
   1897  1.1  christos 	  {
   1898  1.3  christos 	    $$.val = $1.val / ($3.val ? $3.val : 1);
   1899  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1900  1.1  christos 	  }
   1901  1.1  christos 	| sizednumexpr '%' sizednumexpr
   1902  1.1  christos 	  {
   1903  1.3  christos 	    $$.val = $1.val % ($3.val ? $3.val : 1);
   1904  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1905  1.1  christos 	  }
   1906  1.1  christos 	| sizednumexpr '+' sizednumexpr
   1907  1.1  christos 	  {
   1908  1.1  christos 	    $$.val = $1.val + $3.val;
   1909  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1910  1.1  christos 	  }
   1911  1.1  christos 	| sizednumexpr '-' sizednumexpr
   1912  1.1  christos 	  {
   1913  1.1  christos 	    $$.val = $1.val - $3.val;
   1914  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1915  1.1  christos 	  }
   1916  1.1  christos 	| sizednumexpr '&' sizednumexpr
   1917  1.1  christos 	  {
   1918  1.1  christos 	    $$.val = $1.val & $3.val;
   1919  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1920  1.1  christos 	  }
   1921  1.1  christos 	| sizednumexpr '^' sizednumexpr
   1922  1.1  christos 	  {
   1923  1.1  christos 	    $$.val = $1.val ^ $3.val;
   1924  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1925  1.1  christos 	  }
   1926  1.1  christos 	| sizednumexpr '|' sizednumexpr
   1927  1.1  christos 	  {
   1928  1.1  christos 	    $$.val = $1.val | $3.val;
   1929  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1930  1.1  christos 	  }
   1931  1.1  christos 	;
   1932  1.1  christos 
   1933  1.1  christos /* An expression with a leading comma which does not use unary
   1934  1.1  christos    negation.  */
   1935  1.1  christos 
   1936  1.1  christos cposnumexpr:
   1937  1.1  christos 	  ',' posnumexpr
   1938  1.1  christos 	  {
   1939  1.1  christos 	    $$ = $2;
   1940  1.1  christos 	  }
   1941  1.1  christos 	;
   1942  1.1  christos 
   1943  1.1  christos /* An expression which does not use unary negation.  */
   1944  1.1  christos 
   1945  1.1  christos posnumexpr:
   1946  1.1  christos 	  sizedposnumexpr
   1947  1.1  christos 	  {
   1948  1.1  christos 	    $$ = $1.val;
   1949  1.1  christos 	  }
   1950  1.1  christos 	;
   1951  1.1  christos 
   1952  1.1  christos /* An expression which does not use unary negation.  We separate unary
   1953  1.1  christos    negation to avoid parsing conflicts when two numeric expressions
   1954  1.1  christos    appear consecutively.  */
   1955  1.1  christos 
   1956  1.1  christos sizedposnumexpr:
   1957  1.1  christos 	  NUMBER
   1958  1.1  christos 	  {
   1959  1.1  christos 	    $$ = $1;
   1960  1.1  christos 	  }
   1961  1.1  christos 	| '(' sizednumexpr ')'
   1962  1.1  christos 	  {
   1963  1.1  christos 	    $$ = $2;
   1964  1.1  christos 	  }
   1965  1.1  christos 	| '~' sizednumexpr %prec '~'
   1966  1.1  christos 	  {
   1967  1.1  christos 	    $$.val = ~ $2.val;
   1968  1.1  christos 	    $$.dword = $2.dword;
   1969  1.1  christos 	  }
   1970  1.1  christos 	| sizedposnumexpr '*' sizednumexpr
   1971  1.1  christos 	  {
   1972  1.1  christos 	    $$.val = $1.val * $3.val;
   1973  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1974  1.1  christos 	  }
   1975  1.1  christos 	| sizedposnumexpr '/' sizednumexpr
   1976  1.1  christos 	  {
   1977  1.3  christos 	    $$.val = $1.val / ($3.val ? $3.val : 1);
   1978  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1979  1.1  christos 	  }
   1980  1.1  christos 	| sizedposnumexpr '%' sizednumexpr
   1981  1.1  christos 	  {
   1982  1.3  christos 	    /* PR 17512: file: 89105a25.  */
   1983  1.3  christos 	    $$.val = $1.val % ($3.val ? $3.val : 1);
   1984  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1985  1.1  christos 	  }
   1986  1.1  christos 	| sizedposnumexpr '+' sizednumexpr
   1987  1.1  christos 	  {
   1988  1.1  christos 	    $$.val = $1.val + $3.val;
   1989  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1990  1.1  christos 	  }
   1991  1.1  christos 	| sizedposnumexpr '-' sizednumexpr
   1992  1.1  christos 	  {
   1993  1.1  christos 	    $$.val = $1.val - $3.val;
   1994  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   1995  1.1  christos 	  }
   1996  1.1  christos 	| sizedposnumexpr '&' sizednumexpr
   1997  1.1  christos 	  {
   1998  1.1  christos 	    $$.val = $1.val & $3.val;
   1999  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   2000  1.1  christos 	  }
   2001  1.1  christos 	| sizedposnumexpr '^' sizednumexpr
   2002  1.1  christos 	  {
   2003  1.1  christos 	    $$.val = $1.val ^ $3.val;
   2004  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   2005  1.1  christos 	  }
   2006  1.1  christos 	| sizedposnumexpr '|' sizednumexpr
   2007  1.1  christos 	  {
   2008  1.1  christos 	    $$.val = $1.val | $3.val;
   2009  1.1  christos 	    $$.dword = $1.dword || $3.dword;
   2010  1.1  christos 	  }
   2011  1.1  christos 	;
   2012  1.1  christos 
   2013  1.1  christos %%
   2014  1.1  christos 
   2015  1.1  christos /* Set the language from the command line.  */
   2016  1.1  christos 
   2017  1.1  christos void
   2018  1.1  christos rcparse_set_language (int lang)
   2019  1.1  christos {
   2020  1.1  christos   language = lang;
   2021  1.1  christos }
   2022