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