* src/lex.c (parse_percent_token): Change type of variable `tx', which
authorPascal Bart <pascal.bart@epita.fr>
Thu, 20 Sep 2001 18:32:20 +0000 (18:32 +0000)
committerPascal Bart <pascal.bart@epita.fr>
Thu, 20 Sep 2001 18:32:20 +0000 (18:32 +0000)
is now an option_table_struct*.
(option_strcmp): New function option_strcmp.
(parse_percent_token): Call option_strcmp.
* src/getargs.c (xalloc.h, options.h): Include it.
(getargs): Call create_long_option_table.
(getargs): Free longopts at the end of the function.
(shortopts): Move in options.c.
* src/options.c (create_long_option_table): New function.  Convert
information from option_table to option structure.
* src/reader.c (options.h): Include it.
* src/Makefile.am: Adjust.
* src/options.c (option_table): Create from longopts and percent_table.
* src/getargs.c (longopts): Delete.
* src/lex.c (struct percent_table_struct): Delete.
(percent_table): Delete.
(options.h): Include it.
* src/options.c: Create.
* src/options.h: Create.
Declare enum opt_access_e.
Define struct option_table_struct.

ChangeLog
TODO
src/Makefile.am
src/getargs.c
src/lex.c
src/options.c [new file with mode: 0644]
src/options.h [new file with mode: 0644]
src/reader.c

index 73264c4..3ed3d47 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2001-09-20  Pascal Bart  <pascal.bart@epita.fr>
+
+       * src/lex.c (parse_percent_token): Change type of variable `tx', which
+       is now an option_table_struct*.
+       (option_strcmp): New function option_strcmp.
+       (parse_percent_token): Call option_strcmp.
+       * src/getargs.c (xalloc.h, options.h): Include it.
+       (getargs): Call create_long_option_table.
+       (getargs): Free longopts at the end of the function.
+       (shortopts): Move in options.c.
+       * src/options.c (create_long_option_table): New function.  Convert
+       information from option_table to option structure.
+       * src/reader.c (options.h): Include it.
+
+       * src/Makefile.am: Adjust.
+       * src/options.c (option_table): Create from longopts and percent_table.
+       * src/getargs.c (longopts): Delete.
+       * src/lex.c (struct percent_table_struct): Delete.
+       (percent_table): Delete.
+       (options.h): Include it.
+       * src/options.c: Create.
+       * src/options.h: Create.
+       Declare enum opt_access_e.
+       Define struct option_table_struct.
+
 2001-09-20  Marc Autret  <autret_m@epita.fr>
 
        * doc/bison.texinfo: Adjust terminologies about prologue and epilogue
diff --git a/TODO b/TODO
index 11b1d34..3efcd4e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -14,7 +14,7 @@
 ** Synchronize `#line' directive with user file.       []
 
 * src/getargs.c src/lex.c
-** Synchronize percent and command line options.       []
+** Synchronize percent and command line options.       [ok]
 
 * src/macrotab.[ch]
 ** Removing warnings when compiling. (gcc-warnings).   [ok]
index 322c614..479bd97 100644 (file)
@@ -14,7 +14,7 @@ bison_SOURCES = LR0.c closure.c complain.c conflicts.c        \
     derives.c  \
     files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
     output.c print_graph.c \
-    muscle_tab.c       \
+    muscle_tab.c options.c \
     print.c reader.c reduce.c symtab.c warshall.c vcg.c
 
 EXTRA_bison_SOURCES = vmsgetargs.c
@@ -23,7 +23,7 @@ noinst_HEADERS = LR0.h closure.h complain.h conflicts.h \
  derives.h \
  files.h getargs.h gram.h lalr.h lex.h nullable.h \
  output.h print_graph.h        \
- muscle_tab.h \
+ muscle_tab.h options.h \
  print.h reader.h reduce.h state.h symtab.h warshall.h system.h \
  types.h vcg.h vcg_defaults.h
 
index 29b349a..7b0046a 100644 (file)
@@ -24,6 +24,8 @@
 #include "files.h"
 #include "complain.h"
 #include "getargs.h"
+#include "xalloc.h"
+#include "options.h"
 
 int debug_flag = 0;
 int defines_flag = 0;
@@ -39,37 +41,6 @@ int graph_flag = 0;
 const char *skeleton = NULL;
 
 extern char *program_name;
-const char *shortopts = "yvgdhrltknVo:b:p:S:";
-static struct option longopts[] =
-{
-  /* Operation modes. */
-  {"help",             no_argument,    0, 'h'},
-  {"version",          no_argument,    0, 'V'},
-  {"yacc",             no_argument,    0, 'y'},
-  {"fixed-output-files",no_argument,   0, 'y'},
-
-  /* Parser. */
-  {"skeleton",         required_argument,      0, 'S'},
-  {"debug",            no_argument,            0, 'd'},
-  {"locations",                no_argument,    &locations_flag, 1},
-  /* was 'a';  apparently unused -wjh */
-  {"name-prefix",      required_argument,      0, 'p'},
-  {"no-lines",         no_argument,            0, 'l'},
-  {"no-parser",                no_argument,            0, 'n'},
-  {"raw",              no_argument,            0, 'r'},
-  {"token-table",      no_argument,            0, 'k'},
-
-  /* Output. */
-  {"defines",          no_argument,            0, 'd'},
-  {"verbose",          no_argument,            0, 'v'},
-  {"file-prefix",      required_argument,      0, 'b'},
-  {"output-file",      required_argument,      0, 'o'},
-  {"graph",            no_argument,            0, 'g'},
-
-  /* Hidden. */
-  {"statistics",       no_argument,    &statistics_flag, 1},
-  {0, 0, 0, 0}
-};
 
 /*---------------------------.
 | Display the help message.  |
@@ -161,6 +132,7 @@ getargs (int argc, char *argv[])
 {
   int c;
 
+  create_long_option_table ();
   while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != EOF)
     switch (c)
       {
@@ -234,6 +206,7 @@ getargs (int argc, char *argv[])
        exit (1);
       }
 
+  XFREE (longopts);
   if (optind == argc)
     {
       fprintf (stderr, _("%s: no grammar file given\n"), program_name);
index 8241fbc..61f1c26 100644 (file)
--- a/src/lex.c
+++ b/src/lex.c
@@ -23,6 +23,7 @@
 #include "files.h"
 #include "getopt.h"            /* for optarg */
 #include "symtab.h"
+#include "options.h"
 #include "lex.h"
 #include "xalloc.h"
 #include "complain.h"
@@ -509,60 +510,23 @@ lex (void)
     }
 }
 
-/* the following table dictates the action taken for the various %
-   directives.  A set_flag value causes the named flag to be set.  A
-   retval action returns the code.  */
-struct percent_table_struct
-{
-  const char *name;
-  void *set_flag;
-  int retval;
-};
+/* This function is a strcmp, which doesn't differentiate `-' and `_'
+   chars.  */
 
