]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
Also handle the output file (--verbose) with obstacks.
[bison.git] / src / reader.c
index 156fa452ffc9b1660be1bda9ddee274f56d3aa1a..4f62e759a8e731c6af7f26311881c3c6988e6d58 100644 (file)
@@ -153,20 +153,17 @@ get_type_name (int n, symbol_list * rule)
   return rp->sym->type_name;
 }
 \f
-/*-----------------------------------------------------------------.
-| Dump the string from FIN to FOUT and OOUT if non null.  MATCH is |
-| the delimiter of the string (either ' or ").                     |
-`-----------------------------------------------------------------*/
+/*------------------------------------------------------------.
+| Dump the string from FIN to OOUT if non null.  MATCH is the |
+| delimiter of the string (either ' or ").                    |
+`------------------------------------------------------------*/
 
 static inline void
-copy_string (FILE *fin, FILE *fout, struct obstack *oout, int match)
+copy_string (FILE *fin, struct obstack *oout, int match)
 {
   int c;
 
-  if (fout)
-    putc (match, fout);
-  if (oout)
-    obstack_1grow (oout, match);
+  obstack_1grow (oout, match);
 
   c = getc (fin);
 
@@ -182,20 +179,14 @@ copy_string (FILE *fin, FILE *fout, struct obstack *oout, int match)
          continue;
        }
 
-      if (fout)
-       putc (c, fout);
-      if (oout)
-       obstack_1grow (oout, c);
+      obstack_1grow (oout, c);
 
       if (c == '\\')
        {
          c = getc (fin);
          if (c == EOF)
            fatal (_("unterminated string at end of file"));
-         if (fout)
-           putc (c, fout);
-         if (oout)
-           obstack_1grow (oout, c);
+         obstack_1grow (oout, c);
 
          if (c == '\n')
            lineno++;
@@ -204,34 +195,27 @@ copy_string (FILE *fin, FILE *fout, struct obstack *oout, int match)
       c = getc (fin);
     }
 
-  if (fout)
-    putc (c, fout);
-  if (oout)
-    obstack_1grow (oout, c);
+  obstack_1grow (oout, c);
 }
 
 
-/*----------------------------------------------------------------.
-| Dump the wannabee comment from IN to OUT1 and OUT2.  In fact we |
-| just saw a `/', which might or might not be a comment.  In any  |
-| case, copy what we saw.                                         |
-|                                                                 |
-| OUT2 might be NULL.                                             |
-`----------------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| Dump the wannabee comment from IN to OUT1 and OUT2 (which can be |
+| NULL).  In fact we just saw a `/', which might or might not be a |
+| comment.  In any case, copy what we saw.                         |
+|                                                                  |
+| OUT2 might be NULL.                                              |
+`-----------------------------------------------------------------*/
 
 static inline void
