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