-struct percent_table_struct percent_table[] =
+static int
+option_strcmp (const char *left, const char *right)
 {
-  { "token",           NULL,                   tok_token },
-  { "term",            NULL,                   tok_token },
-  { "nterm",           NULL,                   tok_nterm },
-  { "type",            NULL,                   tok_type },
-  { "guard",           NULL,                   tok_guard },
-  { "union",           NULL,                   tok_union },
-  { "expect",          NULL,                   tok_expect },
-  { "thong",           NULL,                   tok_thong },
-  { "start",           NULL,                   tok_start },
-  { "left",            NULL,                   tok_left },
-  { "right",           NULL,                   tok_right },
-  { "nonassoc",                NULL,                   tok_nonassoc },
-  { "binary",          NULL,                   tok_nonassoc },
-  { "prec",            NULL,                   tok_prec },
-  { "locations",       &locations_flag,        tok_noop },     /* -l */
-  { "no_lines",                &no_lines_flag,         tok_noop },     /* -l */
-  { "raw",             NULL,                   tok_obsolete }, /* -r */
-  { "token_table",     &token_table_flag,      tok_noop },     /* -k */
-  { "yacc",            &yacc_flag,             tok_noop },     /* -y */
-  { "fixed_output_files",&yacc_flag,           tok_noop },     /* -y */
-  { "defines",         &defines_flag,          tok_noop },     /* -d */
-  { "no_parser",       &no_parser_flag,        tok_noop },     /* -n */
-#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.  */
-  { "output_file",     &spec_outfile,          tok_setopt },   /* -o */
-  { "file_prefix",     &spec_file_prefix,      tok_setopt },   /* -b */
-  { "name_prefix",     &spec_name_prefix,      tok_setopt },   /* -p */
-#endif
-  { "header_extension",        NULL,                   tok_hdrext },
-  { "source_extension",        NULL,                   tok_srcext },
-  { "define",          NULL,                   tok_define },
-  { "verbose",         &verbose_flag,          tok_noop },     /* -v */
-  { "debug",           &debug_flag,            tok_noop },     /* -t */
-  { "skeleton",                NULL,                   tok_skel },     /* -S */
-  { "semantic_parser", &semantic_parser,       tok_noop },
-  { "pure_parser",     &pure_parser,           tok_noop },
-
-  { NULL, NULL, tok_illegal}
-};
+    const unsigned char *l, *r;
+    int c;
+
+    assert(left != NULL && right != NULL);     
+    l = (const unsigned char *)left;
+    r = (const unsigned char *)right;
+    while (((c = *l - *r++) == 0 && *l != '\0')
+          || ((*l == '-' || *l == '_') && (*r == '_' || *r == '-')))
+        l++;
+    return c;
+}
 
 /* Parse a token which starts with %.
    Assumes the % has already been read and discarded.  */
