]> git.saurik.com Git - bison.git/blobdiff - src/options.c
Remove `%thong' support as it is undocumented, unused, duplicates
[bison.git] / src / options.c
index 9732bd3aa7c5e1d049784db41e69024e3fc58b2d..73b77c06c784584a6cc43a2ea05986bea56a3749 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:";
-
-/* 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-file",        required_argument,         0,         0,   'o'},
-  {opt_cmd_line, "graph",     no_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. */
-  {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, "header_extension",    0,              NULL, tok_hdrext,    0},
-  {opt_percent, "source_extension",    0,              NULL, tok_srcext,    0},
-  {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 ("union",       no,             NULL, tok_union)
+  DRTV ("expect",      no,             NULL, tok_expect)
+  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
+     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 ("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",               no_argument,   &defines_flag, tok_noop,     'd'},
-  {opt_both, "verbose",               no_argument,   &verbose_flag, tok_noop,     'v'},
+  BOTH ("defines",     optional,   &defines_flag,    tok_intopt,   'd')
 
   /* 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,     'd'},
-  {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,   0)
+  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;
@@ -136,19 +149,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;
-       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 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
+         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;
 }
 }