]> git.saurik.com Git - bison.git/blobdiff - src/options.c
* src/scan-gram.l: Complete the scanner with the missing patterns
[bison.git] / src / options.c
index 2f457b6ba28fa000286ff939fa6a7f8e4bf4c3ab..f8f5301e81a53b6cd505479f8a3393d37adf5257 100644 (file)
@@ -1,5 +1,5 @@
 /* Concentrate all options use in bison,
-   Copyright 2001 Free Software Foundation, Inc.
+   Copyright 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 #include "files.h"
 #include "getargs.h"
 #include "symtab.h"
-#include "lex.h"
+#include "gram.h"
 #include "output.h"
 #include "options.h"
 
 /* Shorts options.  */
-const char *shortopts = "yvegdhrltknVo:b:p:S:";
-
-/* Long options.  */
-struct option *longopts = NULL;
-
-struct percent_table_struct *percent_table = NULL;
+const char *shortopts = "yvegdhr:ltknVo:b:p:S:";
 
 /* A CLI option only.
    Arguments is the policy: `no', `optional', `required'.
@@ -56,7 +51,7 @@ struct percent_table_struct *percent_table = NULL;
     (String), (Arguments##_argument), (Var), (Token), (OptionChar) },
 
 
-const struct option_table_struct option_table[] =
+const struct option_table_s option_table[] =
 {
   /*
    * Command line.
@@ -75,73 +70,53 @@ const struct option_table_struct option_table[] =
   OPTN ("output",      required,       0,      0,   'o')
   OPTN ("output-file", required,       0,      0,   'o')
   OPTN ("graph",       optional,       0,      0,   'g')
+  OPTN ("report",      required,       0,      0,   'r')
+  OPTN ("verbose",          no,        0,      0,   'v')
 
   /* Hidden. */
   OPTN ("trace",        no,   &trace_flag,      0,     1)
 
-  /*
-   * Percent declarations.
-   */
-
-  DRTV ("token",       no,             NULL, tok_token)
-  DRTV ("term",                no,             NULL, tok_token)
-  DRTV ("nterm",       no,             NULL, tok_nterm)
-  DRTV ("type",                no,             NULL, tok_type)
-  DRTV ("guard",       no,             NULL, tok_guard)
-  DRTV ("union",       no,             NULL, tok_union)
-  DRTV ("expect",      no,             NULL, tok_expect)
-  DRTV ("thong",       no,             NULL, tok_thong)
-  DRTV ("start",       no,             NULL, tok_start)
-  DRTV ("left",                no,             NULL, tok_left)
-  DRTV ("right",       no,             NULL, tok_right)
-  DRTV ("nonassoc",    no,             NULL, tok_nonassoc)
-  DRTV ("binary",      no,             NULL, tok_nonassoc)
-  DRTV ("prec",                no,             NULL, tok_prec)
-  DRTV ("error-verbose",no,   &error_verbose, tok_intopt)
-
   /* FIXME: semantic parsers will output an `include' of an
      output file: be sure that the naem included is indeed the name of
      the output file.  */ /* FIXME Should we activate this options ?
      */
-  BOTH ("output",      required,     &spec_outfile, tok_stropt, 'o')
-  BOTH ("file-prefix", required, &spec_file_prefix, tok_stropt, 'b')
-  BOTH ("name-prefix", required, &spec_name_prefix, tok_stropt, 'p')
-
-  DRTV ("define",      no,               NULL, tok_define)
-  DRTV ("semantic-parser",no, &semantic_parser, tok_intopt)
-  DRTV ("pure-parser", no,       &pure_parser, tok_intopt)
+  OPTN ("output",      required,     &spec_outfile, 0, 'o')
+  OPTN ("file-prefix", required, &spec_file_prefix, 0, 'b')
+  OPTN ("name-prefix", required, &spec_name_prefix, 0, 'p')
 
   /*
    * Percent and command line declarations.
    */
 
   /* Output.  */
