]> git.saurik.com Git - bison.git/blobdiff - src/options.c
Point to an official beta.
[bison.git] / src / options.c
index add764b22d051258306bf66c674576bfa032e081..973b6e07e578c1858ce86c815fe7f0e56e1e84be 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 "gram.h"
 #include "lex.h"
 #include "lex.h"
+#include "output.h"
 #include "options.h"
 
 /* Shorts options.  */
 const char *shortopts = "yvegdhrltknVo:b:p:S:";
 
 #include "options.h"
 
 /* Shorts options.  */
 const char *shortopts = "yvegdhrltknVo:b:p:S:";
 
-/* Long options.  */
-struct option *longopts = NULL;
+/* 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) },
 
 
-struct percent_table_struct *percent_table = NULL;
 
 const struct option_table_struct option_table[] =
 {
 
 const struct option_table_struct option_table[] =
 {
@@ -44,92 +59,88 @@ const struct option_table_struct option_table[] =
    */
 
   /* Operation modes. */
    */
 
   /* 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')
 
   /* 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},
+  OPTN ("trace",        no,   &trace_flag,      0,     1)
 
   /*
    * Percent declarations.
    */
 
 
   /*
    * 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},
+  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 ?
      */
 
   /* 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'},
+  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')
 
 
-  {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},
+  DRTV ("define",      no,               NULL, tok_define)
+  DRTV ("semantic-parser",no, &semantic_parser, tok_intopt)
+  DRTV ("pure-parser", no,       &pure_parser, tok_intopt)
 
   /*
    * 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'},
-  {opt_both, "error-verbose",  no_argument,&error_verbose_flag, tok_intopt,   'e'},
+  BOTH ("defines",     optional,   &defines_flag,    tok_intopt,   'd')
+  BOTH ("verbose",          no,   &verbose_flag,    tok_intopt,   'v')
 
   /* 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'},
+  BOTH ("fixed-output-files", no,  &yacc_flag,      tok_intopt,   'y')
+  BOTH ("yacc",                      no,  &yacc_flag,       tok_intopt,   '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, "include",               required_argument,         0, tok_include,  'I'},
-  {opt_both, "token-table",    no_argument, &token_table_flag, tok_intopt,   'k'},
+  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')
 
   {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;
@@ -139,26 +150,28 @@ 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)
       {
        /* Copy the struct information in the longoptions.  */
   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;
+       res[j].name = option_table[i].name;
+       res[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.  */
        /* 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;
+       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].set_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;
 }
 }