From: Pascal Bart Date: Thu, 20 Sep 2001 18:32:20 +0000 (+0000) Subject: * src/lex.c (parse_percent_token): Change type of variable `tx', which X-Git-Tag: pre-merge-of-1-29-branch~13 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/82b6d266fdd393132bf7073acaea31f4f624b223 * 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. --- diff --git a/ChangeLog b/ChangeLog index 73264c4b..3ed3d477 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2001-09-20 Pascal Bart + + * 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 * doc/bison.texinfo: Adjust terminologies about prologue and epilogue diff --git a/TODO b/TODO index 11b1d349..3efcd4e4 100644 --- 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] diff --git a/src/Makefile.am b/src/Makefile.am index 322c614c..479bd977 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/getargs.c b/src/getargs.c index 29b349a4..7b0046a4 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -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); diff --git a/src/lex.c b/src/lex.c index 8241fbc8..61f1c262 100644 --- 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 index 00000000..71a45053 --- /dev/null +++ b/src/options.c @@ -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 +#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 index 00000000..c509580f --- /dev/null +++ b/src/options.h @@ -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_ */ diff --git a/src/reader.c b/src/reader.c index 83c6b3a6..7aeec65b 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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"