-copy_comment2 (FILE *fin, FILE *out1,
-              struct obstack *oout2, struct obstack *oout)
+copy_comment2 (FILE *fin, struct obstack *oout1, struct obstack *oout2)
 {
   int cplus_comment;
   int ended;
   int c;
 
   /* We read a `/', output it. */
-  if (out1)
-    putc ('/', out1);
-  if (oout)
-    obstack_1grow (oout, '/');
+  obstack_1grow (oout1, '/');
   if (oout2)
     obstack_1grow (oout2, '/');
 
@@ -248,10 +232,7 @@ copy_comment2 (FILE *fin, FILE *out1,
       return;
     }
 
-  if (out1)
-    putc (c, out1);
-  if (oout)
-    obstack_1grow (oout, c);
+  obstack_1grow (oout1, c);
   if (oout2)
     obstack_1grow (oout2, c);
   c = getc (fin);
@@ -263,10 +244,7 @@ copy_comment2 (FILE *fin, FILE *out1,
        {
          while (c == '*')
            {
-             if (out1)
-               putc (c, out1);
-             if (oout)
-               obstack_1grow (oout, c);
+             obstack_1grow (oout1, c);
              if (oout2)
                obstack_1grow (oout2, c);
              c = getc (fin);
@@ -274,10 +252,7 @@ copy_comment2 (FILE *fin, FILE *out1,
 
          if (c == '/')
            {
-             if (out1)
-               putc (c, out1);
-             if (oout)
-               obstack_1grow (oout, c);
+             obstack_1grow (oout1, c);
              if (oout2)
                obstack_1grow (oout2, c);
              ended = 1;
@@ -286,10 +261,7 @@ copy_comment2 (FILE *fin, FILE *out1,
       else if (c == '\n')
        {
          lineno++;
-         if (out1)
-           putc (c, out1);
-         if (oout)
-           obstack_1grow (oout, c);
+         obstack_1grow (oout1, c);
          if (oout2)
            obstack_1grow (oout2, c);
          if (cplus_comment)
@@ -301,10 +273,7 @@ copy_comment2 (FILE *fin, FILE *out1,
        fatal (_("unterminated comment"));
       else
        {
-         if (out1)
-           putc (c, out1);
-         if (oout)
-           obstack_1grow (oout, c);
+         obstack_1grow (oout1, c);
          if (oout2)
            obstack_1grow (oout2, c);
          c = getc (fin);
@@ -315,35 +284,32 @@ copy_comment2 (FILE *fin, FILE *out1,
 
 /*-------------------------------------------------------------------.
 | Dump the comment (actually the current string starting with a `/') |
-| from FIN to FOUT.                                                  |
+| from FIN to OOUT.                                                  |
 `-------------------------------------------------------------------*/
 
 static inline void
-copy_comment (FILE *fin, FILE *fout, struct obstack *oout)
+copy_comment (FILE *fin, struct obstack *oout)
 {
-  copy_comment2 (fin, fout, NULL, oout);
+  copy_comment2 (fin, oout, NULL);
 }
 
 
 /*-----------------------------------------------------------------.
-| FIN is pointing to a location (i.e., a `@').  Output to FOUT a   |
+| FIN is pointing to a location (i.e., a `@').  Output to OOUT a   |
 | reference to this location. STACK_OFFSET is the number of values |
 | in the current rule so far, which says where to find `$0' with   |
 | respect to the top of the stack.                                 |
 `-----------------------------------------------------------------*/
 
 static inline void
-copy_at (FILE *fin, FILE *fout, struct obstack *oout, int stack_offset)
+copy_at (FILE *fin, struct obstack *oout, int stack_offset)
 {
   int c;
 
   c = getc (fin);
   if (c == '$')
     {
-      if (fout)
-       fprintf (fout, "yyloc");
-      if (oout)
-       obstack_grow_string (oout, "yyloc");
+      obstack_sgrow (oout, "yyloc");
       locations_flag = 1;
     }
   else if (isdigit (c) || c == '-')
@@ -354,11 +320,7 @@ copy_at (FILE *fin, FILE *fout, struct obstack *oout, int stack_offset)
       ungetc (c, fin);
       n = read_signed_integer (fin);
 
-      sprintf (buf, "yylsp[%d]", n - stack_offset);
-      if (fout)
-       fputs (buf, fout);
-      if (oout)
-       obstack_grow (oout, buf, strlen (buf));
+      obstack_fgrow1 (oout, "yylsp[%d]", n - stack_offset);
       locations_flag = 1;
     }
   else
@@ -375,13 +337,13 @@ copy_at (FILE *fin, FILE *fout, struct obstack *oout, int stack_offset)
 |                                                                    |
 | Possible inputs: $[<TYPENAME>]($|integer)                          |
 |                                                                    |
-| Output to FOUT a reference to this semantic value. STACK_OFFSET is |
+| Output to OOUT a reference to this semantic value. STACK_OFFSET is |
 | the number of values in the current rule so far, which says where  |
 | to find `$0' with respect to the top of the stack.                 |
 `-------------------------------------------------------------------*/
 
 static inline void
-copy_dollar (FILE *fin, FILE *fout, struct obstack *oout,
+copy_dollar (FILE *fin, struct obstack *oout,
             symbol_list *rule, int stack_offset)
 {
   int c = getc (fin);
@@ -398,20 +360,12 @@ copy_dollar (FILE *fin, FILE *fout, struct obstack *oout,
 
   if (c == '$')
     {
-      if (fout)
-       fputs ("yyval", fout);
-      if (oout)
-       obstack_grow_string (oout, "yyval");
+      obstack_sgrow (oout, "yyval");
 
       if (!type_name)
        type_name = get_type_name (0, rule);
       if (type_name)
-       {
-         if (fout)
-           fprintf (fout, ".%s", type_name);
-         if (oout)
-           obstack_fgrow1 (oout, ".%s", type_name);
-       }
+       obstack_fgrow1 (oout, ".%s", type_name);
       if (!type_name && typed)
        complain (_("$$ of `%s' has no declared type"),
                  rule->sym->tag);
@@ -425,18 +379,10 @@ copy_dollar (FILE *fin, FILE *fout, struct obstack *oout,
       if (!type_name && n > 0)
        type_name = get_type_name (n, rule);
 
-      if (fout)
-       fprintf (fout, "yyvsp[%d]", n - stack_offset);
-      if (oout)
-       obstack_fgrow1 (oout, "yyvsp[%d]", n - stack_offset);
+      obstack_fgrow1 (oout, "yyvsp[%d]", n - stack_offset);
 
       if (type_name)
-       {
-         if (fout)
-           fprintf (fout, ".%s", type_name);
-         if (oout)
-           obstack_fgrow1 (oout, ".%s", type_name);
-       }
+       obstack_fgrow1 (oout, ".%s", type_name);
       if (!type_name && typed)
        complain (_("$%d of `%s' has no declared type"),
                  n, rule->sym->tag);
@@ -484,11 +430,11 @@ copy_definition (void)
 
        case '\'':
        case '"':
-         copy_string (finput, 0, &attrs_obstack, c);
+         copy_string (finput, &attrs_obstack, c);
          break;
 
        case '/':
-         copy_comment (finput, 0, &attrs_obstack);
+         copy_comment (finput, &attrs_obstack);
          break;
 
        case EOF:
@@ -786,9 +732,9 @@ parse_union_decl (void)
   else
     obstack_1grow (&attrs_obstack, '\n');
 
-  obstack_grow_string (&attrs_obstack, "typedef union");
+  obstack_sgrow (&attrs_obstack, "typedef union");
   if (defines_flag)
-    obstack_grow_string (&defines_obstack, "typedef union");
+    obstack_sgrow (&defines_obstack, "typedef union");
 
   c = getc (finput);
 
@@ -805,7 +751,7 @@ parse_union_decl (void)
          break;
 
        case '/':
-         copy_comment2 (finput, 0, &defines_obstack, &attrs_obstack);
+         copy_comment2 (finput, &defines_obstack, &attrs_obstack);
          break;
 
        case '{':
@@ -818,9 +764,9 @@ parse_union_decl (void)
          count--;
          if (count <= 0)
            {
-             obstack_grow_string (&attrs_obstack, " YYSTYPE;\n");
+             obstack_sgrow (&attrs_obstack, " YYSTYPE;\n");
              if (defines_flag)
-               obstack_grow_string (&defines_obstack, " YYSTYPE;\n");
+               obstack_sgrow (&defines_obstack, " YYSTYPE;\n");
              /* JF don't choke on trailing semi */
              c = skip_white_space ();
              if (c != ';')
@@ -1002,8 +948,6 @@ read_declarations (void)
              break;
 
            case SEMANTIC_PARSER:
-             if (!semantic_parser)
-               fguard = xfopen (guardfile, "w");
              semantic_parser = 1;
              break;
 
@@ -1081,20 +1025,20 @@ copy_action (symbol_list *rule, int stack_offset)
 
            case '\'':
            case '"':
-             copy_string (finput, 0, &action_obstack, c);
+             copy_string (finput, &action_obstack, c);
              break;
 
            case '/':
-             copy_comment (finput, 0, &action_obstack);
+             copy_comment (finput, &action_obstack);
              break;
 
            case '$':
-             copy_dollar (finput, 0, &action_obstack,
+             copy_dollar (finput, &action_obstack,
                           rule, stack_offset);
              break;
 
            case '@':
-             copy_at (finput, 0, &action_obstack,
+             copy_at (finput, &action_obstack,
                       stack_offset);
              break;
 
@@ -1117,7 +1061,7 @@ copy_action (symbol_list *rule, int stack_offset)
        }
     }
 
-  obstack_grow_string (&action_obstack, ";\n    break;}");
+  obstack_sgrow (&action_obstack, ";\n    break;}");
 }
 \f
 /*-------------------------------------------------------------------.
@@ -1140,11 +1084,11 @@ copy_guard (symbol_list *rule, int stack_offset)
   if (semantic_parser)
     stack_offset = 0;
 
-  fprintf (fguard, "\ncase %d:\n", nrules);
+  obstack_fgrow1 (&guard_obstack, "\ncase %d:\n", nrules);
   if (!no_lines_flag)
-    fprintf (fguard, "#line %d %s\n",
-            lineno, quotearg_style (c_quoting_style, infile));
-  putc ('{', fguard);
+    obstack_fgrow2 (&guard_obstack, "#line %d %s\n",
+                   lineno, quotearg_style (c_quoting_style, infile));
+  obstack_1grow (&guard_obstack, '{');
 
   count = 0;
   c = getc (finput);
@@ -1154,18 +1098,18 @@ copy_guard (symbol_list *rule, int stack_offset)
       switch (c)
        {
        case '\n':
-         putc (c, fguard);
+         obstack_1grow (&guard_obstack, c);
          lineno++;
          break;
 
        case '{':
-         putc (c, fguard);
+         obstack_1grow (&guard_obstack, c);
          brace_flag = 1;
          count++;
          break;
 
        case '}':
-         putc (c, fguard);
+         obstack_1grow (&guard_obstack, c);
          if (count > 0)
            count--;
          else
@@ -1177,26 +1121,26 @@ copy_guard (symbol_list *rule, int stack_offset)
 
        case '\'':
        case '"':
-         copy_string (finput, fguard, 0, c);
+         copy_string (finput, &guard_obstack, c);
          break;
 
        case '/':
-         copy_comment (finput, fguard, 0);
+         copy_comment (finput, &guard_obstack);
          break;
 
        case '$':
-         copy_dollar (finput, fguard, 0, rule, stack_offset);
+         copy_dollar (finput, &guard_obstack, rule, stack_offset);
          break;
 
        case '@':
-         copy_at (finput, fguard, 0, stack_offset);
+         copy_at (finput, &guard_obstack, stack_offset);
          break;
 
        case EOF:
          fatal ("%s", _("unterminated %guard clause"));
 
        default:
-         putc (c, fguard);
+         obstack_1grow (&guard_obstack, c);
        }
 
       if (c != '}' || count != 0)
@@ -1205,7 +1149,7 @@ copy_guard (symbol_list *rule, int stack_offset)
 
   c = skip_white_space ();
 
-  fprintf (fguard, ";\n    break;}");
+  obstack_sgrow (&guard_obstack, ";\n    break;}");
   if (c == '{')
     copy_action (rule, stack_offset);
   else if (c == '=')
@@ -1596,10 +1540,10 @@ readgram (void)
       /* We used to use `unsigned long' as YYSTYPE on MSDOS,
          but it seems better to be consistent.
          Most programs should declare their own type anyway.  */
-      obstack_grow_string (&attrs_obstack,
+      obstack_sgrow (&attrs_obstack,
                           "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
       if (defines_flag)
-       obstack_grow_string (&defines_obstack, "\
+       obstack_sgrow (&defines_obstack, "\
 #ifndef YYSTYPE\n\
 # define YYSTYPE int\n\
 #endif\n");
@@ -1809,7 +1753,7 @@ packsymbols (void)
            obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
                            spec_name_prefix);
          else
-           obstack_grow_string (&defines_obstack,
+           obstack_sgrow (&defines_obstack,
                                 "\nextern YYSTYPE yylval;\n");
        }
 
@@ -1898,7 +1842,7 @@ packgram (void)
 \f
 /*-------------------------------------------------------------------.
 | Read in the grammar specification and record it in the format      |
-| described in gram.h.  All guards are copied into the FGUARD file   |
+| described in gram.h.  All guards are copied into the GUARD_OBSTACK |
 | and all actions into ACTION_OBSTACK, in each case forming the body |
 | of a C function (YYGUARD or YYACTION) which contains a switch      |
 | statement to decide which guard or action to execute.              |
@@ -1962,7 +1906,7 @@ reader (void)
                  no_parser_flag ? "Bison-generated parse tables" : "A Bison parser",
                  infile, VERSION);
 
-  obstack_grow_string (&table_obstack,
+  obstack_sgrow (&table_obstack,
                       "#define YYBISON 1  /* Identify Bison output.  */\n\n");
   read_declarations ();
   /* Start writing the guard and action files, if they are needed.  */
@@ -1977,7 +1921,7 @@ reader (void)
   /* Write closing delimiters for actions and guards.  */
   output_trailers ();
   if (locations_flag)
-    obstack_grow_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n");
+    obstack_sgrow (&table_obstack, "#define YYLSP_NEEDED 1\n\n");
   /* Assign the symbols their symbol numbers.  Write #defines for the
      token symbols into FDEFINES if requested.  */
   packsymbols ();
@@ -1998,7 +1942,7 @@ void
 reader_output_yylsp (struct obstack *oout)
 {
   if (locations_flag)
-    obstack_grow_string (oout, "\
+    obstack_sgrow (oout, "\
 \n\
 #ifndef YYLTYPE\n\
 typedef struct yyltype\n\