1 %{ /* rcparse.y -- parser for Windows rc files
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 /* This is a parser for Windows rc files. It is based on the parser
23 by Gunther Ebert <gunther.ebert@ixos-leipzig.de>. */
27 #include "libiberty.h"
29 #include "safe-ctype.h"
31 /* The current language. */
33 static unsigned short language;
35 /* The resource information during a sub statement. */
37 static struct res_res_info sub_res_info;
39 /* Dialog information. This is built by the nonterminals styles and
42 static struct dialog dialog;
44 /* This is used when building a style. It is modified by the
45 nonterminal styleexpr. */
47 static unsigned long style;
49 /* These are used when building a control. They are set before using
52 static unsigned long base_style;
53 static unsigned long default_style;
54 static unsigned long class;
60 struct accelerator acc;
61 struct accelerator *pacc;
62 struct dialog_control *dialog_control;
63 struct menuitem *menuitem;
66 struct rcdata_item *first;
67 struct rcdata_item *last;
69 struct rcdata_item *rcdata_item;
70 struct stringtable_data *stringtable;
71 struct fixed_versioninfo *fixver;
72 struct ver_info *verinfo;
73 struct ver_stringinfo *verstring;
74 struct ver_varinfo *vervar;
76 struct res_res_info res_info;
85 /* Nonzero if this number was explicitly specified as long. */
99 %token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT
102 %token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE
103 %token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT
104 %token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON
105 %token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON
106 %token BEDIT HEDIT IEDIT
109 %token LANGUAGE CHARACTERISTICS VERSIONK
110 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE
111 %token MENUBARBREAK MENUBREAK
115 %token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS
116 %token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO
119 %token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE
121 %token <s> QUOTEDSTRING STRING
123 %token <ss> SIZEDSTRING
126 %type <pacc> acc_entries
127 %type <acc> acc_entry acc_event
128 %type <dialog_control> control control_params
129 %type <menuitem> menuitems menuitem menuexitems menuexitem
130 %type <rcdata> optrcdata_data optrcdata_data_int rcdata_data
131 %type <rcdata_item> opt_control_data
132 %type <fixver> fixedverinfo
133 %type <verinfo> verblocks
134 %type <verstring> vervals
135 %type <vervar> vertrans
136 %type <res_info> suboptions memflags_move_discard memflags_move
137 %type <memflags> memflag
139 %type <il> exstyle parennumber
140 %type <il> numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr
141 %type <is> acc_options acc_option menuitem_flags menuitem_flag
142 %type <s> optstringc file_name resname
143 %type <i> sizednumexpr sizedposnumexpr
156 | input newcmd accelerator
157 | input newcmd bitmap
158 | input newcmd cursor
159 | input newcmd dialog
162 | input newcmd language
164 | input newcmd menuex
165 | input newcmd messagetable
166 | input newcmd rcdata
167 | input newcmd stringtable
169 | input newcmd versioninfo
170 | input newcmd IGNORED_TOKEN
176 rcparse_discard_strings ();
180 /* Accelerator resources. */
183 id ACCELERATORS suboptions BEG acc_entries END
185 define_accelerator ($1, &$3, $5);
194 | acc_entries acc_entry
196 struct accelerator *a;
198 a = (struct accelerator *) res_alloc (sizeof *a);
204 struct accelerator **pp;
206 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
215 acc_event cposnumexpr
220 | acc_event cposnumexpr ',' acc_options
225 if (($$.flags & ACC_VIRTKEY) == 0
226 && ($$.flags & (ACC_SHIFT | ACC_CONTROL | ACC_ALT)) != 0)
227 rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
244 $$.flags = ACC_CONTROL | ACC_VIRTKEY;
251 rcparse_warning (_("accelerator should only be one character"));
267 | acc_options ',' acc_option
271 /* I've had one report that the comma is optional. */
272 | acc_options acc_option
285 /* This is just the absence of VIRTKEY. */
306 /* Bitmap resources. */
309 id BITMAP memflags_move file_name
311 define_bitmap ($1, &$3, $4);
315 /* Cursor resources. */
318 id CURSOR memflags_move_discard file_name
320 define_cursor ($1, &$3, $4);
324 /* Dialog resources. */
327 id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr
330 memset (&dialog, 0, sizeof dialog);
335 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
337 dialog.menu.named = 1;
338 dialog.class.named = 1;
341 dialog.controls = NULL;
345 styles BEG controls END
347 define_dialog ($1, &sub_res_info, &dialog);
349 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
352 memset (&dialog, 0, sizeof dialog);
357 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
359 dialog.menu.named = 1;
360 dialog.class.named = 1;
362 dialog.ex = ((struct dialog_ex *)
363 res_alloc (sizeof (struct dialog_ex)));
364 memset (dialog.ex, 0, sizeof (struct dialog_ex));
365 dialog.controls = NULL;
369 styles BEG controls END
371 define_dialog ($1, &sub_res_info, &dialog);
373 | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr
376 memset (&dialog, 0, sizeof dialog);
381 dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
383 dialog.menu.named = 1;
384 dialog.class.named = 1;
386 dialog.ex = ((struct dialog_ex *)
387 res_alloc (sizeof (struct dialog_ex)));
388 memset (dialog.ex, 0, sizeof (struct dialog_ex));
389 dialog.ex->help = $9;
390 dialog.controls = NULL;
394 styles BEG controls END
396 define_dialog ($1, &sub_res_info, &dialog);
405 | EXSTYLE '=' numexpr
413 | styles CAPTION QUOTEDSTRING
415 unicode_from_ascii ((int *) NULL, &dialog.caption, $3);
424 dialog.style = style;
426 | styles EXSTYLE numexpr
430 | styles CLASS QUOTEDSTRING
432 res_string_to_id (& dialog.class, $3);
434 | styles FONT numexpr ',' QUOTEDSTRING
436 dialog.style |= DS_SETFONT;
438 dialog.pointsize = $3;
439 unicode_from_ascii ((int *) NULL, &dialog.font, $5);
441 | styles FONT numexpr ',' QUOTEDSTRING cnumexpr cnumexpr
443 dialog.style |= DS_SETFONT;
445 dialog.pointsize = $3;
446 unicode_from_ascii ((int *) NULL, &dialog.font, $5);
447 if (dialog.ex == NULL)
448 rcparse_warning (_("extended FONT requires DIALOGEX"));
451 dialog.ex->weight = $6;
452 dialog.ex->italic = $7;
459 | styles CHARACTERISTICS numexpr
461 sub_res_info.characteristics = $3;
463 | styles LANGUAGE numexpr cnumexpr
465 sub_res_info.language = $3 | ($4 << SUBLANG_SHIFT);
467 | styles VERSIONK numexpr
469 sub_res_info.version = $3;
477 struct dialog_control **pp;
479 for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next)
488 default_style = BS_AUTO3STATE | WS_TABSTOP;
489 base_style = BS_AUTO3STATE;
498 default_style = BS_AUTOCHECKBOX | WS_TABSTOP;
499 base_style = BS_AUTOCHECKBOX;
508 default_style = BS_AUTORADIOBUTTON | WS_TABSTOP;
509 base_style = BS_AUTORADIOBUTTON;
518 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
519 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
525 if (dialog.ex == NULL)
526 rcparse_warning (_("BEDIT requires DIALOGEX"));
527 res_string_to_id (&$$->class, "BEDIT");
531 default_style = BS_CHECKBOX | WS_TABSTOP;
532 base_style = BS_CHECKBOX | WS_TABSTOP;
541 default_style = CBS_SIMPLE | WS_TABSTOP;
543 class = CTL_COMBOBOX;
549 | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr
550 cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
552 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
555 if (dialog.ex == NULL)
556 rcparse_warning (_("control data requires DIALOGEX"));
560 | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr
561 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
563 $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
564 if (dialog.ex == NULL)
565 rcparse_warning (_("help ID requires DIALOGEX"));
569 | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr
570 cnumexpr cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
572 $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11);
575 if (dialog.ex == NULL)
576 rcparse_warning ("control data requires DIALOGEX");
580 unicode_from_ascii (&$$->class.u.n.length, &$$->class.u.n.name, $5);
582 | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr
583 cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
585 $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11);
586 if (dialog.ex == NULL)
587 rcparse_warning ("help ID requires DIALOGEX");
591 unicode_from_ascii (&$$->class.u.n.length, &$$->class.u.n.name, $5);
595 default_style = SS_CENTER | WS_GROUP;
596 base_style = SS_CENTER;
605 default_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
606 base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
615 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
616 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
625 default_style = BS_GROUPBOX;
626 base_style = BS_GROUPBOX;
635 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
636 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
642 if (dialog.ex == NULL)
643 rcparse_warning (_("IEDIT requires DIALOGEX"));
644 res_string_to_id (&$$->class, "HEDIT");
646 | ICON resref numexpr cnumexpr cnumexpr opt_control_data
648 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $6,
651 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
654 $$ = define_icon_control ($2, $3, $4, $5, 0, 0, 0, $8,
657 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
658 icon_styleexpr optcnumexpr opt_control_data
660 $$ = define_icon_control ($2, $3, $4, $5, style, $9, 0, $10,
663 | ICON resref numexpr cnumexpr cnumexpr cnumexpr cnumexpr
664 icon_styleexpr cnumexpr cnumexpr opt_control_data
666 $$ = define_icon_control ($2, $3, $4, $5, style, $9, $10, $11,
671 default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
672 base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
678 if (dialog.ex == NULL)
679 rcparse_warning (_("IEDIT requires DIALOGEX"));
680 res_string_to_id (&$$->class, "IEDIT");
684 default_style = LBS_NOTIFY | WS_BORDER;
685 base_style = LBS_NOTIFY | WS_BORDER;
694 default_style = SS_LEFT | WS_GROUP;
695 base_style = SS_LEFT;
704 default_style = BS_PUSHBOX | WS_TABSTOP;
705 base_style = BS_PUSHBOX;
714 default_style = BS_PUSHBUTTON | WS_TABSTOP;
715 base_style = BS_PUSHBUTTON | WS_TABSTOP;
724 default_style = BS_RADIOBUTTON | WS_TABSTOP;
725 base_style = BS_RADIOBUTTON;
734 default_style = SS_RIGHT | WS_GROUP;
735 base_style = SS_RIGHT;
744 default_style = SBS_HORZ;
746 class = CTL_SCROLLBAR;
754 default_style = BS_3STATE | WS_TABSTOP;
755 base_style = BS_3STATE;
762 | USERBUTTON QUOTEDSTRING ',' numexpr ',' numexpr ',' numexpr ','
763 numexpr ',' numexpr ','
764 { style = WS_CHILD | WS_VISIBLE; }
765 styleexpr optcnumexpr
767 $$ = define_control ($2, $4, $6, $8, $10, $12, CTL_BUTTON,
772 /* Parameters for a control. The static variables DEFAULT_STYLE,
773 BASE_STYLE, and CLASS must be initialized before this nonterminal
774 is used. DEFAULT_STYLE is the style to use if no style expression
775 is specified. BASE_STYLE is the base style to use if a style
776 expression is specified; the style expression modifies the base
777 style. CLASS is the class of the control. */
780 optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
783 $$ = define_control ($1, $2, $3, $4, $5, $6, class,
784 default_style | WS_CHILD | WS_VISIBLE, 0);
787 if (dialog.ex == NULL)
788 rcparse_warning (_("control data requires DIALOGEX"));
792 | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
793 control_params_styleexpr optcnumexpr opt_control_data
795 $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8);
798 if (dialog.ex == NULL)
799 rcparse_warning (_("control data requires DIALOGEX"));
803 | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr
804 control_params_styleexpr cnumexpr cnumexpr opt_control_data
806 $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8);
807 if (dialog.ex == NULL)
808 rcparse_warning (_("help ID requires DIALOGEX"));
834 | BEG optrcdata_data END
840 /* These only exist to parse a reduction out of a common case. */
844 { style = WS_CHILD | WS_VISIBLE; }
850 { style = SS_ICON | WS_CHILD | WS_VISIBLE; }
854 control_params_styleexpr:
856 { style = base_style | WS_CHILD | WS_VISIBLE; }
860 /* Font resources. */
863 id FONT memflags_move_discard file_name
865 define_font ($1, &$3, $4);
869 /* Icon resources. */
872 id ICON memflags_move_discard file_name
874 define_icon ($1, &$3, $4);
878 /* Language command. This changes the static variable language, which
879 affects all subsequent resources. */
882 LANGUAGE numexpr cnumexpr
884 language = $2 | ($3 << SUBLANG_SHIFT);
888 /* Menu resources. */
891 id MENU suboptions BEG menuitems END
893 define_menu ($1, &$3, $5);
908 struct menuitem **pp;
910 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
919 MENUITEM QUOTEDSTRING cnumexpr menuitem_flags
921 $$ = define_menuitem ($2, $3, $4, 0, 0, NULL);
925 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
927 | POPUP QUOTEDSTRING menuitem_flags BEG menuitems END
929 $$ = define_menuitem ($2, 0, $3, 0, 0, $5);
938 | menuitem_flags ',' menuitem_flag
942 | menuitem_flags menuitem_flag
951 $$ = MENUITEM_CHECKED;
955 $$ = MENUITEM_GRAYED;
963 $$ = MENUITEM_INACTIVE;
967 $$ = MENUITEM_MENUBARBREAK;
971 $$ = MENUITEM_MENUBREAK;
975 /* Menuex resources. */
978 id MENUEX suboptions BEG menuexitems END
980 define_menu ($1, &$3, $5);
989 | menuexitems menuexitem
995 struct menuitem **pp;
997 for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next)
1006 MENUITEM QUOTEDSTRING
1008 $$ = define_menuitem ($2, 0, 0, 0, 0, NULL);
1010 | MENUITEM QUOTEDSTRING cnumexpr
1012 $$ = define_menuitem ($2, $3, 0, 0, 0, NULL);
1014 | MENUITEM QUOTEDSTRING cnumexpr cnumexpr optcnumexpr
1016 $$ = define_menuitem ($2, $3, $4, $5, 0, NULL);
1018 | MENUITEM SEPARATOR
1020 $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
1022 | POPUP QUOTEDSTRING BEG menuexitems END
1024 $$ = define_menuitem ($2, 0, 0, 0, 0, $4);
1026 | POPUP QUOTEDSTRING cnumexpr BEG menuexitems END
1028 $$ = define_menuitem ($2, $3, 0, 0, 0, $5);
1030 | POPUP QUOTEDSTRING cnumexpr cnumexpr BEG menuexitems END
1032 $$ = define_menuitem ($2, $3, $4, 0, 0, $6);
1034 | POPUP QUOTEDSTRING cnumexpr cnumexpr cnumexpr optcnumexpr
1037 $$ = define_menuitem ($2, $3, $4, $5, $6, $8);
1041 /* Messagetable resources. */
1044 id MESSAGETABLE memflags_move file_name
1046 define_messagetable ($1, &$3, $4);
1050 /* Rcdata resources. */
1053 id RCDATA suboptions BEG optrcdata_data END
1055 define_rcdata ($1, &$3, $5.first);
1059 /* We use a different lexing algorithm, because rcdata strings may
1060 contain embedded null bytes, and we need to know the length to use. */
1088 struct rcdata_item *ri;
1090 ri = define_rcdata_string ($1.s, $1.length);
1096 struct rcdata_item *ri;
1098 ri = define_rcdata_number ($1.val, $1.dword);
1102 | rcdata_data ',' SIZEDSTRING
1104 struct rcdata_item *ri;
1106 ri = define_rcdata_string ($3.s, $3.length);
1107 $$.first = $1.first;
1111 | rcdata_data ',' sizednumexpr
1113 struct rcdata_item *ri;
1115 ri = define_rcdata_number ($3.val, $3.dword);
1116 $$.first = $1.first;
1122 /* Stringtable resources. */
1125 STRINGTABLE suboptions BEG
1126 { sub_res_info = $2; }
1132 | string_data numexpr QUOTEDSTRING
1134 define_stringtable (&sub_res_info, $2, $3);
1136 | string_data numexpr ',' QUOTEDSTRING
1138 define_stringtable (&sub_res_info, $2, $4);
1142 /* User defined resources. We accept general suboptions in the
1143 file_name case to keep the parser happy. */
1146 id id suboptions BEG optrcdata_data END
1148 define_user_data ($1, $2, &$3, $5.first);
1150 | id id suboptions file_name
1152 define_user_file ($1, $2, &$3, $4);
1156 /* Versioninfo resources. */
1159 id VERSIONINFO fixedverinfo BEG verblocks END
1161 define_versioninfo ($1, language, $3, $5);
1168 $$ = ((struct fixed_versioninfo *)
1169 res_alloc (sizeof (struct fixed_versioninfo)));
1170 memset ($$, 0, sizeof (struct fixed_versioninfo));
1172 | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr
1174 $1->file_version_ms = ($3 << 16) | $4;
1175 $1->file_version_ls = ($5 << 16) | $6;
1178 | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr
1180 $1->product_version_ms = ($3 << 16) | $4;
1181 $1->product_version_ls = ($5 << 16) | $6;
1184 | fixedverinfo FILEFLAGSMASK numexpr
1186 $1->file_flags_mask = $3;
1189 | fixedverinfo FILEFLAGS numexpr
1191 $1->file_flags = $3;
1194 | fixedverinfo FILEOS numexpr
1199 | fixedverinfo FILETYPE numexpr
1204 | fixedverinfo FILESUBTYPE numexpr
1206 $1->file_subtype = $3;
1211 /* To handle verblocks successfully, the lexer handles BLOCK
1212 specially. A BLOCK "StringFileInfo" is returned as
1213 BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as
1214 BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK
1215 with the string as the value. */
1222 | verblocks BLOCKSTRINGFILEINFO BEG BLOCK BEG vervals END END
1224 $$ = append_ver_stringfileinfo ($1, $4, $6);
1226 | verblocks BLOCKVARFILEINFO BEG VALUE QUOTEDSTRING vertrans END
1228 $$ = append_ver_varfileinfo ($1, $5, $6);
1237 | vervals VALUE QUOTEDSTRING ',' QUOTEDSTRING
1239 $$ = append_verval ($1, $3, $5);
1248 | vertrans cnumexpr cnumexpr
1250 $$ = append_vertrans ($1, $2, $3);
1254 /* A resource ID. */
1266 /* It seems that resource ID's are forced to upper case. */
1267 copy = xstrdup ($1);
1268 for (s = copy; *s != '\0'; s++)
1270 res_string_to_id (&$$, copy);
1275 /* A resource reference. */
1303 /* It seems that resource ID's are forced to upper case. */
1304 copy = xstrdup ($1);
1305 for (s = copy; *s != '\0'; s++)
1307 res_string_to_id (&$$, copy);
1312 /* Generic suboptions. These may appear before the BEGIN in any
1313 multiline statement. */
1318 memset (&$$, 0, sizeof (struct res_res_info));
1319 $$.language = language;
1320 /* FIXME: Is this the right default? */
1321 $$.memflags = MEMFLAG_MOVEABLE;
1323 | suboptions memflag
1326 $$.memflags |= $2.on;
1327 $$.memflags &=~ $2.off;
1329 | suboptions CHARACTERISTICS numexpr
1332 $$.characteristics = $3;
1334 | suboptions LANGUAGE numexpr cnumexpr
1337 $$.language = $3 | ($4 << SUBLANG_SHIFT);
1339 | suboptions VERSIONK numexpr
1346 /* Memory flags which default to MOVEABLE and DISCARDABLE. */
1348 memflags_move_discard:
1351 memset (&$$, 0, sizeof (struct res_res_info));
1352 $$.language = language;
1353 $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE;
1355 | memflags_move_discard memflag
1358 $$.memflags |= $2.on;
1359 $$.memflags &=~ $2.off;
1363 /* Memory flags which default to MOVEABLE. */
1368 memset (&$$, 0, sizeof (struct res_res_info));
1369 $$.language = language;
1370 $$.memflags = MEMFLAG_MOVEABLE;
1372 | memflags_move memflag
1375 $$.memflags |= $2.on;
1376 $$.memflags &=~ $2.off;
1380 /* Memory flags. This returns a struct with two integers, because we
1381 sometimes want to set bits and we sometimes want to clear them. */
1386 $$.on = MEMFLAG_MOVEABLE;
1392 $$.off = MEMFLAG_MOVEABLE;
1396 $$.on = MEMFLAG_PURE;
1402 $$.off = MEMFLAG_PURE;
1406 $$.on = MEMFLAG_PRELOAD;
1412 $$.off = MEMFLAG_PRELOAD;
1416 $$.on = MEMFLAG_DISCARDABLE;
1434 /* A style expression. This changes the static variable STYLE. We do
1435 it this way because rc appears to permit a style to be set to
1437 WS_GROUP | NOT WS_TABSTOP
1438 to mean that a default of WS_TABSTOP should be removed. Anything
1439 which wants to accept a style must first set STYLE to the default
1440 value. The styleexpr nonterminal will change STYLE as specified by
1441 the user. Note that we do not accept arbitrary expressions here,
1442 just numbers separated by '|'. */
1453 | styleexpr '|' parennumber
1457 | styleexpr '|' NOT parennumber
1474 /* An optional expression with a leading comma. */
1487 /* An expression with a leading comma. */
1496 /* A possibly negated numeric expression. */
1505 /* A possibly negated expression with a size. */
1512 | '(' sizednumexpr ')'
1516 | '~' sizednumexpr %prec '~'
1519 $$.dword = $2.dword;
1521 | '-' sizednumexpr %prec NEG
1524 $$.dword = $2.dword;
1526 | sizednumexpr '*' sizednumexpr
1528 $$.val = $1.val * $3.val;
1529 $$.dword = $1.dword || $3.dword;
1531 | sizednumexpr '/' sizednumexpr
1533 $$.val = $1.val / $3.val;
1534 $$.dword = $1.dword || $3.dword;
1536 | sizednumexpr '%' sizednumexpr
1538 $$.val = $1.val % $3.val;
1539 $$.dword = $1.dword || $3.dword;
1541 | sizednumexpr '+' sizednumexpr
1543 $$.val = $1.val + $3.val;
1544 $$.dword = $1.dword || $3.dword;
1546 | sizednumexpr '-' sizednumexpr
1548 $$.val = $1.val - $3.val;
1549 $$.dword = $1.dword || $3.dword;
1551 | sizednumexpr '&' sizednumexpr
1553 $$.val = $1.val & $3.val;
1554 $$.dword = $1.dword || $3.dword;
1556 | sizednumexpr '^' sizednumexpr
1558 $$.val = $1.val ^ $3.val;
1559 $$.dword = $1.dword || $3.dword;
1561 | sizednumexpr '|' sizednumexpr
1563 $$.val = $1.val | $3.val;
1564 $$.dword = $1.dword || $3.dword;
1568 /* An expression with a leading comma which does not use unary
1578 /* An expression which does not use unary negation. */
1587 /* An expression which does not use unary negation. We separate unary
1588 negation to avoid parsing conflicts when two numeric expressions
1589 appear consecutively. */
1596 | '(' sizednumexpr ')'
1600 | '~' sizednumexpr %prec '~'
1603 $$.dword = $2.dword;
1605 | sizedposnumexpr '*' sizednumexpr
1607 $$.val = $1.val * $3.val;
1608 $$.dword = $1.dword || $3.dword;
1610 | sizedposnumexpr '/' sizednumexpr
1612 $$.val = $1.val / $3.val;
1613 $$.dword = $1.dword || $3.dword;
1615 | sizedposnumexpr '%' sizednumexpr
1617 $$.val = $1.val % $3.val;
1618 $$.dword = $1.dword || $3.dword;
1620 | sizedposnumexpr '+' sizednumexpr
1622 $$.val = $1.val + $3.val;
1623 $$.dword = $1.dword || $3.dword;
1625 | sizedposnumexpr '-' sizednumexpr
1627 $$.val = $1.val - $3.val;
1628 $$.dword = $1.dword || $3.dword;
1630 | sizedposnumexpr '&' sizednumexpr
1632 $$.val = $1.val & $3.val;
1633 $$.dword = $1.dword || $3.dword;
1635 | sizedposnumexpr '^' sizednumexpr
1637 $$.val = $1.val ^ $3.val;
1638 $$.dword = $1.dword || $3.dword;
1640 | sizedposnumexpr '|' sizednumexpr
1642 $$.val = $1.val | $3.val;
1643 $$.dword = $1.dword || $3.dword;
1649 /* Set the language from the command line. */
1652 rcparse_set_language (lang)