]> git.saurik.com Git - bison.git/blame - src/getargs.c
* src/getargs.c (report_argmatch): Initialize strtok().
[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"
b0ce6046 25#include "complain.h"
ceed8467 26#include "getargs.h"
82b6d266 27#include "options.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;
ec3bc396 35int report_flag = 0;
89cab50d 36int token_table_flag = 0;
89cab50d 37int yacc_flag = 0; /* for -y */
22c2cbc0 38int graph_flag = 0;
9bfe901c 39int trace_flag = 0;
d2729d44 40
b0ce6046 41const char *skeleton = NULL;
f6bd5427 42const char *include = NULL;
b0ce6046 43
cbd8ffc5 44extern char *program_name;
3d8fc6ca 45
ec3bc396
AD
46/*----------------------.
47| --report's handling. |
48`----------------------*/
49
50static const char * const report_args[] =
51{
52 /* In a series of synonyms, present the most meaningful first, so
53 that argmatch_valid be more readable. */
54 "none",
55 "state", "states",
56 "itemset", "itemsets",
57 "lookahead", "lookaheads",
b408954b 58 "solved",
ec3bc396
AD
59 "all",
60 0
61};
62
63static const int report_types[] =
64{
65 report_none,
66 report_states, report_states,
67 report_states | report_itemsets, report_states | report_itemsets,
68 report_states | report_lookaheads, report_states | report_lookaheads,
b408954b 69 report_states | report_solved_conflicts,
ec3bc396
AD
70 report_all
71};
72
73
74static void
75report_argmatch (char *args)
76{
77 ARGMATCH_ASSERT (report_args, report_types);
9be0c25b 78 args = strtok (args, ",");
ec3bc396
AD
79 do
80 {
81 int report = XARGMATCH ("--report", args,
82 report_args, report_types);
83 if (report == report_none)
84 report_flag = report_none;
85 else
86 report_flag |= report;
87 }
88 while ((args = strtok (NULL, ",")));
89}
90
9f306f2a
AD
91/*---------------------------.
92| Display the help message. |
93`---------------------------*/
e79137ac 94
4a120d45 95static void
d2729d44 96usage (FILE *stream)
cbd8ffc5 97{
9f306f2a
AD
98 /* Some efforts were made to ease the translators' task, please
99 continue. */
a0f6b076
AD
100 fputs (_("\
101GNU bison generates parsers for LALR(1) grammars.\n"), stream);
9f306f2a
AD
102 putc ('\n', stream);
103
104 fprintf (stream, _("\
105Usage: %s [OPTION]... FILE\n"), program_name);
106 putc ('\n', stream);
107
108 fputs (_("\
109If a long option shows an argument as mandatory, then it is mandatory\n\
110for the equivalent short option also. Similarly for optional arguments.\n"),
111 stream);
112 putc ('\n', stream);
113
a0f6b076 114 fputs (_("\
9f306f2a
AD
115Operation modes:\n\
116 -h, --help display this help and exit\n\
117 -V, --version output version information and exit\n\
a0f6b076 118 -y, --yacc emulate POSIX yacc\n"), stream);
9f306f2a
AD
119 putc ('\n', stream);
120
a0f6b076 121 fputs (_("\
9f306f2a 122Parser:\n\
cd5bd6ac 123 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 124 -t, --debug instrument the parser for debugging\n\
89cab50d 125 --locations enable locations computation\n\
9f306f2a
AD
126 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
127 -l, --no-lines don't generate `#line' directives\n\
128 -n, --no-parser generate the tables only\n\
9f306f2a 129 -k, --token-table include a table of token names\n\
a0f6b076 130"), stream);
9f306f2a
AD
131 putc ('\n', stream);
132
a0f6b076 133 fputs (_("\
9f306f2a
AD
134Output:\n\
135 -d, --defines also produce a header file\n\
ec3bc396
AD
136 -r, --report=THINGS also produce details on the automaton\n\
137 -v, --verbose same as `--report=state'\n\
9f306f2a 138 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
139 -o, --output=FILE leave output to FILE\n\
140 -g, --graph also produce a VCG description of the automaton\n\
86eff183
AD
141"), stream);
142 putc ('\n', stream);
143
144 fputs (_("\
ec3bc396
AD
145THINGS is a list of comma separated words that can include:\n\
146 `state' describe the states\n\
147 `itemset' complete the core item sets with their closure\n\
148 `lookahead' explicitly associate lookaheads to items\n\
b408954b 149 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
150 `all' include all the above information\n\
151 `none' disable the report\n\
951366c1 152"), stream);
9f306f2a
AD
153 putc ('\n', stream);
154
a0f6b076
AD
155 fputs (_("\
156Report bugs to <bug-bison@gnu.org>.\n"), stream);
cbd8ffc5
DM
157}
158
e79137ac
AD
159
160/*------------------------------.
161| Display the version message. |
162`------------------------------*/
163
164static void
165version (FILE *stream)
166{
167 /* Some efforts were made to ease the translators' task, please
168 continue. */
06b00abc 169 fprintf (stream, _("bison (GNU Bison) %s"), VERSION);
e79137ac 170 putc ('\n', stream);
06b00abc 171 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stream);
e79137ac
AD
172 putc ('\n', stream);
173
06b00abc
AD
174 fprintf (stream,
175 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
e79137ac
AD
176
177 fputs (_("\
178This is free software; see the source for copying conditions. There is NO\n\
179warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
180"),
181 stream);
182}
183
184
185/*----------------------.
186| Process the options. |
187`----------------------*/
188
ae404801
AD
189/* Under DOS, there is no difference on the case. This can be
190 troublesome when looking for `.tab' etc. */
191#ifdef MSDOS
192# define AS_FILE_NAME(File) (strlwr (File), (File))
193#else
194# define AS_FILE_NAME(File) (File)
195#endif
196
3d8fc6ca 197void
d2729d44 198getargs (int argc, char *argv[])
3d8fc6ca 199{
1916f98e 200 int c;
3d8fc6ca 201
f51cb8ff 202 struct option *longopts = long_option_table_new ();
cd5bd6ac
AD
203 while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != EOF)
204 switch (c)
205 {
206 case 0:
207 /* Certain long options cause getopt_long to return 0. */
208 break;
209
210 case 'y':
211 yacc_flag = 1;
212 break;
213
214 case 'h':
215 usage (stdout);
216 exit (0);
217
218 case 'V':
219 version (stdout);
220 exit (0);
221
22c2cbc0 222 case 'g':
342b8b6e 223 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 224 graph_flag = 1;
ae404801 225 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
226 break;
227
cd5bd6ac 228 case 'v':
ec3bc396 229 report_flag |= report_states;
cd5bd6ac
AD
230 break;
231
232 case 'S':
ae404801 233 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
234 break;
235
f6bd5427 236 case 'I':
ae404801 237 include = AS_FILE_NAME (optarg);
f6bd5427
MA
238 break;
239
cd5bd6ac 240 case 'd':
342b8b6e 241 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 242 defines_flag = 1;
ae404801
AD
243 if (optarg)
244 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
245 break;
246
247 case 'l':
248 no_lines_flag = 1;
249 break;
250
251 case 'k':
252 token_table_flag = 1;
253 break;
254
cd5bd6ac
AD
255 case 'n':
256 no_parser_flag = 1;
257 break;
258
259 case 't':
260 debug_flag = 1;
261 break;
262
263 case 'o':
ae404801 264 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
265 break;
266
267 case 'b':
ae404801 268 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
269 break;
270
271 case 'p':
272 spec_name_prefix = optarg;
273 break;
274
ec3bc396
AD
275 case 'r':
276 report_argmatch (optarg);
277 break;
278
cd5bd6ac
AD
279 default:
280 fprintf (stderr, _("Try `%s --help' for more information.\n"),
281 program_name);
282 exit (1);
283 }
3d8fc6ca 284
f51cb8ff
AD
285 free (longopts);
286
3d8fc6ca
RS
287 if (optind == argc)
288 {
e79137ac
AD
289 fprintf (stderr, _("%s: no grammar file given\n"), program_name);
290 exit (1);
3d8fc6ca
RS
291 }
292 if (optind < argc - 1)
e79137ac
AD
293 fprintf (stderr, _("%s: extra arguments ignored after `%s'\n"),
294 program_name, argv[optind]);
3d8fc6ca
RS
295
296 infile = argv[optind];
297}