]> git.saurik.com Git - bison.git/blobdiff - src/output.c
Use unlocked I/O for a minor performance improvement on hosts like
[bison.git] / src / output.c
index 2b5e9154b8e9e5fb8f537e635661e27297c9c46a..3dcd2287644d81327121c0a1602570138ee878ef 100644 (file)
@@ -17,8 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 
 #include "system.h"
 #include "muscle_tab.h"
 #include "output.h"
 #include "reader.h"
+#include "scan-skel.h"
 #include "symtab.h"
 #include "tables.h"
 
-/* From src/scan-skel.l. */
-void scan_skel (FILE *);
-
 
 static struct obstack format_obstack;
 
@@ -60,7 +58,7 @@ bool error_verbose = false;
 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type)                       \
                                                                        \
 static void                                                            \
-Name (const char *name,                                                        \
+Name (char const *name,                                                        \
       Type *table_data,                                                        \
       Type first,                                                      \
       int begin,                                                       \
@@ -121,7 +119,7 @@ static void
 escaped_output (FILE *out, char const *string)
 {
   char const *p;
-  fprintf (out, "[[");
+  fputs ("[[", out);
 
   for (p = quotearg_style (c_quoting_style, string); *p; p++)
     switch (*p)
@@ -133,7 +131,7 @@ escaped_output (FILE *out, char const *string)
       default: fputc (*p, out); break;
       }
 
-  fprintf (out, "]]");
+  fputs ("]]", out);
 }
 
 
@@ -145,6 +143,7 @@ escaped_output (FILE *out, char const *string)
 static void
 prepare_symbols (void)
 {
+  MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
   MUSCLE_INSERT_INT ("tokens_number", ntokens);
   MUSCLE_INSERT_INT ("nterms_number", nvars);
   MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
@@ -162,10 +161,7 @@ prepare_symbols (void)
     int j = 2;
     for (i = 0; i < nsyms; i++)
       {
-       char const *tag = symbols[i]->tag;
-       char const *cp = (*tag == '"'
-                         ? tag
-                         : quotearg_style (c_quoting_style, tag));
+       char const *cp = quotearg_style (c_quoting_style, symbols[i]->tag);
        /* Width of the next token, including the two quotes, the
           comma and the space.  */
        int width = strlen (cp) + 2;
@@ -306,8 +302,7 @@ user_actions_output (FILE *out)
        fprintf (out, "]b4_syncline(%d, ",
                 rules[r].action_location.start.line);
        escaped_output (out, rules[r].action_location.start.file);
-       fprintf (out, ")[\n");
-       fprintf (out, "    %s\n    break;\n\n",
+       fprintf (out, ")[\n    %s\n    break;\n\n",
                 rules[r].action);
       }
   fputs ("]])\n\n", out);
@@ -561,7 +556,8 @@ output_skeleton (void)
 
   out = fdopen (filter_fd[0], "w");
   if (! out)
-    error (EXIT_FAILURE, get_errno (), "fdopen");
+    error (EXIT_FAILURE, get_errno (),
+          "fdopen");
 
   /* Output the definitions of all the muscles.  */
   fputs ("m4_init()\n", out);
@@ -580,9 +576,11 @@ output_skeleton (void)
 
   /* Read and process m4's output.  */
   timevar_push (TV_M4);
+  end_of_output_subpipe (pid, filter_fd);
   in = fdopen (filter_fd[1], "r");
   if (! in)
-    error (EXIT_FAILURE, get_errno (), "fdopen");
+    error (EXIT_FAILURE, get_errno (),
+          "fdopen");
   scan_skel (in);
   xfclose (in);
   reap_subpipe (pid, m4);
@@ -602,6 +600,16 @@ prepare (void)
 
   /* File names.  */
   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
+#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
+  DEFINE (dir_prefix);
+  DEFINE (parser_file_name);
+  DEFINE (spec_defines_file);
+  DEFINE (spec_file_prefix);
+  DEFINE (spec_graph_file);
+  DEFINE (spec_name_prefix);
+  DEFINE (spec_outfile);
+  DEFINE (spec_verbose_file);
+#undef DEFINE
 
   /* User Code.  */
   obstack_1grow (&pre_prologue_obstack, 0);
@@ -618,8 +626,12 @@ prepare (void)
        skeleton = "yacc.c";
     }
 
-  /* Parse the skeleton file and output the needed parsers.  */
-  MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
+  /* About the skeletons. */
+  {
+    char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
+    MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR);
+    MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
+  }
 }