From: Akim Demaille Date: Wed, 14 Nov 2001 14:43:58 +0000 (+0000) Subject: * src/print.c: Include reduce.h. X-Git-Tag: before-m4-back-end~311 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/09b503c8e1b6d4db4dd8f9c35390e0fe338a9314?hp=0f37a9942fa297c9e45e5224844c1938a45834f2 * src/print.c: Include reduce.h. Reported by Hans Aberg. --- diff --git a/ChangeLog b/ChangeLog index b3ec41f2..892cc343 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2001-11-14 Akim Demaille + + * src/print.c: Include reduce.h. + Reported by Hans Aberg. + +2001-11-14 Akim Demaille + + * src/lex.c, src/lex.h (token_buffer, unlexed_token_buffer): + Revert a previous patch: these are really const. + * src/conflicts.c (conflict_report): Additional useless pair of + braces to pacify GCC's warnings for `if () if () {} else {}'. + * src/lex.c (parse_percent_token): Replace equal_offset with + arg_offset. + arg is const. + Be sure to strdup `arg' when used, since there is no reason for + token_buffer not to change. + 2001-11-14 Akim Demaille * src/system.h (EXIT_SUCCESS, EXIT_FAILURE): Ensure a proper diff --git a/src/conflicts.c b/src/conflicts.c index 91345366..1497dd1b 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -474,24 +474,26 @@ conflicts_print (void) /* Report the total number of conflicts on STDERR. */ if (src_total || rrc_total) - if (yacc_flag) - { - /* If invoked with `--yacc', use the output format specified by - POSIX. */ - fprintf (stderr, _("conflicts: ")); - if (src_total > 0) - fprintf (stderr, _(" %d shift/reduce"), src_total); - if (src_total > 0 && rrc_total > 0) - fprintf (stderr, ","); - if (rrc_total > 0) - fprintf (stderr, _(" %d reduce/reduce"), rrc_total); - putc ('\n', stderr); - } - else - { - fprintf (stderr, _("%s contains "), infile); - fputs (conflict_report (src_total, rrc_total), stderr); - } + { + if (yacc_flag) + { + /* If invoked with `--yacc', use the output format specified by + POSIX. */ + fprintf (stderr, _("conflicts: ")); + if (src_total > 0) + fprintf (stderr, _(" %d shift/reduce"), src_total); + if (src_total > 0 && rrc_total > 0) + fprintf (stderr, ","); + if (rrc_total > 0) + fprintf (stderr, _(" %d reduce/reduce"), rrc_total); + putc ('\n', stderr); + } + else + { + fprintf (stderr, _("%s contains "), infile); + fputs (conflict_report (src_total, rrc_total), stderr); + } + } if (expected_conflicts != -1 && src_total != expected_conflicts) diff --git a/src/lex.c b/src/lex.c index 3888b215..651ff98e 100644 --- a/src/lex.c +++ b/src/lex.c @@ -30,15 +30,15 @@ /* Buffer for storing the current token. */ static struct obstack token_obstack; -char *token_buffer = NULL; +const char *token_buffer = NULL; -bucket *symval; +bucket *symval = NULL; int numval; /* A token to be reread, see unlex and lex. */ static token_t unlexed = tok_undef; static bucket *unlexed_symval = NULL; -static char *unlexed_token_buffer = NULL; +static const char *unlexed_token_buffer = NULL; void lex_init (void) @@ -554,9 +554,9 @@ token_t parse_percent_token (void) { const struct option_table_struct *tx = NULL; - /* Where `=' was found in token_buffer. */ - size_t equal_offset = 0; - char *arg = NULL; + const char *arg = NULL; + /* Where the ARG was found in token_buffer. */ + size_t arg_offset = 0; int c = getc (finput); @@ -598,33 +598,34 @@ parse_percent_token (void) c = getc (finput); } + /* %DIRECTIVE="ARG". Separate into + TOKEN_BUFFER = `%DIRECTIVE\0ARG\0'. + This is a bit hackish, but once we move to a Bison parser, + things will be cleaned up. */ if (c == '=') { - equal_offset = obstack_object_size (&token_obstack); - obstack_1grow (&token_obstack, c); + /* End of the directive. We skip the `='. */ + obstack_1grow (&token_obstack, '\0'); + /* Fetch the ARG if present. */ c = getc (finput); - if (c = '"') + if (c == '"') { - int code; /* ignored here */ - - obstack_1grow (&token_obstack, '"'); - /* Read up to and including ". */ - while (literalchar (&token_obstack, &code, '"')) - /* nothing */; + int code; + arg_offset = obstack_object_size (&token_obstack); + /* Read up to and including `"'. Do not append the closing + `"' in the output: it's not part of the ARG. */ + while (literalchar (NULL, &code, '"')) + obstack_1grow (&token_obstack, code); } + /* else: should be an error. */ } else ungetc (c, finput); obstack_1grow (&token_obstack, '\0'); token_buffer = obstack_finish (&token_obstack); - if (equal_offset) - { - /* %token_buffer="arg" */ - arg = token_buffer + equal_offset + 2; - arg[strlen (arg) - 1] = '\0'; - token_buffer[equal_offset] = '\0'; - } + if (arg_offset) + arg = token_buffer + arg_offset; /* table lookup % directive */ for (tx = option_table; tx->name; tx++) @@ -647,7 +648,7 @@ parse_percent_token (void) precedence. Side effect: if this %-option is used several times, only the first is honored. Bah. */ if (!*((char **) (tx->set_flag))) - *((char **) (tx->set_flag)) = arg; + *((char **) (tx->set_flag)) = xstrdup (arg); } else fatal (_("`%s' requires an argument"), token_buffer); diff --git a/src/lex.h b/src/lex.h index 38edec80..16ac115a 100644 --- a/src/lex.h +++ b/src/lex.h @@ -57,7 +57,7 @@ typedef enum token_e tok_obsolete } token_t; -extern char *token_buffer; +extern const char *token_buffer; extern bucket *symval; extern int numval; diff --git a/src/print.c b/src/print.c index a5c4aeb6..ce24fa58 100644 --- a/src/print.c +++ b/src/print.c @@ -1,5 +1,5 @@ /* Print information on generated parser, for bison, - Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc. + Copyright 1984, 1986, 1989, 2000, 2001 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -29,6 +29,7 @@ #include "state.h" #include "reader.h" #include "print.h" +#include "reduce.h" #if 0 static void