]> git.saurik.com Git - bison.git/blobdiff - src/output.c
(prepare_rules, token_definitions_output): Use abort rather than assert.
[bison.git] / src / output.c
index 430164737fc14c2e6bf1f9b051ecbaed5315cba6..da0d78525921b66fc73819d7cfce265fbb28e9f7 100644 (file)
@@ -1,4 +1,4 @@
-/* Output the generated parsing program for bison,
+/* Output the generated parsing program for Bison.
    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
@@ -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,12 +230,13 @@ 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);
+  if (i != nritems)
+    abort ();
 
   muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
   muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
@@ -276,11 +294,10 @@ user_actions_output (FILE *out)
       {
        fprintf (out, "  case %d:\n", r + 1);
 
-       if (!no_lines_flag)
-         fprintf (out, muscle_find ("linef"),
-                  rules[r].action_location.first_line,
-                  quotearg_style (c_quoting_style,
-                                  muscle_find ("filename")));
+       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);
       }
@@ -329,7 +346,8 @@ token_definitions_output (FILE *out)
       /* At this stage, if there are literal aliases, they are part of
         SYMBOLS, so we should not find symbols which are the aliases
         here.  */
-      assert (number != USER_NUMBER_ALIAS);
+      if (number == USER_NUMBER_ALIAS)
+       abort ();
 
       /* Skip error token.  */
       if (symbol == errtoken)
@@ -379,9 +397,11 @@ symbol_destructors_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           destructor, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                infile, symbol->destructor_location.first_line,
+       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,
                 symbol->destructor,
@@ -412,9 +432,11 @@ symbol_printers_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           printer, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                infile, symbol->printer_location.first_line,
+       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,
                 symbol->printer,
@@ -506,10 +528,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.  */
@@ -564,19 +583,15 @@ static void
 prepare (void)
 {
   /* Flags. */
-  MUSCLE_INSERT_INT ("locations_flag", locations_flag);
+  MUSCLE_INSERT_INT ("debug", debug_flag);
   MUSCLE_INSERT_INT ("defines_flag", defines_flag);
   MUSCLE_INSERT_INT ("error_verbose", error_verbose);
+  MUSCLE_INSERT_INT ("locations_flag", locations_flag);
   MUSCLE_INSERT_INT ("pure", pure_parser);
-  MUSCLE_INSERT_INT ("debug", debug_flag);
+  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);
@@ -594,7 +609,7 @@ prepare (void)
     }
 
   /* Parse the skeleton file and output the needed parsers.  */
-  MUSCLE_INSERT_STRING ("skeleton", skeleton);
+  MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
 }