]> git.saurik.com Git - bison.git/blame - src/getargs.c
tests: fix empty unions.
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
ea0a7676
JD
3 Copyright (C) 1984, 1986, 1989, 1992, 2000-2011 Free Software
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>
75c21b61 29#include <quotearg.h>
f47dbf6b
PE
30
31/* Hack to get <getopt.h> to declare getopt with a prototype. */
32#if lint && ! defined __GNU_LIBRARY__
33# define __GNU_LIBRARY__
34# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
35#endif
36
d38a11a6
PE
37#include <getopt.h>
38
f47dbf6b
PE
39#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
40# undef __GNU_LIBRARY__
41# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
42#endif
43
b0ce6046 44#include "complain.h"
ec3bc396 45#include "files.h"
d38a11a6 46#include "getargs.h"
23ec25b7 47#include "muscle-tab.h"
d38a11a6 48#include "uniqstr.h"
3d8fc6ca 49
d0829076
PE
50bool debug_flag;
51bool defines_flag;
4e83ea15 52bool graph_flag;
41d7a5f2 53bool xml_flag;
d0829076
PE
54bool locations_flag;
55bool no_lines_flag;
d0829076
PE
56bool token_table_flag;
57bool yacc_flag; /* for -y */
4e83ea15
AD
58
59bool error_verbose = false;
d2729d44 60
916708d5
AD
61bool nondeterministic_parser = false;
62bool glr_parser = false;
916708d5 63
4e83ea15
AD
64int report_flag = report_none;
65int trace_flag = trace_none;
6f8bdce2
JD
66int warnings_flag = warnings_conflicts_sr | warnings_conflicts_rr
67 | warnings_other;
4e83ea15 68
0e021770
PE
69static struct bison_language const valid_languages[] = {
70 { "c", "c-skel.m4", ".c", ".h", true },
71 { "c++", "c++-skel.m4", ".cc", ".hh", true },
8405b70c 72 { "java", "java-skel.m4", ".java", ".java", false },
0e021770
PE
73 { "", "", "", "", false }
74};
75
4b1ebc49 76int skeleton_prio = default_prio;
b0ce6046 77const char *skeleton = NULL;
4b1ebc49 78int language_prio = default_prio;
0e021770 79struct bison_language const *language = &valid_languages[0];
f6bd5427 80const char *include = NULL;
b0ce6046 81
0e021770 82char *program_name;
3d8fc6ca 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++)
d7e0a1a7 421 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
0e021770
PE
422 {
423 language_prio = prio;
424 language = &valid_languages[i];
425 return;
426 }
427 msg = _("invalid language `%s'");
428 }
429 else if (language_prio == prio)
430 msg = _("multiple language declarations are invalid");
431 else
432 return;
433
e186a284 434 complain_at (loc, msg, 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)
609 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
610 break;
611
8e55b3aa
JD
612 case 'g':
613 graph_flag = true;
614 if (optarg)
615 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
616 break;
617
8e55b3aa
JD
618 case 'h':
619 usage (EXIT_SUCCESS);
620
7b42569e
AD
621 case 'k':
622 token_table_flag = true;
623 break;
624
cd5bd6ac 625 case 'l':
d0829076
PE
626 no_lines_flag = true;
627 break;
628
7b42569e
AD
629 case 'o':
630 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
631 break;
632
7b42569e
AD
633 case 'p':
634 spec_name_prefix = optarg;
635 break;
636
637 case 'r':
638 FLAGS_ARGMATCH (report, optarg);
639 break;
640
cd5bd6ac 641 case 't':
d0829076 642 debug_flag = true;
cd5bd6ac
AD
643 break;
644
7b42569e
AD
645 case 'v':
646 report_flag |= report_states;
cd5bd6ac
AD
647 break;
648
8e55b3aa
JD
649 case 'x':
650 xml_flag = true;
651 if (optarg)
652 spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
653 break;
654
8e55b3aa
JD
655 case 'y':
656 yacc_flag = true;
ec3bc396
AD
657 break;
658
7b42569e
AD
659 case LOCATIONS_OPTION:
660 locations_flag = true;
273a74fa
AD
661 break;
662
7b42569e
AD
663 case PRINT_LOCALEDIR_OPTION:
664 printf ("%s\n", LOCALEDIR);
665 exit (EXIT_SUCCESS);
666
d4bd2295
JD
667 case PRINT_DATADIR_OPTION:
668 printf ("%s\n", compute_pkgdatadir ());
669 exit (EXIT_SUCCESS);
670
8e55b3aa
JD
671 case REPORT_FILE_OPTION:
672 spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
673 break;
674
cd5bd6ac 675 default:
0df27e8b 676 usage (EXIT_FAILURE);
cd5bd6ac 677 }
3d8fc6ca 678
a4b6efd4 679 if (argc - optind != 1)
3d8fc6ca 680 {
a4b6efd4
PE
681 if (argc - optind < 1)
682 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
683 else
684 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 685 usage (EXIT_FAILURE);
3d8fc6ca 686 }
3d8fc6ca 687
d38a11a6 688 current_file = grammar_file = uniqstr_new (argv[optind]);
75c21b61 689 MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
3d8fc6ca 690}
812775a0
JD
691
692void
693tr (char *s, char from, char to)
694{
695 for (; *s; s++)
696 if (*s == from)
697 *s = to;
698}