X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/89cab50df11c5f02d719db0239eabc0fb6095ec8..4134cae3c5ff2fc3346ebc5b10d5c25c72c72cfe:/src/conflicts.c diff --git a/src/conflicts.c b/src/conflicts.c index f89c3a38..208f7910 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,5 +1,5 @@ /* Find and resolve or report look-ahead conflicts for bison, - Copyright (C) 1984, 1989, 1992, 2000 Free Software Foundation, Inc. + Copyright 1984, 1989, 1992, 2000, 2001 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -45,11 +45,10 @@ static int rrc_count; static inline void log_resolution (int state, int LAno, int token, char *resolution) { - if (verbose_flag) - fprintf (foutput, - _("\ + obstack_fgrow4 (&output_obstack, + _("\ Conflict in state %d between rule %d and token %s resolved as %s.\n"), - state, LAruleno[LAno], tags[token], resolution); + state, LAruleno[LAno], tags[token], resolution); } @@ -407,29 +406,50 @@ count_rr_conflicts (int state) } } -/*----------------------------------------------------------. -| Output to OUT a human readable report on shift/reduce and | -| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | -`----------------------------------------------------------*/ +/*--------------------------------------------------------------. +| Return a human readable string which reports shift/reduce and | +| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). | +`--------------------------------------------------------------*/ -static void -conflict_report (FILE *out, int src_num, int rrc_num) +static const char * +conflict_report (int src_num, int rrc_num) { + static char res[4096]; + char *cp = res; + if (src_num == 1) - fprintf (out, _(" 1 shift/reduce conflict")); + { + sprintf (cp, _(" 1 shift/reduce conflict")); + cp += strlen (cp); + } else if (src_num > 1) - fprintf (out, _(" %d shift/reduce conflicts"), src_num); + { + sprintf (cp, _(" %d shift/reduce conflicts"), src_num); + cp += strlen (cp); + } if (src_num > 0 && rrc_num > 0) - fprintf (out, _(" and")); + { + sprintf (cp, _(" and")); + cp += strlen (cp); + } if (rrc_num == 1) - fprintf (out, _(" 1 reduce/reduce conflict")); + { + sprintf (cp, _(" 1 reduce/reduce conflict")); + cp += strlen (cp); + } else if (rrc_num > 1) - fprintf (out, _(" %d reduce/reduce conflicts"), rrc_num); + { + sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num); + cp += strlen (cp); + } - putc ('.', out); - putc ('\n', out); + *cp++ = '.'; + *cp++ = '\n'; + *cp++ = '\0'; + + return res; } @@ -458,8 +478,9 @@ print_conflicts (void) if (verbose_flag) { - fprintf (foutput, _("State %d contains"), i); - conflict_report (foutput, src_count, rrc_count); + obstack_fgrow1 (&output_obstack, _("State %d contains"), i); + obstack_sgrow (&output_obstack, + conflict_report (src_count, rrc_count)); } } } @@ -481,7 +502,7 @@ print_conflicts (void) else { fprintf (stderr, _("%s contains"), infile); - conflict_report (stderr, src_total, rrc_total); + fputs (conflict_report (src_total, rrc_total), stderr); } } @@ -565,8 +586,9 @@ print_reductions (int state) for (i = 0; i < ntokens; i++) { if (mask & *fp3) - fprintf (foutput, _(" %-4s\t[reduce using rule %d (%s)]\n"), - tags[i], default_rule, tags[rlhs[default_rule]]); + obstack_fgrow3 (&output_obstack, + _(" %-4s\t[reduce using rule %d (%s)]\n"), + tags[i], default_rule, tags[rlhs[default_rule]]); mask <<= 1; if (mask == 0) @@ -576,8 +598,9 @@ print_reductions (int state) } } - fprintf (foutput, _(" $default\treduce using rule %d (%s)\n\n"), - default_rule, tags[rlhs[default_rule]]); + obstack_fgrow2 (&output_obstack, + _(" $default\treduce using rule %d (%s)\n\n"), + default_rule, tags[rlhs[default_rule]]); } else if (n - m >= 1) { @@ -664,7 +687,7 @@ print_reductions (int state) if (j != default_LA) { rule = LAruleno[j]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\treduce using rule %d (%s)\n"), tags[i], rule, tags[rlhs[rule]]); } @@ -678,13 +701,13 @@ print_reductions (int state) if (defaulted) { rule = LAruleno[default_LA]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\treduce using rule %d (%s)\n"), tags[i], rule, tags[rlhs[rule]]); defaulted = 0; } rule = LAruleno[j]; - fprintf (foutput, + obstack_fgrow3 (&output_obstack, _(" %-4s\t[reduce using rule %d (%s)]\n"), tags[i], rule, tags[rlhs[rule]]); } @@ -705,12 +728,11 @@ print_reductions (int state) } if (default_LA >= 0) - { - fprintf (foutput, _(" $default\treduce using rule %d (%s)\n"), - default_rule, tags[rlhs[default_rule]]); - } + obstack_fgrow2 (&output_obstack, + _(" $default\treduce using rule %d (%s)\n"), + default_rule, tags[rlhs[default_rule]]); - putc ('\n', foutput); + obstack_1grow (&output_obstack, '\n'); } }