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