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