Point to an official beta.
[bison.git] / src / options.c
index c09ef0a55800f87f4c6f46d6c22c446a1e633b3c..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 "system.h"
 #include "getopt.h"
+#include "files.h"
 #include "getargs.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.  */
 #include "options.h"
 
 /* Shorts options.  */
-const char *shortopts = "yvgdhrltknVo:b:p:S:";
+const char *shortopts = "yvegdhrltknVo: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) },
 
 
-/* Long options.  */
-struct option *longopts = NULL;
+/* 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[] =
 {
@@ -43,88 +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-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. */
-  {opt_cmd_line, "statistics", no_argument, &statistics_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},
-#if 0
-  /* For the time being, this is not enabled yet, while it's possible
-     though, since we use obstacks.  The only risk is with semantic
-     parsers which 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-file", required_argument, &spec_outfile, tok_setopt,  'o'},
-  {opt_both, "file-prefix", required_argument,&spec_file_prefix,tok_setopt,'b'},
-  {opt_both, "name-prefix", required_argument,&spec_name_prefix,tok_setopt,'p'},
-#endif
-  {opt_percent, "define",              0,              NULL, tok_define,    0},
-  {opt_percent, "semantic-parser",     0,  &semantic_parser, tok_noop,      0},
-  {opt_percent, "pure-parser",         0,      &pure_parser, tok_noop,      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 ?
+     */
+  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)
 
   /*
    * 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_noop,       'd'},
-  {opt_both, "verbose",               no_argument,   &verbose_flag, tok_noop,     'v'},
+  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_noop,    'y'},
-  {opt_both, "yacc",          no_argument,      &yacc_flag, tok_noop,     '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_noop,     't'},
-  {opt_both, "locations",      no_argument, &locations_flag, tok_noop,       1},
-  {opt_both, "no-lines",       no_argument,  &no_lines_flag, tok_noop,    'l'},
-  {opt_both, "no-parser",      no_argument, &no_parser_flag, tok_noop,    '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_noop,   '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;
@@ -134,19 +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;
-       longopts[j].flag = option_table[i].set_flag;
-       longopts[j++].val = option_table[i].val;
+       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.  */
+       if (res[j].has_arg == optional_argument)
+         res[j].flag = NULL;
+       else
+         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;
 }
 }