]> git.saurik.com Git - bison.git/blame - src/getargs.c
maint: fix syntax-check ignore patterns.
[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\
4b3847c3
AD
314 -D, --define=NAME[=VALUE] similar to '%define NAME \"VALUE\"'\n\
315 -F, --force-define=NAME[=VALUE] override '%define NAME \"VALUE\"'\n\
34d41938 316 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
4b3847c3
AD
317 deprecated by '-Dapi.prefix=PREFIX'\n\
318 -l, --no-lines don't generate '#line' directives\n\
34d41938 319 -k, --token-table include a table of token names\n\
a92be413 320\n\
0e575721 321"), stdout);
9f306f2a 322
8e55b3aa
JD
323 /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
324 * won't assume that -d also takes an argument. */
0e575721 325 fputs (_("\
9f306f2a 326Output:\n\
620b2e36
JD
327 --defines[=FILE] also produce a header file\n\
328 -d likewise but cannot specify FILE (for POSIX Yacc)\n\
329 -r, --report=THINGS also produce details on the automaton\n\
330 --report-file=FILE write report to FILE\n\
331 -v, --verbose same as `--report=state'\n\
332 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
333 -o, --output=FILE leave output to FILE\n\
334 -g, --graph[=FILE] also output a graph of the automaton\n\
335 -x, --xml[=FILE] also output an XML report of the automaton\n\
336 (the XML schema is experimental)\n\
a92be413 337\n\
0e575721 338"), stdout);
86eff183 339
6aeb9c57
AD
340 fputs (_("\
341Warning categories include:\n\
342 `midrule-values' unset or unused midrule values\n\
44c124a3 343 `yacc' incompatibilities with POSIX Yacc\n\
6f8bdce2
JD
344 `conflicts-sr' S/R conflicts (enabled by default)\n\
345 `conflicts-rr' R/R conflicts (enabled by default)\n\
8ffd7912 346 `other' all other warnings (enabled by default)\n\
6aeb9c57
AD
347 `all' all the warnings\n\
348 `no-CATEGORY' turn off warnings in CATEGORY\n\
349 `none' turn off all the warnings\n\
350 `error' treat warnings as errors\n\
66f0441d 351\n\
6aeb9c57
AD
352"), stdout);
353
0e575721 354 fputs (_("\
ec3bc396
AD
355THINGS is a list of comma separated words that can include:\n\
356 `state' describe the states\n\
357 `itemset' complete the core item sets with their closure\n\
742e4900 358 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 359 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
360 `all' include all the above information\n\
361 `none' disable the report\n\
0e575721 362"), stdout);
9f306f2a 363
a92be413 364 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
365 }
366
367 exit (status);
cbd8ffc5
DM
368}
369
e79137ac
AD
370
371/*------------------------------.
372| Display the version message. |
373`------------------------------*/
374
375static void
0e575721 376version (void)
e79137ac
AD
377{
378 /* Some efforts were made to ease the translators' task, please
379 continue. */
0e575721
AD
380 printf (_("bison (GNU Bison) %s"), VERSION);
381 putc ('\n', stdout);
382 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
383 putc ('\n', stdout);
e79137ac 384
0e575721 385 fprintf (stdout,
a005a9c4
AD
386 _("Copyright (C) %d Free Software Foundation, Inc.\n"),
387 PACKAGE_COPYRIGHT_YEAR);
e79137ac
AD
388
389 fputs (_("\
390This is free software; see the source for copying conditions. There is NO\n\
391warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
392"),
0e575721 393 stdout);
e79137ac
AD
394}
395
396
0e021770
PE
397/*-------------------------------------.
398| --skeleton and --language handling. |
399`--------------------------------------*/
400
401void
e186a284 402skeleton_arg (char const *arg, int prio, location loc)
0e021770
PE
403{
404 if (prio < skeleton_prio)
405 {
406 skeleton_prio = prio;
407 skeleton = arg;
408 }
409 else if (prio == skeleton_prio)
c8bf65f0 410 complain_at (loc, _("multiple skeleton declarations are invalid"));
0e021770
PE
411}
412
413void
e186a284 414language_argmatch (char const *arg, int prio, location loc)
0e021770
PE
415{
416 char const *msg;
417
418 if (prio < language_prio)
419 {
420 int i;
421 for (i = 0; valid_languages[i].language[0]; i++)
abf3f74b
JM
422 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
423 {
424 language_prio = prio;
425 language = &valid_languages[i];
426 return;
427 }
4c787a31 428 msg = _("%s: invalid language");
0e021770
PE
429 }
430 else if (language_prio == prio)
431 msg = _("multiple language declarations are invalid");
432 else
433 return;
434
4c787a31 435 complain_at (loc, msg, quotearg_colon (arg));
0e021770
PE
436}
437
e79137ac
AD
438/*----------------------.
439| Process the options. |
440`----------------------*/
441
7020f1e9
AD
442/* Shorts options.
443 Should be computed from long_options. */
444static char const short_options[] =
e14c6831 445 "D:"
34d41938 446 "F:"
7020f1e9
AD
447 "L:"
448 "S:"
449 "T::"
450 "V"
8e55b3aa 451 "W::"
7020f1e9
AD
452 "b:"
453 "d"
454 "e"
455 "g::"
456 "h"
457 "k"
458 "l"
459 "n"
460 "o:"
461 "p:"
462 "r:"
463 "t"
464 "v"
465 "x::"
466 "y"
467 ;
e2aaf4c4 468
d0829076
PE
469/* Values for long options that do not have single-letter equivalents. */
470enum
471{
f7ab6a50 472 LOCATIONS_OPTION = CHAR_MAX + 1,
d4bd2295 473 PRINT_LOCALEDIR_OPTION,
1bb2bd75
JD
474 PRINT_DATADIR_OPTION,
475 REPORT_FILE_OPTION
d0829076
PE
476};
477
e2aaf4c4
AD
478static struct option const long_options[] =
479{
480 /* Operation modes. */
7b42569e
AD
481 { "help", no_argument, 0, 'h' },
482 { "version", no_argument, 0, 'V' },
483 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
d4bd2295 484 { "print-datadir", no_argument, 0, PRINT_DATADIR_OPTION },
7b42569e 485 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
486
487 /* Parser. */
488 { "name-prefix", required_argument, 0, 'p' },
489 { "include", required_argument, 0, 'I' },
490
491 /* Output. */
492 { "file-prefix", required_argument, 0, 'b' },
493 { "output", required_argument, 0, 'o' },
494 { "output-file", required_argument, 0, 'o' },
495 { "graph", optional_argument, 0, 'g' },
41d7a5f2 496 { "xml", optional_argument, 0, 'x' },
e2aaf4c4 497 { "report", required_argument, 0, 'r' },
1bb2bd75 498 { "report-file", required_argument, 0, REPORT_FILE_OPTION },
e2aaf4c4
AD
499 { "verbose", no_argument, 0, 'v' },
500
501 /* Hidden. */
273a74fa 502 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 503
e2aaf4c4
AD
504 /* Output. */
505 { "defines", optional_argument, 0, 'd' },
506
507 /* Operation modes. */
508 { "fixed-output-files", no_argument, 0, 'y' },
509 { "yacc", no_argument, 0, 'y' },
510
511 /* Parser. */
512 { "debug", no_argument, 0, 't' },
e14c6831 513 { "define", required_argument, 0, 'D' },
34d41938 514 { "force-define", required_argument, 0, 'F' },
d0829076 515 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4 516 { "no-lines", no_argument, 0, 'l' },
e2aaf4c4
AD
517 { "raw", no_argument, 0, 0 },
518 { "skeleton", required_argument, 0, 'S' },
0e021770 519 { "language", required_argument, 0, 'L' },
e2aaf4c4
AD
520 { "token-table", no_argument, 0, 'k' },
521
522 {0, 0, 0, 0}
523};
524
ae404801
AD
525/* Under DOS, there is no difference on the case. This can be
526 troublesome when looking for `.tab' etc. */
527#ifdef MSDOS
528# define AS_FILE_NAME(File) (strlwr (File), (File))
529#else
530# define AS_FILE_NAME(File) (File)
531#endif
532
e14c6831
AD
533/* Build a location for the current command line argument. */
534static
535location
6f5be1ab 536command_line_location (void)
e14c6831
AD
537{
538 location res;
539 /* "<command line>" is used in GCC's messages about -D. */
540 boundary_set (&res.start, uniqstr_new ("<command line>"), optind, -1);
541 res.end = res.start;
542 return res;
543}
544
545
3d8fc6ca 546void
d2729d44 547getargs (int argc, char *argv[])
3d8fc6ca 548{
1916f98e 549 int c;
3d8fc6ca 550
08721544
PE
551 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
552 != -1)
cd5bd6ac
AD
553 switch (c)
554 {
e14c6831
AD
555 /* ASCII Sorting for short options (i.e., upper case then
556 lower case), and then long-only options. */
557
cd5bd6ac
AD
558 case 0:
559 /* Certain long options cause getopt_long to return 0. */
560 break;
561
e14c6831 562 case 'D': /* -DNAME[=VALUE]. */
34d41938 563 case 'F': /* -FNAME[=VALUE]. */
e14c6831
AD
564 {
565 char* name = optarg;
d143e9c3 566 char* value = mbschr (optarg, '=');
e14c6831 567 if (value)
c4eb1e84 568 *value++ = 0;
10fa0146 569 muscle_percent_define_insert (name, command_line_location (),
34d41938
JD
570 value ? value : "",
571 c == 'D' ? MUSCLE_PERCENT_DEFINE_D
572 : MUSCLE_PERCENT_DEFINE_F);
e14c6831 573 }
22c2cbc0
AD
574 break;
575
8e55b3aa
JD
576 case 'I':
577 include = AS_FILE_NAME (optarg);
41d7a5f2
PE
578 break;
579
0e021770 580 case 'L':
e186a284
AD
581 language_argmatch (optarg, command_line_prio,
582 command_line_location ());
0e021770
PE
583 break;
584
cd5bd6ac 585 case 'S':
e186a284
AD
586 skeleton_arg (AS_FILE_NAME (optarg), command_line_prio,
587 command_line_location ());
cd5bd6ac
AD
588 break;
589
8e55b3aa
JD
590 case 'T':
591 FLAGS_ARGMATCH (trace, optarg);
f6bd5427
MA
592 break;
593
8e55b3aa
JD
594 case 'V':
595 version ();
596 exit (EXIT_SUCCESS);
597
598 case 'W':
dab96632 599 FLAGS_ARGMATCH (warnings, optarg);
8e55b3aa
JD
600 break;
601
602 case 'b':
603 spec_file_prefix = AS_FILE_NAME (optarg);
604 break;
605
e14c6831
AD
606 case 'd':
607 /* Here, the -d and --defines options are differentiated. */
608 defines_flag = true;
609 if (optarg)
0b7fba13
AD
610 {
611 free (spec_defines_file);
612 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
613 }
e14c6831
AD
614 break;
615
8e55b3aa
JD
616 case 'g':
617 graph_flag = true;
618 if (optarg)
0b7fba13
AD
619 {
620 free (spec_graph_file);
621 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
622 }
cd5bd6ac
AD
623 break;
624
8e55b3aa
JD
625 case 'h':
626 usage (EXIT_SUCCESS);
627
7b42569e
AD
628 case 'k':
629 token_table_flag = true;
630 break;
631
cd5bd6ac 632 case 'l':
d0829076
PE
633 no_lines_flag = true;
634 break;
635
7b42569e
AD
636 case 'o':
637 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
638 break;
639
7b42569e
AD
640 case 'p':
641 spec_name_prefix = optarg;
642 break;
643
644 case 'r':
645 FLAGS_ARGMATCH (report, optarg);
646 break;
647
cd5bd6ac 648 case 't':
d0829076 649 debug_flag = true;
cd5bd6ac
AD
650 break;
651
7b42569e
AD
652 case 'v':
653 report_flag |= report_states;
cd5bd6ac
AD
654 break;
655
8e55b3aa
JD
656 case 'x':
657 xml_flag = true;
658 if (optarg)
0b7fba13
AD
659 {
660 free (spec_xml_file);
661 spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
662 }
cd5bd6ac
AD
663 break;
664
8e55b3aa
JD
665 case 'y':
666 yacc_flag = true;
ec3bc396
AD
667 break;
668
7b42569e
AD
669 case LOCATIONS_OPTION:
670 locations_flag = true;
273a74fa
AD
671 break;
672
7b42569e
AD
673 case PRINT_LOCALEDIR_OPTION:
674 printf ("%s\n", LOCALEDIR);
675 exit (EXIT_SUCCESS);
676
d4bd2295
JD
677 case PRINT_DATADIR_OPTION:
678 printf ("%s\n", compute_pkgdatadir ());
679 exit (EXIT_SUCCESS);
680
8e55b3aa 681 case REPORT_FILE_OPTION:
0b7fba13 682 free (spec_verbose_file);
8e55b3aa
JD
683 spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
684 break;
685
cd5bd6ac 686 default:
0df27e8b 687 usage (EXIT_FAILURE);
cd5bd6ac 688 }
3d8fc6ca 689
a4b6efd4 690 if (argc - optind != 1)
3d8fc6ca 691 {
a4b6efd4 692 if (argc - optind < 1)
4c787a31 693 error (0, 0, _("%s: missing operand"), quotearg_colon (argv[argc - 1]));
a4b6efd4 694 else
4c787a31 695 error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
0e575721 696 usage (EXIT_FAILURE);
3d8fc6ca 697 }
3d8fc6ca 698
d38a11a6 699 current_file = grammar_file = uniqstr_new (argv[optind]);
75c21b61 700 MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
3d8fc6ca 701}
812775a0
JD
702
703void
704tr (char *s, char from, char to)
705{
706 for (; *s; s++)
707 if (*s == from)
708 *s = to;
709}