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