]> git.saurik.com Git - bison.git/blobdiff - src/output.c
Avoid over-quoting of __line__ and __file.
[bison.git] / src / output.c
index f115bd2f8c0d898744324969a5c03d0bc48db410..789b2f03a310c5faa67fc96e3ff26f353816595e 100644 (file)
@@ -107,6 +107,30 @@ GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
 
 
+/*----------------------------------------------------------------------.
+| Print to OUT a representation of FILENAME escaped both for C and M4.  |
+`----------------------------------------------------------------------*/
+
+static void
+escaped_file_name_output (FILE *out, char const *filename)
+{
+  char const *p;
+  fprintf (out, "[[");
+
+  for (p = quotearg_style (c_quoting_style, filename); *p; p++)
+    switch (*p)
+      {
+      case '$': fputs ("$][", out); break;
+      case '@': fputs ("@@",  out); break;
+      case '[': fputs ("@{",  out); break;
+      case ']': fputs ("@}",  out); break;
+      default: fputc (*p, out); break;
+      }
+
+  fprintf (out, "]]");
+}
+
+
 /*------------------------------------------------------------------.
 | Prepare the muscles related to the symbols: translate, tname, and |
 | toknum.                                                           |
@@ -146,14 +170,7 @@ prepare_symbols (void)
            j = 2;
          }
 
-       for (; *cp; cp++)
-         switch (*cp)
-           {
-           case '[': obstack_sgrow (&format_obstack, "@<:@"); break;
-           case ']': obstack_sgrow (&format_obstack, "@:>@"); break;
-           default: obstack_1grow (&format_obstack, *cp); break;
-           }
-
+       MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
        obstack_sgrow (&format_obstack, ", ");
        j += strsize;
       }
@@ -181,7 +198,7 @@ prepare_symbols (void)
 
 /*-------------------------------------------------------------.
 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
-| rline, dprec, merger                                         |
+| rline, dprec, merger.                                        |
 `-------------------------------------------------------------*/
 
 static void
@@ -213,9 +230,9 @@ prepare_rules (void)
       rhs[i++] = -1;
       /* Line where rule was defined. */
       rline[r] = rules[r].location.first_line;
-      /* Dynamic precedence (GLR) */
+      /* Dynamic precedence (GLR) */
       dprec[r] = rules[r].dprec;
-      /* Merger-function index (GLR) */
+      /* Merger-function index (GLR) */
       merger[r] = rules[r].merger;
     }
   assert (i == nritems);
@@ -276,10 +293,10 @@ user_actions_output (FILE *out)
       {
        fprintf (out, "  case %d:\n", r + 1);
 
-       fprintf (out, "]b4_syncline([[%d]], [[%s]])[\n",
-                rules[r].action_location.first_line,
-                quotearg_style (escape_quoting_style,
-                                rules[r].action_location.file));
+       fprintf (out, "]b4_syncline([[%d]], ",
+                rules[r].action_location.first_line);
+       escaped_file_name_output (out, rules[r].action_location.file);
+       fprintf (out, ")[\n");
        fprintf (out, "    %s\n    break;\n\n",
                 rules[r].action);
       }
@@ -378,9 +395,10 @@ symbol_destructors_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           destructor, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                symbol->destructor_location.file,
+       fprintf (out, "%s[",
+                first ? "" : ",\n");
+       escaped_file_name_output (out, symbol->destructor_location.file);
+       fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
                 symbol->destructor_location.first_line,
                 symbol->tag,
                 symbol->number,
@@ -412,9 +430,10 @@ symbol_printers_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           printer, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                symbol->printer_location.file,
+       fprintf (out, "%s[",
+                first ? "" : ",\n");
+       escaped_file_name_output (out, symbol->printer_location.file);
+       fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
                 symbol->printer_location.first_line,
                 symbol->tag,
                 symbol->number,
@@ -507,10 +526,7 @@ output_skeleton (void)
   strcpy (full_path, pkgdatadir);
   full_path[pkgdatadirlen] = '/';
   strcpy (full_path + pkgdatadirlen + 1, m4sugar);
-  in = fopen (full_path, "r");
-  if (! in)
-    error (EXIT_FAILURE, errno, "%s", full_path);
-  xfclose (in);
+  xfclose (xfopen (full_path, "r"));
   strcpy (full_path + pkgdatadirlen + 1, skeleton);
 
   /* Create an m4 subprocess connected to us via two pipes.  */
@@ -572,13 +588,8 @@ prepare (void)
   MUSCLE_INSERT_INT ("pure", pure_parser);
   MUSCLE_INSERT_INT ("synclines_flag", !no_lines_flag);
 
-  /* FIXME: This is wrong: the muscles should decide whether they hold
-     a copy or not, but the situation is too obscure currently.  */
+  /* File names.  */
   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
-  MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
-  MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
-  MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
-  MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
 
   /* User Code.  */
   obstack_1grow (&pre_prologue_obstack, 0);
@@ -596,7 +607,7 @@ prepare (void)
     }
 
   /* Parse the skeleton file and output the needed parsers.  */
-  MUSCLE_INSERT_STRING ("skeleton", skeleton);
+  MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
 }