xref: /netbsd-src/external/gpl3/binutils.old/dist/binutils/rcparse.y (revision e992f068c547fd6e84b3f104dc2340adcc955732)
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