1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Parse command line arguments for Bison.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "output.h"
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <argmatch.h>
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <c-strcase.h>
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <configmake.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <error.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Hack to get <getopt.h> to declare getopt with a prototype.  */
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if lint && ! defined __GNU_LIBRARY__
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define __GNU_LIBRARY__
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <getopt.h>
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undef __GNU_LIBRARY__
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <progname.h>
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h"
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h"
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "muscle-tab.h"
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "quote.h"
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "uniqstr.h"
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool debug;
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool defines_flag;
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool graph_flag;
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool xml_flag;
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool locations_flag;
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool no_lines_flag;
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool token_table_flag;
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool yacc_flag;	/* for -y */
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool error_verbose = false;
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool nondeterministic_parser = false;
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool glr_parser = false;
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wangint feature_flag = feature_none;
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint report_flag = report_none;
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint trace_flag = trace_none;
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wangint warnings_flag = warnings_conflicts_sr | warnings_conflicts_rr
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    | warnings_other;
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic struct bison_language const valid_languages[] = {
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "c", "c-skel.m4", ".c", ".h", true },
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "c++", "c++-skel.m4", ".cc", ".hh", true },
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "java", "java-skel.m4", ".java", ".java", false },
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "", "", "", "", false }
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wangint skeleton_prio = default_prio;
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconst char *skeleton = NULL;
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wangint language_prio = default_prio;
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct bison_language const *language = &valid_languages[0];
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconst char *include = NULL;
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Decode an option's set of keys.
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang *
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param option   option being decoded.
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param keys     array of valid subarguments.
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param values   array of corresponding (int) values.
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param all      the all value.
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param flags    the flags to update
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param args     comma separated list of effective subarguments to decode.
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang *                  If 0, then activate all the flags.
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  If VALUE != 0 then KEY sets flags and no-KEY clears them.
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  flags from \c all.  Thus no-none = all and no-all = none.
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wangflags_argmatch (const char *option,
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		const char * const keys[], const int values[],
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		int all, int *flags, char *args)
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (args)
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      args = strtok (args, ",");
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      while (args)
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	{
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  int no = strncmp (args, "no-", 3) == 0 ? 3 : 0;
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  int value = XARGMATCH (option, args + no, keys, values);
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  if (value == 0)
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    {
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      if (no)
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		*flags |= all;
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      else
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		*flags &= ~all;
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    }
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  else
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    {
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      if (no)
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		*flags &= ~value;
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      else
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		*flags |= value;
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    }
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  args = strtok (NULL, ",");
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	}
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *flags |= all;
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Decode a set of sub arguments.
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang *
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param FlagName  the flag familly to update.
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \param Args      the effective sub arguments to decode.
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang *
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \arg FlagName_args   the list of keys.
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \arg FlagName_types  the list of values.
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \arg FlagName_all    the all value.
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang *  \arg FlagName_flag   the flag to update.
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FLAGS_ARGMATCH(FlagName, Args)					\
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  FlagName ## _all, &FlagName ## _flag, Args)
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*----------------------.
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| --report's handling.  |
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang`----------------------*/
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * const report_args[] =
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* In a series of synonyms, present the most meaningful first, so
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     that argmatch_valid be more readable.  */
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "none",
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "state", "states",
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "itemset", "itemsets",
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "lookahead", "lookaheads", "look-ahead",
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "solved",
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "all",
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  0
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const int report_types[] =
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_none,
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states, report_states,
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states | report_itemsets, report_states | report_itemsets,
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states | report_lookahead_tokens,
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states | report_lookahead_tokens,
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states | report_lookahead_tokens,
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_states | report_solved_conflicts,
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  report_all
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17705436638acc7c010349a69c3395f1a57c642dc62Ying WangARGMATCH_VERIFY (report_args, report_types);
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------.
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| --trace's handling.  |
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------*/
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic const char * const trace_args[] =
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* In a series of synonyms, present the most meaningful first, so
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     that argmatch_valid be more readable.  */
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "none       - no traces",
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "scan       - grammar scanner traces",
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "parse      - grammar parser traces",
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "automaton  - construction of the automaton",
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "bitsets    - use of bitsets",
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "grammar    - reading, reducing the grammar",
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "resource   - memory consumption (where available)",
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "sets       - grammar sets: firsts, nullable etc.",
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "muscles    - m4 definitions passed to the skeleton",
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "tools      - m4 invocation",
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "m4         - m4 traces",
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "skeleton   - skeleton postprocessing",
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "time       - time consumption",
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "ielr       - IELR conversion",
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  "all        - all of the above",
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  0
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic const int trace_types[] =
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_none,
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_scan,
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_parse,
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_automaton,
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_bitsets,
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_grammar,
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_resource,
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_sets,
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trace_muscles,
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_tools,
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_m4,
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_skeleton,
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_time,
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trace_ielr,
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  trace_all
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectARGMATCH_VERIFY (trace_args, trace_types);
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*------------------------.
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| --warnings's handling.  |
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang`------------------------*/
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * const warnings_args[] =
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* In a series of synonyms, present the most meaningful first, so
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     that argmatch_valid be more readable.  */
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "none            - no warnings",
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "midrule-values  - unset or unused midrule values",
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "yacc            - incompatibilities with POSIX Yacc",
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "conflicts-sr    - S/R conflicts",
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "conflicts-rr    - R/R conflicts",
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "other           - all other warnings",
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "all             - all of the above",
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "error           - warnings are errors",
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  0
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const int warnings_types[] =
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_none,
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_midrule_values,
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_yacc,
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_conflicts_sr,
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_conflicts_rr,
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_other,
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_all,
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  warnings_error
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25905436638acc7c010349a69c3395f1a57c642dc62Ying WangARGMATCH_VERIFY (warnings_args, warnings_types);
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-----------------------.
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| --feature's handling.  |
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-----------------------*/
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * const feature_args[] =
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "none",
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "caret", "diagnostics-show-caret",
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "all",
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  0
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const int feature_types[] =
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  feature_none,
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  feature_caret, feature_caret,
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  feature_all
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28005436638acc7c010349a69c3395f1a57c642dc62Ying WangARGMATCH_VERIFY (feature_args, feature_types);
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------.
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Display the help message and exit STATUS.  |
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------*/
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void usage (int) ATTRIBUTE_NORETURN;
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectusage (int status)
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (status != 0)
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (stderr, _("Try `%s --help' for more information.\n"),
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     program_name);
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* For ../build-aux/cross-options.pl to work, use the format:
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		^  -S, --long[=ARGS] (whitespace)
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 A --long option is required.
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 Otherwise, add exceptions to ../build-aux/cross-options.pl.  */
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (_("\
30305436638acc7c010349a69c3395f1a57c642dc62Ying WangGenerate a deterministic LR or generalized LR (GLR) parser employing\n\
30405436638acc7c010349a69c3395f1a57c642dc62Ying WangLALR(1), IELR(1), or canonical LR(1) parser tables.  IELR(1) and\n\
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wangcanonical LR(1) support is experimental.\n\
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang\n\
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang"), stdout);
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
31005436638acc7c010349a69c3395f1a57c642dc62Ying WangMandatory arguments to long options are mandatory for short options too.\n\
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang"), stdout);
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (_("\
31305436638acc7c010349a69c3395f1a57c642dc62Ying WangThe same is true for optional arguments.\n\
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang"), stdout);
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang\n\
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOperation modes:\n\
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -h, --help                 display this help and exit\n\
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -V, --version              output version information and exit\n\
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      --print-localedir      output directory containing locale-dependent data\n\
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      --print-datadir        output directory containing skeletons and XSLT\n\
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -y, --yacc                 emulate POSIX Yacc\n\
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n\
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -f, --feature[=FEATURE]    activate miscellaneous features\n\
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang\n\
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang"), stdout);
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectParser:\n\
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -L, --language=LANGUAGE          specify the output programming language\n\
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -S, --skeleton=FILE              specify the skeleton to use\n\
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -t, --debug                      instrument the parser for debugging\n\
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      --locations                  enable location support\n\
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -D, --define=NAME[=VALUE]        similar to '%define NAME \"VALUE\"'\n\
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -F, --force-define=NAME[=VALUE]  override '%define NAME \"VALUE\"'\n\
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -p, --name-prefix=PREFIX         prepend PREFIX to the external symbols\n\
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   deprecated by '-Dapi.prefix=PREFIX'\n\
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -l, --no-lines                   don't generate '#line' directives\n\
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -k, --token-table                include a table of token names\n\
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"), stdout);
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      putc ('\n', stdout);
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       * won't assume that -d also takes an argument.  */
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOutput:\n\
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      --defines[=FILE]       also produce a header file\n\
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -d                         likewise but cannot specify FILE (for POSIX Yacc)\n\
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -r, --report=THINGS        also produce details on the automaton\n\
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      --report-file=FILE     write report to FILE\n\
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -v, --verbose              same as `--report=state'\n\
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  -o, --output=FILE          leave output to FILE\n\
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -g, --graph[=FILE]         also output a graph of the automaton\n\
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -x, --xml[=FILE]           also output an XML report of the automaton\n\
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             (the XML schema is experimental)\n\
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang"), stdout);
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      putc ('\n', stdout);
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (_("\
36205436638acc7c010349a69c3395f1a57c642dc62Ying WangWarning categories include:\n\
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `midrule-values'  unset or unused midrule values\n\
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `yacc'            incompatibilities with POSIX Yacc\n\
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `conflicts-sr'    S/R conflicts (enabled by default)\n\
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `conflicts-rr'    R/R conflicts (enabled by default)\n\
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `deprecated'      obsolete constructs\n\
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `other'           all other warnings (enabled by default)\n\
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `all'             all the warnings\n\
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `no-CATEGORY'     turn off warnings in CATEGORY\n\
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `none'            turn off all the warnings\n\
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `error'           treat warnings as errors\n\
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"), stdout);
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      putc ('\n', stdout);
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectTHINGS is a list of comma separated words that can include:\n\
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  `state'        describe the states\n\
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  `itemset'      complete the core item sets with their closure\n\
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `lookahead'    explicitly associate lookahead tokens to items\n\
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  `solved'       describe shift/reduce conflicts solving\n\
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  `all'          include all the above information\n\
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  `none'         disable the report\n\
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"), stdout);
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      putc ('\n', stdout);
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (_("\
38805436638acc7c010349a69c3395f1a57c642dc62Ying WangFEATURE is a list of comma separated words that can include:\n\
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `caret'        show errors with carets\n\
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `all'          all of the above\n\
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  `none'         disable all of the above\n\
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "), stdout);
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      putc ('\n', stdout);
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      printf (_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      printf (_("%s home page: <%s>.\n"), PACKAGE_NAME, PACKAGE_URL);
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (_("General help using GNU software: "
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang               "<http://www.gnu.org/gethelp/>.\n"),
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang             stdout);
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* Don't output this redundant message for English locales.
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang         Note we still output for 'C' so that it gets included in the
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang         man page.  */
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      const char *lc_messages = setlocale (LC_MESSAGES, NULL);
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (lc_messages && strcmp (lc_messages, "en_"))
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* TRANSLATORS: Replace LANG_CODE in this URL with your language
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           code <http://translationproject.org/team/LANG_CODE.html> to
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang           form one of the URLs at http://translationproject.org/team/.
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang           Otherwise, replace the entire URL with your translation team's
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang           email address.  */
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fputs (_("Report translation bugs to "
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "<http://translationproject.org/team/>.\n"), stdout);
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (_("For complete documentation, run: info bison.\n"), stdout);
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  exit (status);
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------.
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Display the version message.  |
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------*/
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectversion (void)
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Some efforts were made to ease the translators' task, please
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     continue.  */
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  printf (_("bison (GNU Bison) %s"), VERSION);
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  putc ('\n', stdout);
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  putc ('\n', stdout);
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stdout,
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   _("Copyright (C) %d Free Software Foundation, Inc.\n"),
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	   PACKAGE_COPYRIGHT_YEAR);
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs (_("\
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThis is free software; see the source for copying conditions.  There is NO\n\
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"),
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 stdout);
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-------------------------------------.
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| --skeleton and --language handling.  |
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------*/
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wangskeleton_arg (char const *arg, int prio, location loc)
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (prio < skeleton_prio)
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      skeleton_prio = prio;
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      skeleton = arg;
45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else if (prio == skeleton_prio)
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    complain_at (loc, _("multiple skeleton declarations are invalid"));
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wanglanguage_argmatch (char const *arg, int prio, location loc)
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char const *msg;
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (prio < language_prio)
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      int i;
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      for (i = 0; valid_languages[i].language[0]; i++)
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (c_strcasecmp (arg, valid_languages[i].language) == 0)
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            language_prio = prio;
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            language = &valid_languages[i];
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            return;
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      msg = _("%s: invalid language");
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else if (language_prio == prio)
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    msg = _("multiple language declarations are invalid");
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  complain_at (loc, msg, quotearg_colon (arg));
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------.
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Process the options.  |
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------*/
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Shorts options.
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Should be computed from long_options.  */
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic char const short_options[] =
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "D:"
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "F:"
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "L:"
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "S:"
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "T::"
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "V"
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "W::"
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "b:"
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "d"
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "f::"
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "e"
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "g::"
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "h"
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "k"
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "l"
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "n"
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "o:"
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "p:"
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "r:"
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "t"
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "v"
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "x::"
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  "y"
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ;
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Values for long options that do not have single-letter equivalents.  */
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  LOCATIONS_OPTION = CHAR_MAX + 1,
52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  PRINT_LOCALEDIR_OPTION,
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  PRINT_DATADIR_OPTION,
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  REPORT_FILE_OPTION
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct option const long_options[] =
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Operation modes. */
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "help",            no_argument,	  0,   'h' },
53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "version",         no_argument,	  0,   'V' },
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "print-localedir", no_argument,	  0,   PRINT_LOCALEDIR_OPTION },
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "print-datadir",   no_argument,	  0,   PRINT_DATADIR_OPTION   },
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "warnings",        optional_argument, 0,   'W' },
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Parser. */
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "name-prefix",   required_argument,	  0,   'p' },
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "include",       required_argument,   0,   'I' },
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Output. */
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "file-prefix", required_argument,	0,   'b' },
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "output",	   required_argument,	0,   'o' },
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "output-file", required_argument,	0,   'o' },
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "graph",	   optional_argument,	0,   'g' },
54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "xml",         optional_argument,   0,   'x' },
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "report",	   required_argument,   0,   'r' },
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "report-file", required_argument,   0,   REPORT_FILE_OPTION },
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "verbose",	   no_argument,	        0,   'v' },
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Hidden. */
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "trace",         optional_argument,   0,     'T' },
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Output.  */
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "defines",     optional_argument,   0,   'd' },
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "feature",     optional_argument,   0,   'f' },
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Operation modes.  */
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "fixed-output-files", no_argument,  0,   'y' },
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "yacc",	          no_argument,  0,   'y' },
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Parser.  */
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "debug",	      no_argument,               0,   't' },
56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "define",	      required_argument,         0,   'D' },
56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "force-define",   required_argument,         0,   'F' },
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "locations",      no_argument,		 0, LOCATIONS_OPTION },
566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "no-lines",       no_argument,               0,   'l' },
567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "raw",            no_argument,               0,     0 },
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "skeleton",       required_argument,         0,   'S' },
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  { "language",       required_argument,         0,   'L' },
570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  { "token-table",    no_argument,               0,   'k' },
571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {0, 0, 0, 0}
573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Under DOS, there is no difference on the case.  This can be
576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   troublesome when looking for `.tab' etc.  */
577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef MSDOS
578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define AS_FILE_NAME(File) (strlwr (File), (File))
579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define AS_FILE_NAME(File) (File)
581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Build a location for the current command line argument. */
58405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic
58505436638acc7c010349a69c3395f1a57c642dc62Ying Wanglocation
58605436638acc7c010349a69c3395f1a57c642dc62Ying Wangcommand_line_location (void)
58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  location res;
58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* "<command line>" is used in GCC's messages about -D. */
59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  boundary_set (&res.start, uniqstr_new ("<command line>"), optind - 1, -1);
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  res.end = res.start;
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return res;
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetargs (int argc, char *argv[])
598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 != -1)
603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    switch (c)
604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* ASCII Sorting for short options (i.e., upper case then
60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           lower case), and then long-only options.  */
60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      case 0:
609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* Certain long options cause getopt_long to return 0.  */
610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'D': /* -DNAME[=VALUE]. */
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'F': /* -FNAME[=VALUE]. */
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          char* name = optarg;
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          char* value = mbschr (optarg, '=');
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (value)
61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            *value++ = 0;
61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          muscle_percent_define_insert (name, command_line_location (),
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        value ? value : "",
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        c == 'D' ? MUSCLE_PERCENT_DEFINE_D
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                                 : MUSCLE_PERCENT_DEFINE_F);
62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'I':
62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	include = AS_FILE_NAME (optarg);
62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	break;
62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
63005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'L':
63105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	language_argmatch (optarg, command_line_prio,
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang			   command_line_location ());
63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	break;
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'S':
63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	skeleton_arg (AS_FILE_NAME (optarg), command_line_prio,
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      command_line_location ());
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	break;
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'T':
64105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	FLAGS_ARGMATCH (trace, optarg);
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	break;
643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      case 'V':
645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	version ();
646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	exit (EXIT_SUCCESS);
647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
64805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'f':
64905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        FLAGS_ARGMATCH (feature, optarg);
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'W':
65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	FLAGS_ARGMATCH (warnings, optarg);
654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'b':
65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	spec_file_prefix = AS_FILE_NAME (optarg);
658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'd':
66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /* Here, the -d and --defines options are differentiated.  */
66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        defines_flag = true;
66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (optarg)
66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
66505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            free (spec_defines_file);
66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'g':
67105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	graph_flag = true;
67205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	if (optarg)
67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            free (spec_graph_file);
67505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'h':
68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	usage (EXIT_SUCCESS);
68105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
68205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'k':
68305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	token_table_flag = true;
684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      case 'l':
687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	no_lines_flag = true;
688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'o':
69105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	spec_outfile = AS_FILE_NAME (optarg);
692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'p':
69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	spec_name_prefix = optarg;
696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'r':
69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	FLAGS_ARGMATCH (report, optarg);
700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      case 't':
70305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	debug = true;
704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
70605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'v':
70705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	report_flag |= report_states;
708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'x':
71105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	xml_flag = true;
71205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	if (optarg)
71305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          {
71405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            free (spec_xml_file);
71505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
71605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          }
717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case 'y':
72005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	yacc_flag = true;
721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
72305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case LOCATIONS_OPTION:
72405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	locations_flag = true;
725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
72705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case PRINT_LOCALEDIR_OPTION:
72805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	printf ("%s\n", LOCALEDIR);
72905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	exit (EXIT_SUCCESS);
73005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
73105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case PRINT_DATADIR_OPTION:
73205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	printf ("%s\n", compute_pkgdatadir ());
73305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	exit (EXIT_SUCCESS);
73405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
73505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case REPORT_FILE_OPTION:
73605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        free (spec_verbose_file);
73705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;
739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      default:
741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	usage (EXIT_FAILURE);
742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (argc - optind != 1)
745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (argc - optind < 1)
74705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        error (0, 0, _("%s: missing operand"), quotearg_colon (argv[argc - 1]));
748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
74905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      usage (EXIT_FAILURE);
751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  current_file = grammar_file = uniqstr_new (argv[optind]);
75405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
75505436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
75605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
75705436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
75805436638acc7c010349a69c3395f1a57c642dc62Ying Wangtr (char *s, char from, char to)
75905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
76005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (; *s; s++)
76105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (*s == from)
76205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      *s = to;
763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
764