@@ -571,7 +535,7 @@ int
 parse_percent_token (void)
 {
   int c;
-  struct percent_table_struct *tx;
+  const struct option_table_struct *tx;
 
   c = getc (finput);
 
@@ -616,8 +580,9 @@ parse_percent_token (void)
   token_buffer = obstack_finish (&token_obstack);
 
   /* table lookup % directive */
-  for (tx = percent_table; tx->name; tx++)
-    if (strcmp (token_buffer + 1, tx->name) == 0)
+  for (tx = option_table; tx->name; tx++)
+    if ((tx->access == opt_percent || tx->access == opt_both)
+       && option_strcmp (token_buffer + 1, tx->name) == 0)
       break;
 
   if (tx->set_flag)
@@ -626,7 +591,7 @@ parse_percent_token (void)
       return tok_noop;
     }
 
-  switch (tx->retval)
+  switch (tx->ret_val)
     {
     case tok_setopt:
       *((char **) (tx->set_flag)) = optarg;
@@ -638,5 +603,5 @@ parse_percent_token (void)
       break;
     }
 
-  return tx->retval;
+  return tx->ret_val;
 }
diff --git a/src/options.c b/src/options.c
new file mode 100644 (file)
index 0000000..71a4505
--- /dev/null
@@ -0,0 +1,153 @@
+/* Concentrate all options use in bison,
+   Copyright 2001 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   Bison is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Bison is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bison; see the file COPYING.  If not, write to
+   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 "getargs.h"
+#include "gram.h"
+#include "lex.h"
+#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[] =
+{
+  /*
+   * Command line.
+   */
+
+  /* Operation modes. */
+  {opt_cmd_line, "help",      no_argument,                0,         0,   'h'},
+  {opt_cmd_line, "version",   no_argument,                0,         0,   'V'},
+  
+  /* Parser. */
+  /* was 'a';  apparently unused -wjh */
+  {opt_cmd_line, "name-prefix",        required_argument,         0,         0,   'p'},
+
+  /* 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'},
+
+  /* Hidden. */
+  {opt_cmd_line, "statistics", no_argument, &statistics_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},
+#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},
+
+  /*
+   * 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.  */
+  {opt_both, "defines",               no_argument,   &defines_flag, tok_noop,     'd'},
+  {opt_both, "verbose",               no_argument,   &verbose_flag, tok_noop,     'v'},
+
+  /* Operation modes.  */
+  {opt_both, "fixed-output-files", no_argument,  &yacc_flag, tok_noop,    'y'},
+  {opt_both, "yacc",          no_argument,      &yacc_flag, tok_noop,     'y'},
+
+  /* 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'},
+
+  {0, 0, 0, 0, 0, 0}
+};
+
+/*--------------------------------------------------------.
+| Create the longoptions structure from the option_table, |
+| for the getopt file.                                   |
+`--------------------------------------------------------*/
+void
+create_long_option_table ()
+{
+  int i = 0;
+  int j = 0;
+  int number_options;
+
+  for (number_options = 0; option_table[i].name; i++)
+    if (option_table[i].access == opt_cmd_line
+       || option_table[i].access == opt_both)
+      ++number_options;
+
+  longopts = 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;
+       longopts[j].flag = option_table[i].set_flag;
+       longopts[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;
+}
diff --git a/src/options.h b/src/options.h
new file mode 100644 (file)
index 0000000..c509580
--- /dev/null
@@ -0,0 +1,62 @@
+/* Concentrate all options use in bison,
+   Copyright 2001 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   Bison is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Bison is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bison; see the file COPYING.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef OPTIONS_H_
+# define OPTIONS_H_
+
+/* opt_access_t and struct option_table_struct need to be declare 
+   here, for the parse_percent_token function in lex.c.  */
+
+/* Option accessibility.  */
+typedef enum opt_access_e
+{
+  opt_cmd_line = 1,
+  opt_percent,
+  opt_both
+} opt_access_t;
+
+/* This is the general struct, which contains user's options from
+   command line or in grammar with percent flag.  */
+struct option_table_struct
+{
+  /* Set the accessibility.  */
+  opt_access_t access;
+  /* This name is used for long option et percent directives.  */
+  const char *name;
+  /* Use for command line.  */
+  int has_arg;
+  /* A set_flag value causes the named flag to be set.  */
+  int *set_flag;
+  /* A retval action returns the code.  */
+  int ret_val;
+  /* The short option value, frequently a letter.  */
+  int val;
+};
+
+extern const char *shortopts;
+extern struct option *longopts;
+
+/* Table which contain all options.  */
+extern const struct option_table_struct option_table[];
+
+/* Set the longopts variable from option_table.  */
+void create_long_option_table PARAMS (());
+
+#endif /* !OPTIONS_H_ */
index 83c6b3a..7aeec65 100644 (file)
@@ -28,6 +28,7 @@
 #include "files.h"
 #include "xalloc.h"
 #include "symtab.h"
+#include "options.h"
 #include "lex.h"
 #include "gram.h"
 #include "complain.h"