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 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
** 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]
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
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
#include "files.h"
#include "complain.h"
#include "getargs.h"
+#include "xalloc.h"
+#include "options.h"
int debug_flag = 0;
int defines_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. |
{
int c;
+ create_long_option_table ();
while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != EOF)
switch (c)
{
exit (1);
}
+ XFREE (longopts);
if (optind == argc)
{
fprintf (stderr, _("%s: no grammar file given\n"), program_name);
#include "files.h"
#include "getopt.h" /* for optarg */
#include "symtab.h"
+#include "options.h"
#include "lex.h"
#include "xalloc.h"
#include "complain.h"
}
}
-/* 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. */
parse_percent_token (void)
{
int c;
- struct percent_table_struct *tx;
+ const struct option_table_struct *tx;
c = getc (finput);
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)
return tok_noop;
}
- switch (tx->retval)
+ switch (tx->ret_val)
{
case tok_setopt:
*((char **) (tx->set_flag)) = optarg;
break;
}
- return tx->retval;
+ return tx->ret_val;
}
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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_ */
#include "files.h"
#include "xalloc.h"
#include "symtab.h"
+#include "options.h"
#include "lex.h"
#include "gram.h"
#include "complain.h"