]> git.saurik.com Git - bison.git/blame - src/getargs.c
* src/struniq.h, src/struniq.c (struniq_t): Is const.
[bison.git] / src / getargs.c
CommitLineData
9f306f2a 1/* Parse command line arguments for bison.
a4b6efd4 2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
06b00abc 3 Free Software Foundation, Inc.
3d8fc6ca 4
9f306f2a 5 This file is part of Bison, the GNU Compiler Compiler.
3d8fc6ca 6
9f306f2a
AD
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
3d8fc6ca 11
9f306f2a
AD
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
3d8fc6ca 16
9f306f2a
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
3d8fc6ca 21
3d8fc6ca 22#include "system.h"
ec3bc396
AD
23#include "getopt.h"
24#include "argmatch.h"
0e575721 25#include "error.h"
b0ce6046 26#include "complain.h"
95612cfa 27#include "struniq.h"
ceed8467 28#include "getargs.h"
ec3bc396 29#include "files.h"
3d8fc6ca 30
89cab50d
AD
31int debug_flag = 0;
32int defines_flag = 0;
33int locations_flag = 0;
34int no_lines_flag = 0;
35int no_parser_flag = 0;
273a74fa 36int report_flag = report_none;
89cab50d 37int token_table_flag = 0;
89cab50d 38int yacc_flag = 0; /* for -y */
22c2cbc0 39int graph_flag = 0;
273a74fa 40int trace_flag = trace_none;
d2729d44 41
b0ce6046 42const char *skeleton = NULL;
f6bd5427 43const char *include = NULL;
b0ce6046 44
cbd8ffc5 45extern char *program_name;
3d8fc6ca 46
273a74fa
AD
47
48/*---------------------.
49| --trace's handling. |
50`---------------------*/
51
52static const char * const trace_args[] =
53{
54 /* In a series of synonyms, present the most meaningful first, so
55 that argmatch_valid be more readable. */
56 "none - no report",
473d0a75
AD
57 "scan - scanner traces",
58 "parse - parser traces",
273a74fa
AD
59 "automaton - contruction of the automaton",
60 "bitsets - use of bitsets",
61 "grammar - reading, reducing of the grammar",
1509d42f 62 "resource - memory consumption (where available)",
273a74fa 63 "sets - grammar sets: firsts, nullable etc.",
1509d42f 64 "time - time consumption",
273a74fa
AD
65 "tools - m4 invocation and preserve the temporary file",
66 "all - all of the above",
67 0
68};
69
70static const int trace_types[] =
71{
72 trace_none,
473d0a75
AD
73 trace_scan,
74 trace_parse,
273a74fa
AD
75 trace_automaton,
76 trace_bitsets,
77 trace_grammar,
78 trace_resource,
79 trace_sets,
1509d42f 80 trace_time,
273a74fa
AD
81 trace_tools,
82 trace_all
83};
84
85
86static void
87trace_argmatch (char *args)
88{
89 ARGMATCH_ASSERT (trace_args, trace_types);
90 if (args)
91 {
92 args = strtok (args, ",");
93 do
94 {
95 int trace = XARGMATCH ("--trace", args,
96 trace_args, trace_types);
97 if (trace == trace_none)
98 trace_flag = trace_none;
99 else
100 trace_flag |= trace;
101 }
102 while ((args = strtok (NULL, ",")));
103 }
104 else
105 trace_flag = trace_all;
106}
107
108
ec3bc396
AD
109/*----------------------.
110| --report's handling. |
111`----------------------*/
112
113static const char * const report_args[] =
114{
115 /* In a series of synonyms, present the most meaningful first, so
116 that argmatch_valid be more readable. */
117 "none",
118 "state", "states",
119 "itemset", "itemsets",
120 "lookahead", "lookaheads",
b408954b 121 "solved",
ec3bc396
AD
122 "all",
123 0
124};
125
126static const int report_types[] =
127{
128 report_none,
129 report_states, report_states,
130 report_states | report_itemsets, report_states | report_itemsets,
131 report_states | report_lookaheads, report_states | report_lookaheads,
b408954b 132 report_states | report_solved_conflicts,
ec3bc396
AD
133 report_all
134};
135
136
137static void
138report_argmatch (char *args)
139{
140 ARGMATCH_ASSERT (report_args, report_types);
9be0c25b 141 args = strtok (args, ",");
ec3bc396
AD
142 do
143 {
144 int report = XARGMATCH ("--report", args,
145 report_args, report_types);
146 if (report == report_none)
147 report_flag = report_none;
148 else
149 report_flag |= report;
150 }
151 while ((args = strtok (NULL, ",")));
152}
153
0e575721
AD
154
155/*-------------------------------------------.
156| Display the help message and exit STATUS. |
157`-------------------------------------------*/
e79137ac 158
0df27e8b
PE
159static void usage (int) ATTRIBUTE_NORETURN;
160
4a120d45 161static void
0e575721 162usage (int status)
cbd8ffc5 163{
0e575721
AD
164 if (status != 0)
165 fprintf (stderr, _("Try `%s --help' for more information.\n"),
166 program_name);
167 else
168 {
169 /* Some efforts were made to ease the translators' task, please
170 continue. */
171 fputs (_("\
172GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
173 putc ('\n', stdout);
9f306f2a 174
0e575721 175 fprintf (stdout, _("\
9f306f2a 176Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 177 putc ('\n', stdout);
9f306f2a 178
0e575721 179 fputs (_("\
9f306f2a
AD
180If a long option shows an argument as mandatory, then it is mandatory\n\
181for the equivalent short option also. Similarly for optional arguments.\n"),
0e575721
AD
182 stdout);
183 putc ('\n', stdout);
9f306f2a 184
0e575721 185 fputs (_("\
9f306f2a
AD
186Operation modes:\n\
187 -h, --help display this help and exit\n\
188 -V, --version output version information and exit\n\
0e575721
AD
189 -y, --yacc emulate POSIX yacc\n"), stdout);
190 putc ('\n', stdout);
9f306f2a 191
0e575721 192 fputs (_("\
9f306f2a 193Parser:\n\
cd5bd6ac 194 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 195 -t, --debug instrument the parser for debugging\n\
89cab50d 196 --locations enable locations computation\n\
9f306f2a
AD
197 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
198 -l, --no-lines don't generate `#line' directives\n\
199 -n, --no-parser generate the tables only\n\
9f306f2a 200 -k, --token-table include a table of token names\n\
0e575721
AD
201"), stdout);
202 putc ('\n', stdout);
9f306f2a 203
0e575721 204 fputs (_("\
9f306f2a
AD
205Output:\n\
206 -d, --defines also produce a header file\n\
ec3bc396
AD
207 -r, --report=THINGS also produce details on the automaton\n\
208 -v, --verbose same as `--report=state'\n\
9f306f2a 209 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
210 -o, --output=FILE leave output to FILE\n\
211 -g, --graph also produce a VCG description of the automaton\n\
0e575721
AD
212"), stdout);
213 putc ('\n', stdout);
86eff183 214
0e575721 215 fputs (_("\
ec3bc396
AD
216THINGS is a list of comma separated words that can include:\n\
217 `state' describe the states\n\
218 `itemset' complete the core item sets with their closure\n\
219 `lookahead' explicitly associate lookaheads to items\n\
b408954b 220 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
221 `all' include all the above information\n\
222 `none' disable the report\n\
0e575721
AD
223"), stdout);
224 putc ('\n', stdout);
9f306f2a 225
0e575721
AD
226 fputs (_("\
227Report bugs to <bug-bison@gnu.org>.\n"), stdout);
228 }
229
230 exit (status);
cbd8ffc5
DM
231}
232
e79137ac
AD
233
234/*------------------------------.
235| Display the version message. |
236`------------------------------*/
237
238static void
0e575721 239version (void)
e79137ac
AD
240{
241 /* Some efforts were made to ease the translators' task, please
242 continue. */
0e575721
AD
243 printf (_("bison (GNU Bison) %s"), VERSION);
244 putc ('\n', stdout);
245 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
246 putc ('\n', stdout);
e79137ac 247
0e575721 248 fprintf (stdout,
06b00abc 249 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
e79137ac
AD
250
251 fputs (_("\
252This is free software; see the source for copying conditions. There is NO\n\
253warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
254"),
0e575721 255 stdout);
e79137ac
AD
256}
257
258
259/*----------------------.
260| Process the options. |
261`----------------------*/
262
e2aaf4c4 263/* Shorts options. */
273a74fa 264const char *short_options = "yvegdhr:ltknVo:b:p:S:T::";
e2aaf4c4
AD
265
266static struct option const long_options[] =
267{
268 /* Operation modes. */
269 { "help", no_argument, 0, 'h' },
270 { "version", no_argument, 0, 'V' },
271
272 /* Parser. */
273 { "name-prefix", required_argument, 0, 'p' },
274 { "include", required_argument, 0, 'I' },
275
276 /* Output. */
277 { "file-prefix", required_argument, 0, 'b' },
278 { "output", required_argument, 0, 'o' },
279 { "output-file", required_argument, 0, 'o' },
280 { "graph", optional_argument, 0, 'g' },
281 { "report", required_argument, 0, 'r' },
282 { "verbose", no_argument, 0, 'v' },
283
284 /* Hidden. */
273a74fa 285 { "trace", optional_argument, 0, 'T' },
e2aaf4c4
AD
286
287 /* FIXME: semantic parsers will output an `include' of an
288 output file: be sure that the naem included is indeed the name of
289 the output file. */ /* FIXME Should we activate this options ?
290 */
291 { "output", required_argument, 0, 'o' },
292 { "file-prefix", required_argument, 0, 'b' },
293 { "name-prefix", required_argument, 0, 'p' },
294
295 /*
296 * Percent and command line declarations.
297 */
298
299 /* Output. */
300 { "defines", optional_argument, 0, 'd' },
301
302 /* Operation modes. */
303 { "fixed-output-files", no_argument, 0, 'y' },
304 { "yacc", no_argument, 0, 'y' },
305
306 /* Parser. */
307 { "debug", no_argument, 0, 't' },
308 { "locations", no_argument, &locations_flag, 1 },
309 { "no-lines", no_argument, 0, 'l' },
310 { "no-parser", no_argument, 0, 'n' },
311 { "raw", no_argument, 0, 0 },
312 { "skeleton", required_argument, 0, 'S' },
313 { "token-table", no_argument, 0, 'k' },
314
315 {0, 0, 0, 0}
316};
317
ae404801
AD
318/* Under DOS, there is no difference on the case. This can be
319 troublesome when looking for `.tab' etc. */
320#ifdef MSDOS
321# define AS_FILE_NAME(File) (strlwr (File), (File))
322#else
323# define AS_FILE_NAME(File) (File)
324#endif
325
3d8fc6ca 326void
d2729d44 327getargs (int argc, char *argv[])
3d8fc6ca 328{
1916f98e 329 int c;
3d8fc6ca 330
e2aaf4c4 331 while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) != EOF)
cd5bd6ac
AD
332 switch (c)
333 {
334 case 0:
335 /* Certain long options cause getopt_long to return 0. */
336 break;
337
338 case 'y':
339 yacc_flag = 1;
340 break;
341
342 case 'h':
0df27e8b 343 usage (EXIT_SUCCESS);
cd5bd6ac
AD
344
345 case 'V':
0e575721 346 version ();
0df27e8b 347 exit (EXIT_SUCCESS);
cd5bd6ac 348
22c2cbc0 349 case 'g':
342b8b6e 350 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 351 graph_flag = 1;
ae404801 352 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
353 break;
354
cd5bd6ac 355 case 'v':
ec3bc396 356 report_flag |= report_states;
cd5bd6ac
AD
357 break;
358
359 case 'S':
ae404801 360 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
361 break;
362
f6bd5427 363 case 'I':
ae404801 364 include = AS_FILE_NAME (optarg);
f6bd5427
MA
365 break;
366
cd5bd6ac 367 case 'd':
342b8b6e 368 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 369 defines_flag = 1;
ae404801
AD
370 if (optarg)
371 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
372 break;
373
374 case 'l':
375 no_lines_flag = 1;
376 break;
377
378 case 'k':
379 token_table_flag = 1;
380 break;
381
cd5bd6ac
AD
382 case 'n':
383 no_parser_flag = 1;
384 break;
385
386 case 't':
387 debug_flag = 1;
388 break;
389
390 case 'o':
ae404801 391 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
392 break;
393
394 case 'b':
ae404801 395 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
396 break;
397
398 case 'p':
399 spec_name_prefix = optarg;
400 break;
401
ec3bc396
AD
402 case 'r':
403 report_argmatch (optarg);
404 break;
405
273a74fa
AD
406 case 'T':
407 trace_argmatch (optarg);
408 break;
409
cd5bd6ac 410 default:
0df27e8b 411 usage (EXIT_FAILURE);
cd5bd6ac 412 }
3d8fc6ca 413
a4b6efd4 414 if (argc - optind != 1)
3d8fc6ca 415 {
a4b6efd4
PE
416 if (argc - optind < 1)
417 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
418 else
419 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 420 usage (EXIT_FAILURE);
3d8fc6ca 421 }
3d8fc6ca 422
95612cfa 423 current_file = grammar_file = struniq_new (argv[optind]);
3d8fc6ca 424}