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