mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-15 23:33:03 +00:00
* 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.
This commit is contained in:
77
src/lex.c
77
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 },
|
||||
const unsigned char *l, *r;
|
||||
int c;
|
||||
|
||||
{ NULL, NULL, tok_illegal}
|
||||
};
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user