]> git.saurik.com Git - bison.git/blame - src/getargs.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
34136e65 3 Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software
575619af 4 Foundation, Inc.
3d8fc6ca 5
9f306f2a 6 This file is part of Bison, the GNU Compiler Compiler.
3d8fc6ca 7
f16b0819
PE
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
3d8fc6ca 12
f16b0819
PE
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
3d8fc6ca 17
9f306f2a 18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
3d8fc6ca 20
2cec9080 21#include <config.h>
3d8fc6ca 22#include "system.h"
d4bd2295 23#include "output.h"
d38a11a6
PE
24
25#include <argmatch.h>
d7e0a1a7 26#include <c-strcase.h>
3b2942e6 27#include <configmake.h>
d38a11a6 28#include <error.h>
f47dbf6b
PE
29
30/* Hack to get <getopt.h> to declare getopt with a prototype. */
31#if lint && ! defined __GNU_LIBRARY__
32# define __GNU_LIBRARY__
33# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
34#endif
35
d38a11a6
PE
36#include <getopt.h>
37
f47dbf6b
PE
38#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
39# undef __GNU_LIBRARY__
40# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
41#endif
42
4d699f44
AD
43#include <progname.h>
44
b0ce6046 45#include "complain.h"
ec3bc396 46#include "files.h"
d38a11a6 47#include "getargs.h"
00f5d575 48#include "muscle-tab.h"
4a9cd8f2 49#include "quote.h"
d38a11a6 50#include "uniqstr.h"
3d8fc6ca 51
d0829076 52bool defines_flag;
4e83ea15 53bool graph_flag;
41d7a5f2 54bool xml_flag;
d0829076 55bool no_lines_flag;
d0829076 56bool token_table_flag;
e9690142 57bool yacc_flag; /* for -y */
4e83ea15 58
916708d5
AD
59bool nondeterministic_parser = false;
60bool glr_parser = false;
916708d5 61
4e83ea15
AD
62int report_flag = report_none;
63int trace_flag = trace_none;
64
0e021770
PE
65static struct bison_language const valid_languages[] = {
66 { "c", "c-skel.m4", ".c", ".h", true },
67 { "c++", "c++-skel.m4", ".cc", ".hh", true },
8405b70c 68 { "java", "java-skel.m4", ".java", ".java", false },
0e021770
PE
69 { "", "", "", "", false }
70};
71
51365192 72int skeleton_prio = default_prio;
b0ce6046 73const char *skeleton = NULL;
51365192 74int language_prio = default_prio;
0e021770 75struct bison_language const *language = &valid_languages[0];
f6bd5427 76const char *include = NULL;
b0ce6046 77
273a74fa 78
7b42569e
AD
79/** Decode an option's set of keys.
80 *
81 * \param option option being decoded.
07c39ae9 82 * \param keys array of valid subarguments.
7b42569e 83 * \param values array of corresponding (int) values.
bf0e44e8 84 * \param all the all value.
07c39ae9 85 * \param flags the flags to update
4182a0a1 86 * \param args comma separated list of effective subarguments to decode.
7b42569e
AD
87 * If 0, then activate all the flags.
88 *
4182a0a1 89 * If VALUE != 0 then KEY sets flags and no-KEY clears them.
bf0e44e8
JD
90 * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all
91 * flags from \c all. Thus no-none = all and no-all = none.
7b42569e 92 */
80ac75bc
PE
93static void
94flags_argmatch (const char *option,
e9690142
JD
95 const char * const keys[], const int values[],
96 int all, int *flags, char *args)
7b42569e
AD
97{
98 if (args)
99 {
100 args = strtok (args, ",");
ba7560e2 101 while (args)
e9690142 102 {
4663cb4d 103 int no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
e9690142
JD
104 int value = XARGMATCH (option, args + no, keys, values);
105 if (value == 0)
106 {
107 if (no)
108 *flags |= all;
109 else
110 *flags &= ~all;
111 }
112 else
113 {
114 if (no)
115 *flags &= ~value;
116 else
117 *flags |= value;
118 }
119 args = strtok (NULL, ",");
120 }
7b42569e
AD
121 }
122 else
bf0e44e8 123 *flags |= all;
7b42569e
AD
124}
125
80ac75bc 126/** Decode a set of sub arguments.
7b42569e
AD
127 *
128 * \param FlagName the flag familly to update.
07c39ae9 129 * \param Args the effective sub arguments to decode.
327db05b 130 * \param All the "all" value.
7b42569e
AD
131 *
132 * \arg FlagName_args the list of keys.
133 * \arg FlagName_types the list of values.
134 * \arg FlagName_flag the flag to update.
135 */
327db05b 136#define FLAGS_ARGMATCH(FlagName, Args, All) \
7b42569e 137 flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
327db05b 138 All, &FlagName ## _flag, Args)
7b42569e
AD
139
140
b8a41559
AD
141/*----------------------.
142| --report's handling. |
143`----------------------*/
144
145static const char * const report_args[] =
146{
147 /* In a series of synonyms, present the most meaningful first, so
148 that argmatch_valid be more readable. */
149 "none",
150 "state", "states",
151 "itemset", "itemsets",
152 "lookahead", "lookaheads", "look-ahead",
153 "solved",
154 "all",
155 0
156};
157
158static const int report_types[] =
159{
160 report_none,
161 report_states, report_states,
162 report_states | report_itemsets, report_states | report_itemsets,
163 report_states | report_lookahead_tokens,
164 report_states | report_lookahead_tokens,
165 report_states | report_lookahead_tokens,
166 report_states | report_solved_conflicts,
167 report_all
168};
169
170ARGMATCH_VERIFY (report_args, report_types);
171
b8a41559 172
273a74fa
AD
173/*---------------------.
174| --trace's handling. |
175`---------------------*/
176
177static const char * const trace_args[] =
178{
179 /* In a series of synonyms, present the most meaningful first, so
180 that argmatch_valid be more readable. */
b8a41559 181 "none - no traces",
c5e3e510
AD
182 "scan - grammar scanner traces",
183 "parse - grammar parser traces",
b8a41559 184 "automaton - construction of the automaton",
273a74fa 185 "bitsets - use of bitsets",
b8a41559 186 "grammar - reading, reducing the grammar",
1509d42f 187 "resource - memory consumption (where available)",
273a74fa 188 "sets - grammar sets: firsts, nullable etc.",
5263bea9 189 "muscles - m4 definitions passed to the skeleton",
327afc7c
AD
190 "tools - m4 invocation",
191 "m4 - m4 traces",
c5e3e510
AD
192 "skeleton - skeleton postprocessing",
193 "time - time consumption",
db34f798 194 "ielr - IELR conversion",
273a74fa
AD
195 "all - all of the above",
196 0
197};
198
199static const int trace_types[] =
200{
201 trace_none,
473d0a75
AD
202 trace_scan,
203 trace_parse,
273a74fa
AD
204 trace_automaton,
205 trace_bitsets,
206 trace_grammar,
207 trace_resource,
208 trace_sets,
5263bea9 209 trace_muscles,
273a74fa 210 trace_tools,
327afc7c 211 trace_m4,
c5e3e510
AD
212 trace_skeleton,
213 trace_time,
db34f798 214 trace_ielr,
273a74fa
AD
215 trace_all
216};
217
8a6f72f3 218ARGMATCH_VERIFY (trace_args, trace_types);
273a74fa 219
7b42569e
AD
220
221/*------------------------.
222| --warnings's handling. |
223`------------------------*/
224
225static const char * const warnings_args[] =
273a74fa 226{
7b42569e
AD
227 /* In a series of synonyms, present the most meaningful first, so
228 that argmatch_valid be more readable. */
17bd8a73
JD
229 "none - no warnings",
230 "midrule-values - unset or unused midrule values",
184e3179 231 "yacc - incompatibilities with POSIX Yacc",
786743d5
JD
232 "conflicts-sr - S/R conflicts",
233 "conflicts-rr - R/R conflicts",
c39014ae 234 "other - all other warnings",
17bd8a73
JD
235 "all - all of the above",
236 "error - warnings are errors",
7b42569e
AD
237 0
238};
239
240static const int warnings_types[] =
241{
327db05b
VS
242 Wnone,
243 Wmidrule_values,
244 Wyacc,
245 Wconflicts_sr,
246 Wconflicts_rr,
247 Wother,
248 Wall,
249 Werror
7b42569e
AD
250};
251
252ARGMATCH_VERIFY (warnings_args, warnings_types);
273a74fa 253
0e575721
AD
254/*-------------------------------------------.
255| Display the help message and exit STATUS. |
256`-------------------------------------------*/
e79137ac 257
0df27e8b
PE
258static void usage (int) ATTRIBUTE_NORETURN;
259
4a120d45 260static void
0e575721 261usage (int status)
cbd8ffc5 262{
0e575721
AD
263 if (status != 0)
264 fprintf (stderr, _("Try `%s --help' for more information.\n"),
e9690142 265 program_name);
0e575721
AD
266 else
267 {
a7c09cba 268 /* For ../build-aux/cross-options.pl to work, use the format:
e9690142
JD
269 ^ -S, --long[=ARGS] (whitespace)
270 A --long option is required.
271 Otherwise, add exceptions to ../build-aux/cross-options.pl. */
a7c09cba 272
a92be413 273 printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 274 fputs (_("\
9dc3ee6d 275Generate a deterministic LR or generalized LR (GLR) parser employing\n\
af28d414
JD
276LALR(1), IELR(1), or canonical LR(1) parser tables. IELR(1) and\n\
277canonical LR(1) support is experimental.\n\
a92be413
PE
278\n\
279"), stdout);
9f306f2a 280
0e575721 281 fputs (_("\
a92be413 282Mandatory arguments to long options are mandatory for short options too.\n\
8e55b3aa
JD
283"), stdout);
284 fputs (_("\
285The same is true for optional arguments.\n\
a92be413 286"), stdout);
9f306f2a 287
0e575721 288 fputs (_("\
a92be413 289\n\
9f306f2a 290Operation modes:\n\
feeb56cd
JD
291 -h, --help display this help and exit\n\
292 -V, --version output version information and exit\n\
293 --print-localedir output directory containing locale-dependent data\n\
294 --print-datadir output directory containing skeletons and XSLT\n\
295 -y, --yacc emulate POSIX Yacc\n\
296 -W, --warnings[=CATEGORY] report the warnings falling in CATEGORY\n\
a92be413
PE
297\n\
298"), stdout);
9f306f2a 299
0e575721 300 fputs (_("\
9f306f2a 301Parser:\n\
de5ab940
JD
302 -L, --language=LANGUAGE specify the output programming language\n\
303 (this is an experimental feature)\n\
304 -S, --skeleton=FILE specify the skeleton to use\n\
305 -t, --debug instrument the parser for tracing\n\
306 same as `-Dparse.trace'\n\
307 --locations enable location support\n\
4b3847c3
AD
308 -D, --define=NAME[=VALUE] similar to '%define NAME \"VALUE\"'\n\
309 -F, --force-define=NAME[=VALUE] override '%define NAME \"VALUE\"'\n\
de5ab940 310 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
4b3847c3
AD
311 deprecated by '-Dapi.prefix=PREFIX'\n\
312 -l, --no-lines don't generate '#line' directives\n\
de5ab940 313 -k, --token-table include a table of token names\n\
a92be413 314\n\
0e575721 315"), stdout);
9f306f2a 316
8e55b3aa
JD
317 /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
318 * won't assume that -d also takes an argument. */
0e575721 319 fputs (_("\
9f306f2a 320Output:\n\
feeb56cd
JD
321 --defines[=FILE] also produce a header file\n\
322 -d likewise but cannot specify FILE (for POSIX Yacc)\n\
323 -r, --report=THINGS also produce details on the automaton\n\
324 --report-file=FILE write report to FILE\n\
325 -v, --verbose same as `--report=state'\n\
326 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
327 -o, --output=FILE leave output to FILE\n\
328 -g, --graph[=FILE] also output a graph of the automaton\n\
329 -x, --xml[=FILE] also output an XML report of the automaton\n\
330 (the XML schema is experimental)\n\
a92be413 331\n\
0e575721 332"), stdout);
86eff183 333
6aeb9c57
AD
334 fputs (_("\
335Warning categories include:\n\
336 `midrule-values' unset or unused midrule values\n\
184e3179 337 `yacc' incompatibilities with POSIX Yacc\n\
786743d5
JD
338 `conflicts-sr' S/R conflicts (enabled by default)\n\
339 `conflicts-rr' R/R conflicts (enabled by default)\n\
c39014ae 340 `other' all other warnings (enabled by default)\n\
6aeb9c57
AD
341 `all' all the warnings\n\
342 `no-CATEGORY' turn off warnings in CATEGORY\n\
343 `none' turn off all the warnings\n\
344 `error' treat warnings as errors\n\
66f0441d 345\n\
6aeb9c57
AD
346"), stdout);
347
0e575721 348 fputs (_("\
ec3bc396
AD
349THINGS is a list of comma separated words that can include:\n\
350 `state' describe the states\n\
351 `itemset' complete the core item sets with their closure\n\
742e4900 352 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 353 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
354 `all' include all the above information\n\
355 `none' disable the report\n\
0e575721 356"), stdout);
9f306f2a 357
a92be413 358 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
359 }
360
361 exit (status);
cbd8ffc5
DM
362}
363
e79137ac
AD
364
365/*------------------------------.
366| Display the version message. |
367`------------------------------*/
368
369static void
0e575721 370version (void)
e79137ac
AD
371{
372 /* Some efforts were made to ease the translators' task, please
373 continue. */
0e575721
AD
374 printf (_("bison (GNU Bison) %s"), VERSION);
375 putc ('\n', stdout);
376 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
377 putc ('\n', stdout);
e79137ac 378
0e575721 379 fprintf (stdout,
e9690142
JD
380 _("Copyright (C) %d Free Software Foundation, Inc.\n"),
381 PACKAGE_COPYRIGHT_YEAR);
e79137ac
AD
382
383 fputs (_("\
384This is free software; see the source for copying conditions. There is NO\n\
385warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
386"),
e9690142 387 stdout);
e79137ac
AD
388}
389
390
0e021770
PE
391/*-------------------------------------.
392| --skeleton and --language handling. |
393`--------------------------------------*/
394
395void
5a893c2b 396skeleton_arg (char const *arg, int prio, location loc)
0e021770
PE
397{
398 if (prio < skeleton_prio)
399 {
400 skeleton_prio = prio;
401 skeleton = arg;
402 }
403 else if (prio == skeleton_prio)
6fb8b256
VS
404 complain_at (loc, complaint,
405 _("multiple skeleton declarations are invalid"));
0e021770
PE
406}
407
408void
5a893c2b 409language_argmatch (char const *arg, int prio, location loc)
0e021770
PE
410{
411 char const *msg;
412
413 if (prio < language_prio)
414 {
415 int i;
416 for (i = 0; valid_languages[i].language[0]; i++)
e9690142
JD
417 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
418 {
419 language_prio = prio;
420 language = &valid_languages[i];
421 return;
422 }
4a9cd8f2 423 msg = _("%s: invalid language");
0e021770
PE
424 }
425 else if (language_prio == prio)
426 msg = _("multiple language declarations are invalid");
427 else
428 return;
429
6fb8b256 430 complain_at (loc, complaint, msg, quotearg_colon (arg));
0e021770
PE
431}
432
e79137ac
AD
433/*----------------------.
434| Process the options. |
435`----------------------*/
436
7020f1e9
AD
437/* Shorts options.
438 Should be computed from long_options. */
439static char const short_options[] =
58697c6d 440 "D:"
de5ab940 441 "F:"
7020f1e9
AD
442 "L:"
443 "S:"
444 "T::"
445 "V"
8e55b3aa 446 "W::"
7020f1e9
AD
447 "b:"
448 "d"
449 "e"
450 "g::"
451 "h"
452 "k"
453 "l"
454 "n"
455 "o:"
456 "p:"
457 "r:"
458 "t"
459 "v"
460 "x::"
461 "y"
462 ;
e2aaf4c4 463
d0829076
PE
464/* Values for long options that do not have single-letter equivalents. */
465enum
466{
f7ab6a50 467 LOCATIONS_OPTION = CHAR_MAX + 1,
d4bd2295 468 PRINT_LOCALEDIR_OPTION,
1bb2bd75
JD
469 PRINT_DATADIR_OPTION,
470 REPORT_FILE_OPTION
d0829076
PE
471};
472
e2aaf4c4
AD
473static struct option const long_options[] =
474{
475 /* Operation modes. */
e9690142
JD
476 { "help", no_argument, 0, 'h' },
477 { "version", no_argument, 0, 'V' },
478 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
479 { "print-datadir", no_argument, 0, PRINT_DATADIR_OPTION },
7b42569e 480 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
481
482 /* Parser. */
e9690142 483 { "name-prefix", required_argument, 0, 'p' },
e2aaf4c4
AD
484 { "include", required_argument, 0, 'I' },
485
486 /* Output. */
e9690142
JD
487 { "file-prefix", required_argument, 0, 'b' },
488 { "output", required_argument, 0, 'o' },
489 { "output-file", required_argument, 0, 'o' },
490 { "graph", optional_argument, 0, 'g' },
41d7a5f2 491 { "xml", optional_argument, 0, 'x' },
e9690142 492 { "report", required_argument, 0, 'r' },
1bb2bd75 493 { "report-file", required_argument, 0, REPORT_FILE_OPTION },
e9690142 494 { "verbose", no_argument, 0, 'v' },
e2aaf4c4
AD
495
496 /* Hidden. */
273a74fa 497 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 498
e2aaf4c4
AD
499 /* Output. */
500 { "defines", optional_argument, 0, 'd' },
501
502 /* Operation modes. */
503 { "fixed-output-files", no_argument, 0, 'y' },
e9690142 504 { "yacc", no_argument, 0, 'y' },
e2aaf4c4
AD
505
506 /* Parser. */
e9690142
JD
507 { "debug", no_argument, 0, 't' },
508 { "define", required_argument, 0, 'D' },
de5ab940 509 { "force-define", required_argument, 0, 'F' },
e9690142 510 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4 511 { "no-lines", no_argument, 0, 'l' },
e2aaf4c4
AD
512 { "raw", no_argument, 0, 0 },
513 { "skeleton", required_argument, 0, 'S' },
0e021770 514 { "language", required_argument, 0, 'L' },
e2aaf4c4
AD
515 { "token-table", no_argument, 0, 'k' },
516
517 {0, 0, 0, 0}
518};
519
ae404801
AD
520/* Under DOS, there is no difference on the case. This can be
521 troublesome when looking for `.tab' etc. */
522#ifdef MSDOS
523# define AS_FILE_NAME(File) (strlwr (File), (File))
524#else
525# define AS_FILE_NAME(File) (File)
526#endif
527
58697c6d
AD
528/* Build a location for the current command line argument. */
529static
530location
d73e55e0 531command_line_location (void)
58697c6d
AD
532{
533 location res;
534 /* "<command line>" is used in GCC's messages about -D. */
535 boundary_set (&res.start, uniqstr_new ("<command line>"), optind, -1);
536 res.end = res.start;
537 return res;
538}
539
540
3d8fc6ca 541void
d2729d44 542getargs (int argc, char *argv[])
3d8fc6ca 543{
1916f98e 544 int c;
3d8fc6ca 545
08721544 546 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
e9690142 547 != -1)
cd5bd6ac
AD
548 switch (c)
549 {
58697c6d
AD
550 /* ASCII Sorting for short options (i.e., upper case then
551 lower case), and then long-only options. */
552
cd5bd6ac 553 case 0:
e9690142
JD
554 /* Certain long options cause getopt_long to return 0. */
555 break;
cd5bd6ac 556
58697c6d 557 case 'D': /* -DNAME[=VALUE]. */
de5ab940 558 case 'F': /* -FNAME[=VALUE]. */
58697c6d
AD
559 {
560 char* name = optarg;
84526bf3 561 char* value = strchr (optarg, '=');
58697c6d 562 if (value)
9ce405ce 563 *value++ = 0;
a8beef7e 564 muscle_percent_define_insert (name, command_line_location (),
de5ab940
JD
565 value ? value : "",
566 c == 'D' ? MUSCLE_PERCENT_DEFINE_D
567 : MUSCLE_PERCENT_DEFINE_F);
58697c6d 568 }
e9690142 569 break;
22c2cbc0 570
8e55b3aa 571 case 'I':
e9690142
JD
572 include = AS_FILE_NAME (optarg);
573 break;
41d7a5f2 574
0e021770 575 case 'L':
e9690142
JD
576 language_argmatch (optarg, command_line_prio,
577 command_line_location ());
578 break;
0e021770 579
cd5bd6ac 580 case 'S':
e9690142
JD
581 skeleton_arg (AS_FILE_NAME (optarg), command_line_prio,
582 command_line_location ());
583 break;
cd5bd6ac 584
8e55b3aa 585 case 'T':
327db05b 586 FLAGS_ARGMATCH (trace, optarg, trace_all);
e9690142 587 break;
f6bd5427 588
8e55b3aa 589 case 'V':
e9690142
JD
590 version ();
591 exit (EXIT_SUCCESS);
8e55b3aa
JD
592
593 case 'W':
327db05b 594 FLAGS_ARGMATCH (warnings, optarg, Wall);
e9690142 595 break;
8e55b3aa
JD
596
597 case 'b':
e9690142
JD
598 spec_file_prefix = AS_FILE_NAME (optarg);
599 break;
8e55b3aa 600
58697c6d
AD
601 case 'd':
602 /* Here, the -d and --defines options are differentiated. */
603 defines_flag = true;
604 if (optarg)
0b7fba13
AD
605 {
606 free (spec_defines_file);
607 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
608 }
58697c6d
AD
609 break;
610
8e55b3aa 611 case 'g':
e9690142
JD
612 graph_flag = true;
613 if (optarg)
0b7fba13
AD
614 {
615 free (spec_graph_file);
616 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
617 }
e9690142 618 break;
cd5bd6ac 619
8e55b3aa 620 case 'h':
e9690142 621 usage (EXIT_SUCCESS);
8e55b3aa 622
7b42569e 623 case 'k':
e9690142
JD
624 token_table_flag = true;
625 break;
7b42569e 626
cd5bd6ac 627 case 'l':
e9690142
JD
628 no_lines_flag = true;
629 break;
d0829076 630
7b42569e 631 case 'o':
e9690142
JD
632 spec_outfile = AS_FILE_NAME (optarg);
633 break;
cd5bd6ac 634
7b42569e 635 case 'p':
e9690142
JD
636 spec_name_prefix = optarg;
637 break;
7b42569e
AD
638
639 case 'r':
327db05b 640 FLAGS_ARGMATCH (report, optarg, report_all);
e9690142 641 break;
7b42569e 642
cd5bd6ac 643 case 't':
fa819509 644 muscle_percent_define_insert ("parse.trace",
de5ab940
JD
645 command_line_location (), "",
646 MUSCLE_PERCENT_DEFINE_D);
e9690142 647 break;
cd5bd6ac 648
7b42569e 649 case 'v':
e9690142
JD
650 report_flag |= report_states;
651 break;
cd5bd6ac 652
8e55b3aa 653 case 'x':
e9690142
JD
654 xml_flag = true;
655 if (optarg)
0b7fba13
AD
656 {
657 free (spec_xml_file);
658 spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
659 }
e9690142 660 break;
cd5bd6ac 661
8e55b3aa 662 case 'y':
e9690142
JD
663 yacc_flag = true;
664 break;
ec3bc396 665
7b42569e 666 case LOCATIONS_OPTION:
bc0f5737
AD
667 muscle_percent_define_ensure ("locations",
668 command_line_location (), true);
e9690142 669 break;
273a74fa 670
7b42569e 671 case PRINT_LOCALEDIR_OPTION:
e9690142
JD
672 printf ("%s\n", LOCALEDIR);
673 exit (EXIT_SUCCESS);
7b42569e 674
d4bd2295 675 case PRINT_DATADIR_OPTION:
d9a7c07c 676 printf ("%s\n", pkgdatadir ());
e9690142 677 exit (EXIT_SUCCESS);
d4bd2295 678
8e55b3aa 679 case REPORT_FILE_OPTION:
0b7fba13 680 free (spec_verbose_file);
e9690142
JD
681 spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
682 break;
8e55b3aa 683
cd5bd6ac 684 default:
e9690142 685 usage (EXIT_FAILURE);
cd5bd6ac 686 }
3d8fc6ca 687
a4b6efd4 688 if (argc - optind != 1)
3d8fc6ca 689 {
a4b6efd4 690 if (argc - optind < 1)
4a9cd8f2 691 error (0, 0, _("%s: missing operand"), quotearg_colon (argv[argc - 1]));
a4b6efd4 692 else
4a9cd8f2 693 error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
0e575721 694 usage (EXIT_FAILURE);
3d8fc6ca 695 }
3d8fc6ca 696
d38a11a6 697 current_file = grammar_file = uniqstr_new (argv[optind]);
9fe5a457 698 MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
3d8fc6ca 699}
67212941
JD
700
701void
702tr (char *s, char from, char to)
703{
704 for (; *s; s++)
705 if (*s == from)
706 *s = to;
707}