]> git.saurik.com Git - bison.git/blobdiff - src/options.c
* src/reader.c (grammar_rule_begin, previous_rule, current_rule):
[bison.git] / src / options.c
index 2f457b6ba28fa000286ff939fa6a7f8e4bf4c3ab..73b77c06c784584a6cc43a2ea05986bea56a3749 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 "gram.h"
 #include "lex.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 +52,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,6 +71,8 @@ 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)
@@ -87,16 +85,15 @@ const struct option_table_struct option_table[] =
   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 ("verbose",     no,     &report_flag, tok_intopt)
   DRTV ("error-verbose",no,   &error_verbose, tok_intopt)
 
   /* FIXME: semantic parsers will output an `include' of an
@@ -108,7 +105,6 @@ const struct option_table_struct option_table[] =
   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)
 
   /*
@@ -117,7 +113,6 @@ const struct option_table_struct option_table[] =
 
   /* Output.  */
   BOTH ("defines",     optional,   &defines_flag,    tok_intopt,   'd')
-  BOTH ("verbose",          no,   &verbose_flag,    tok_intopt,   'v')
 
   /* Operation modes.  */
   BOTH ("fixed-output-files", no,  &yacc_flag,      tok_intopt,   'y')
@@ -128,20 +123,23 @@ const struct option_table_struct option_table[] =
   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 ("raw",           no,               0,       tok_obsolete,   0)
   BOTH ("skeleton",       required,         0,       tok_skel,    'S')
   BOTH ("token-table",    no, &token_table_flag,     tok_intopt,   '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 +149,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;
 }