]> git.saurik.com Git - bison.git/blobdiff - src/conflicts.c
2001-08-20 Robert Anisko <robert.anisko@epita.fr>
[bison.git] / src / conflicts.c
index 7606ff63c5c4ade39497116e3c7462de8d3f90c9..208f791004816bc516c6944d98c8b084c34f2a3f 100644 (file)
@@ -1,5 +1,5 @@
 /* Find and resolve or report look-ahead conflicts for bison,
-   Copyright 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');
     }
 }