+ exit (status);
+}
+
+
+/*------------------------------.
+| Display the version message. |
+`------------------------------*/
+
+static void
+version (void)
+{
+ /* Some efforts were made to ease the translators' task, please
+ continue. */
+ printf (_("bison (GNU Bison) %s"), VERSION);
+ putc ('\n', stdout);
+ fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
+ putc ('\n', stdout);
+
+ fprintf (stdout,
+ _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2005);
+
+ fputs (_("\
+This is free software; see the source for copying conditions. There is NO\n\
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
+"),
+ stdout);
+}
+
+
+/*----------------------.
+| Process the options. |
+`----------------------*/
+
+/* Shorts options. */
+static char const short_options[] = "yvegdhr:ltknVo:b:p:S:T::";
+
+/* Values for long options that do not have single-letter equivalents. */
+enum
+{
+ LOCATIONS_OPTION = CHAR_MAX + 1,
+ PRINT_LOCALEDIR_OPTION
+};
+
+static struct option const long_options[] =
+{
+ /* Operation modes. */
+ { "help", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'V' },
+ { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
+
+ /* Parser. */
+ { "name-prefix", required_argument, 0, 'p' },
+ { "include", required_argument, 0, 'I' },
+
+ /* Output. */
+ { "file-prefix", required_argument, 0, 'b' },
+ { "output", required_argument, 0, 'o' },
+ { "output-file", required_argument, 0, 'o' },
+ { "graph", optional_argument, 0, 'g' },
+ { "report", required_argument, 0, 'r' },
+ { "verbose", no_argument, 0, 'v' },
+
+ /* Hidden. */
+ { "trace", optional_argument, 0, 'T' },
+
+ /* Output. */
+ { "defines", optional_argument, 0, 'd' },
+
+ /* Operation modes. */
+ { "fixed-output-files", no_argument, 0, 'y' },
+ { "yacc", no_argument, 0, 'y' },
+
+ /* Parser. */
+ { "debug", no_argument, 0, 't' },
+ { "locations", no_argument, 0, LOCATIONS_OPTION },
+ { "no-lines", no_argument, 0, 'l' },
+ { "no-parser", no_argument, 0, 'n' },
+ { "raw", no_argument, 0, 0 },
+ { "skeleton", required_argument, 0, 'S' },
+ { "token-table", no_argument, 0, 'k' },
+
+ {0, 0, 0, 0}
+};
+
+/* Under DOS, there is no difference on the case. This can be
+ troublesome when looking for `.tab' etc. */
+#ifdef MSDOS
+# define AS_FILE_NAME(File) (strlwr (File), (File))
+#else
+# define AS_FILE_NAME(File) (File)
+#endif
+
+void
+getargs (int argc, char *argv[])
+{
+ int c;
+
+ while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
+ != -1)
+ switch (c)
+ {
+ case 0:
+ /* Certain long options cause getopt_long to return 0. */
+ break;
+
+ case 'y':
+ yacc_flag = true;
+ break;
+
+ case 'h':
+ usage (EXIT_SUCCESS);
+
+ case 'V':
+ version ();
+ exit (EXIT_SUCCESS);
+
+ case PRINT_LOCALEDIR_OPTION:
+ printf ("%s\n", LOCALEDIR);
+ exit (EXIT_SUCCESS);
+
+ case 'g':
+ /* Here, the -g and --graph=FILE options are differentiated. */
+ graph_flag = true;
+ if (optarg)
+ spec_graph_file = AS_FILE_NAME (optarg);
+ break;
+
+ case 'v':
+ report_flag |= report_states;
+ break;
+
+ case 'S':
+ skeleton = AS_FILE_NAME (optarg);
+ break;
+
+ case 'I':
+ include = AS_FILE_NAME (optarg);
+ break;
+
+ case 'd':
+ /* Here, the -d and --defines options are differentiated. */
+ defines_flag = true;
+ if (optarg)
+ spec_defines_file = AS_FILE_NAME (optarg);
+ break;
+
+ case 'l':
+ no_lines_flag = true;
+ break;
+
+ case LOCATIONS_OPTION:
+ locations_flag = true;
+ break;
+
+ case 'k':
+ token_table_flag = true;
+ break;
+
+ case 'n':
+ no_parser_flag = true;
+ break;
+
+ case 't':
+ debug_flag = true;
+ break;
+
+ case 'o':
+ spec_outfile = AS_FILE_NAME (optarg);
+ break;
+
+ case 'b':
+ spec_file_prefix = AS_FILE_NAME (optarg);
+ break;
+
+ case 'p':
+ spec_name_prefix = optarg;
+ break;
+
+ case 'r':
+ report_argmatch (optarg);
+ break;
+
+ case 'T':
+ trace_argmatch (optarg);
+ break;
+
+ default:
+ usage (EXIT_FAILURE);
+ }
+
+ if (argc - optind != 1)