-  BOTH ("defines",     optional,   &defines_flag,    tok_intopt,   'd')
-  BOTH ("verbose",          no,   &verbose_flag,    tok_intopt,   'v')
+  OPTN ("defines",     optional,   &defines_flag,    0,   'd')
 
   /* Operation modes.  */
-  BOTH ("fixed-output-files", no,  &yacc_flag,      tok_intopt,   'y')
-  BOTH ("yacc",                      no,  &yacc_flag,       tok_intopt,   'y')
+  OPTN ("fixed-output-files", no,  &yacc_flag,      0,   'y')
+  OPTN ("yacc",                      no,  &yacc_flag,       0,   'y')
 
   /* Parser.  */
-  BOTH ("debug",         no,     &debug_flag,       tok_intopt,   't')
-  BOTH ("locations",      no, &locations_flag,       tok_intopt,     1)
-  BOTH ("no-lines",       no,  &no_lines_flag,       tok_intopt,   'l')
-  BOTH ("no-parser",      no, &no_parser_flag,       tok_intopt,   'n')
-  BOTH ("raw",           no,               0,       tok_obsolete, 'r')
-  BOTH ("skeleton",       required,         0,       tok_skel,    'S')
-  BOTH ("token-table",    no, &token_table_flag,     tok_intopt,   'k')
+  OPTN ("debug",         no,     &debug_flag,       0,   't')
+  OPTN ("locations",      no, &locations_flag,       0,     1)
+  OPTN ("no-lines",       no,  &no_lines_flag,       0,   'l')
+  OPTN ("no-parser",      no, &no_parser_flag,       0,   'n')
+  OPTN ("raw",           no,               0,       0,   0)
+  OPTN ("skeleton",       required,         0,       0,           'S')
+  OPTN ("token-table",    no, &token_table_flag,     0,   'k')
 
   {0, 0, 0, 0, 0, 0}
 };
 
+
 /*--------------------------------------------------------.
 | Create the longoptions structure from the option_table, |
 | for the getopt file.                                   |
 `--------------------------------------------------------*/
-void
-create_long_option_table ()
+
+struct option *
+long_option_table_new ()
 {
+  struct option *res = NULL;
   int i = 0;
   int j = 0;
   int number_options;
@@ -151,26 +126,27 @@ create_long_option_table ()
        || option_table[i].access == opt_both)
       ++number_options;
 
-  longopts = XMALLOC (struct option, number_options + 1);
+  res = XMALLOC (struct option, number_options + 1);
   for (i = 0; option_table[i].name; i++)
     if (option_table[i].access == opt_cmd_line
        || option_table[i].access == opt_both)
       {
-       /* Copy the struct information in the longoptions.  */
-       longopts[j].name = option_table[i].name;
-       longopts[j].has_arg = option_table[i].has_arg;
-       /* When an options is declared having 'optional_argument' and
-          a flag is specified to be set, the option is skipped on
-          command line. So we never use a flag when a command line
-          option is declared 'optional_argument.  */
-       if (longopts[j].has_arg == optional_argument)
-         longopts[j].flag = NULL;
+       res[j].name = option_table[i].name;
+       res[j].has_arg = option_table[i].has_arg;
+       /* When a getopt_long option has an associated variable
+          (member FLAG), then it is set of the VAL member value.  In
+          other words, we cannot expect getopt_long to store the
+          argument if we also want a short option.  */
+       if (res[j].has_arg == optional_argument)
+         res[j].flag = NULL;
        else
-         longopts[j].flag = option_table[i].set_flag;
-       longopts[j++].val = option_table[i].val;
+         res[j].flag = option_table[i].flag;
+       res[j++].val = option_table[i].val;
       }
-  longopts[number_options].name = NULL;
-  longopts[number_options].has_arg = 0;
-  longopts[number_options].flag = NULL;
-  longopts[number_options].val = 0;
+  res[number_options].name = NULL;
+  res[number_options].has_arg = 0;
+  res[number_options].flag = NULL;
+  res[number_options].val = 0;
+
+  return res;
 }