]> 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 f1240766ce89d56cdef0445569ddae8184ef5e41..f8f5301e81a53b6cd505479f8a3393d37adf5257 100644 (file)
@@ -1,5 +1,5 @@
 /* Concentrate all options use in bison,
 /* 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.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <stdio.h>
-#include "xalloc.h"
 #include "system.h"
 #include "getopt.h"
 #include "files.h"
 #include "getargs.h"
 #include "system.h"
 #include "getopt.h"
 #include "files.h"
 #include "getargs.h"
-#include "gram.h"
 #include "symtab.h"
 #include "symtab.h"
-#include "lex.h"
+#include "gram.h"
+#include "output.h"
 #include "options.h"
 
 /* Shorts options.  */
 #include "options.h"
 
 /* Shorts options.  */
-const char *shortopts = "yvgdhrltknVo:b:p:S:";
-
-/* Long options.  */
-struct option *longopts = NULL;
-
-struct percent_table_struct *percent_table = NULL;
-
-const struct option_table_struct option_table[] =
+const char *shortopts = "yvegdhr:ltknVo:b:p:S:";
+
+/* A CLI option only.
+   Arguments is the policy: `no', `optional', `required'.
+   OptionChar is the value given to the Var if the latter is specified.  */
+#undef OPTN
+#define OPTN(OptionString, Arguments, Var, Token, OptionChar) \
+  { opt_cmd_line, \
+    (OptionString), (Arguments##_argument), (Var), (Token), (OptionChar) },
+
+/* A directive only. */
+#undef DRTV
+#define DRTV(DirectiveString, Arguments, Var, Token) \
+  { opt_percent, \
+    (DirectiveString), (Arguments##_argument), (Var), (Token), (0) },
+
+/* An option activated both by a directive and an CLI option. */
+#undef BOTH
+#define BOTH(String, Arguments, Var, Token, OptionChar) \
+  { opt_both, \
+    (String), (Arguments##_argument), (Var), (Token), (OptionChar) },
+
+
+const struct option_table_s option_table[] =
 {
   /*
    * Command line.
    */
 
   /* Operation modes. */
 {
   /*
    * Command line.
    */
 
   /* Operation modes. */
-  {opt_cmd_line, "help",      no_argument,                0,         0,   'h'},
-  {opt_cmd_line, "version",   no_argument,                0,         0,   'V'},
+  OPTN ("help",          no,           0,      0,   'h')
+  OPTN ("version",       no,           0,      0,   'V')
 
   /* Parser. */
 
   /* Parser. */
-  /* was 'a';  apparently unused -wjh */
-  {opt_cmd_line, "name-prefix",        required_argument,         0,         0,   'p'},
+  OPTN ("name-prefix", required,       0,      0,   'p')
+  OPTN ("include",      required,       0,      0,   'I')
 
   /* Output. */
 
   /* Output. */
-  {opt_cmd_line, "file-prefix",        required_argument,         0,         0,   'b'},
-  {opt_cmd_line, "output",     required_argument,         0,         0,   'o'},
-  {opt_cmd_line, "output-file",        required_argument,         0,         0,   'o'},
-  {opt_cmd_line, "graph",      optional_argument,         0,         0,   'g'},
+  OPTN ("file-prefix", required,       0,      0,   'b')
+  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. */
 
   /* Hidden. */
-  /* Fixme: What is this `1' doing here!!!  Sounds dead wrong.  See
-     locations too below.  */
-  {opt_cmd_line, "trace", no_argument, &trace_flag,          0,     1},
-
-  /*
-   * Percent declarations.
-   */
-
-  {opt_percent, "token",               0,              NULL, tok_token,     0},
-  {opt_percent, "term",                        0,              NULL, tok_token,     0},
-  {opt_percent, "nterm",               0,              NULL, tok_nterm,     0},
-  {opt_percent, "type",                        0,              NULL, tok_type,      0},
-  {opt_percent, "guard",               0,              NULL, tok_guard,     0},
-  {opt_percent, "union",               0,              NULL, tok_union,     0},
-  {opt_percent, "expect",              0,              NULL, tok_expect,    0},
-  {opt_percent, "thong",               0,              NULL, tok_thong,     0},
-  {opt_percent, "start",               0,              NULL, tok_start,     0},
-  {opt_percent, "left",                        0,              NULL, tok_left,      0},
-  {opt_percent, "right",               0,              NULL, tok_right,     0},
-  {opt_percent, "nonassoc",            0,              NULL, tok_nonassoc,  0},
-  {opt_percent, "binary",              0,              NULL, tok_nonassoc,  0},
-  {opt_percent, "prec",                        0,              NULL, tok_prec,      0},
+  OPTN ("trace",        no,   &trace_flag,      0,     1)
 
   /* 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 ?
      */
 
   /* 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 ?
      */
-  {opt_both, "output",             required_argument, &spec_outfile, tok_stropt,  'o'},
-  {opt_both, "file-prefix", required_argument,&spec_file_prefix,tok_stropt,'b'},
-  {opt_both, "name-prefix", required_argument,&spec_name_prefix,tok_stropt,'p'},
-
-  {opt_percent, "define",              0,              NULL, tok_define,    0},
-  {opt_percent, "semantic-parser",     0,  &semantic_parser, tok_intopt,            0},
-  {opt_percent, "pure-parser",         0,      &pure_parser, tok_intopt,      0},
+  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.
    */
 
 
   /*
    * Percent and command line declarations.
    */
 
-  /* FIXME Usually option use `-' to separe words on command line
-     and `_' for percent option.  But here the separator are always
-     the same, the char `-'.  */
-
   /* Output.  */
   /* Output.  */
-  {opt_both, "defines",         optional_argument,   &defines_flag, tok_intopt,   'd'},
-  {opt_both, "verbose",               no_argument,   &verbose_flag, tok_intopt,   'v'},
+  OPTN ("defines",     optional,   &defines_flag,    0,   'd')
 
   /* Operation modes.  */
 
   /* Operation modes.  */
-  {opt_both, "fixed-output-files", no_argument,  &yacc_flag, tok_intopt,   'y'},
-  {opt_both, "yacc",          no_argument,      &yacc_flag, tok_intopt,   'y'},
+  OPTN ("fixed-output-files", no,  &yacc_flag,      0,   'y')
+  OPTN ("yacc",                      no,  &yacc_flag,       0,   'y')
 
   /* Parser.  */
 
   /* Parser.  */
-  {opt_both, "debug",         no_argument,     &debug_flag, tok_intopt,           't'},
-  {opt_both, "locations",      no_argument, &locations_flag, tok_intopt,       1},
-  {opt_both, "no-lines",       no_argument,  &no_lines_flag, tok_intopt,          'l'},
-  {opt_both, "no-parser",      no_argument, &no_parser_flag, tok_intopt,          'n'},
-  {opt_both, "raw",           no_argument,               0, tok_obsolete, 'r'},
-  {opt_both, "skeleton",       required_argument,         0, tok_skel,    'S'},
-  {opt_both, "token-table",    no_argument, &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}
 };
 
 
   {0, 0, 0, 0, 0, 0}
 };
 
+
 /*--------------------------------------------------------.
 | Create the longoptions structure from the option_table, |
 | for the getopt file.                                   |
 `--------------------------------------------------------*/
 /*--------------------------------------------------------.
 | 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;
   int i = 0;
   int j = 0;
   int number_options;
@@ -137,26 +126,27 @@ create_long_option_table ()
        || option_table[i].access == opt_both)
       ++number_options;
 
        || 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)
       {
   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
        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;
 }
 }