]> git.saurik.com Git - bison.git/commitdiff
* src/reader.c (readgram): Indent output macro YYSTYPE.
authorAkim Demaille <akim@epita.fr>
Wed, 15 Aug 2001 08:40:19 +0000 (08:40 +0000)
committerAkim Demaille <akim@epita.fr>
Wed, 15 Aug 2001 08:40:19 +0000 (08:40 +0000)
(packsymbols): Likewise.
(output_token_defines): Likewise.
* src/files.c: Standardize.
(compute_header_macro): New.
(defines_obstack_save): New. Use compute_header_macro.
(output_files): Update. Use defines_obstack_save.

ChangeLog
src/files.c
src/reader.c

index d1358cb6bb4c4cd89a1e4f999fae0919a74627eb..a2f4c315c5e40b5cc1fe560c74e8b325b9abb2d8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-08-15  Marc Autret  <prog@epita.fr>
+
+       * src/reader.c (readgram): Indent output macro YYSTYPE.
+       (packsymbols): Likewise.
+       (output_token_defines): Likewise.
+       * src/files.c: Standardize.
+       (compute_header_macro): New.
+       (defines_obstack_save): New. Use compute_header_macro.
+       (output_files): Update. Use defines_obstack_save.
+
 2001-08-15  Akim Demaille  <akim@epita.fr>
 
        * doc/bison.texinfo (Table of Symbols): Document
index 033d2816237fc08ff9513436825f98699dfeb273..f1cdfe6c54e859c4bb7ee1f0e5bbe6401579df12 100644 (file)
@@ -84,6 +84,37 @@ stringappend (const char *string1, const char *string2)
   return res;
 }
 
+
+/*---------------------------------------------------------------.
+|  Computes the macro name used to avoid double inclusion in the |
+|  header of the parser and store it in header_macro_name.       |
+`---------------------------------------------------------------*/
+
+static const char *
+compute_header_macro (void)
+{
+  int ite;
+  char *macro_name;
+
+  macro_name = XMALLOC (char,
+                       strlen (base_name) +
+                       strlen (header_extension) + 1);
+
+  stpcpy (macro_name, base_name);
+  strcat (macro_name, header_extension);
+
+  for (ite = 0; macro_name[ite]; ite++)
+    if (macro_name[ite] == '.')
+      macro_name[ite] = '_';
+    else
+      {
+       if (islower (macro_name[ite]))
+         macro_name[ite] -= ('a' - 'A');
+      }
+  return macro_name;
+}
+
+
 /*-----------------------------------------------------------------.
 | Try to open file NAME with mode MODE, and print an error message |
 | if fails.                                                        |
@@ -133,6 +164,25 @@ obstack_save (struct obstack *obs, const char *filename)
   xfclose (out);
 }
 
+/*---------------------------------------------------------------------.
+| Output double inclusion protection macros and saves defines_obstack  |
+`---------------------------------------------------------------------*/
+
+static void
+defines_obstack_save (const char *filename)
+{
+  FILE *out = xfopen (filename, "w");
+  size_t size = obstack_object_size (&defines_obstack);
+  char *macro_name = compute_header_macro ();
+
+  fprintf (out, "#ifndef %s\n", macro_name);
+  fprintf (out, "# define %s\n\n", macro_name);
+  fwrite (obstack_finish (&defines_obstack), 1, size, out);
+  fprintf (out, "\n#endif /* not %s */\n", macro_name);
+
+  free (macro_name);
+  xfclose (out);
+}
 
 /*------------------------------------------------------------------.
 | Return the path to the skeleton which locaction might be given in |
@@ -397,8 +447,7 @@ output_files (void)
 
   /* Output the header file if wanted. */
   if (defines_flag)
-    obstack_save (&defines_obstack,
-                 stringappend (base_name, header_extension));
+    defines_obstack_save (stringappend (base_name, header_extension));
 
   /* If we output only the table, dump the actions in ACTFILE. */
   if (no_parser_flag)
index 1cf688a429af9cb5d4ae986078edfcc95eb99b4d..7e23c0ef94a6537c4554bc9b29928734e6635eda 100644 (file)
@@ -1575,9 +1575,9 @@ readgram (void)
                           "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
       if (defines_flag)
        obstack_sgrow (&defines_obstack, "\
-#ifndef YYSTYPE\n\
-# define YYSTYPE int\n\
-#endif\n");
+# ifndef YYSTYPE\n\
+#  define YYSTYPE int\n\
+# endif\n");
     }
 
   /* Report any undefined symbols and consider them nonterminals.  */
@@ -1634,11 +1634,11 @@ output_token_defines (struct obstack *oout)
       if (c != '\0')
        continue;
 
-      obstack_fgrow2 (oout, "#define\t%s\t%d\n",
+      obstack_fgrow2 (oout, "# define\t%s\t%d\n",
                      symbol,
                      (translations ? bp->user_token_number : bp->value));
       if (semantic_parser)
-       obstack_fgrow2 (oout, "#define\tT%s\t%d\n", symbol, bp->value);
+       obstack_fgrow2 (oout, "# define\tT%s\t%d\n", symbol, bp->value);
     }
 
   obstack_1grow (oout, '\n');
@@ -1793,7 +1793,7 @@ packsymbols (void)
            /* don't make these for dummy nonterminals made by gensym.  */
            if (*tags[i] != '@')
               obstack_fgrow2 (&defines_obstack,
-                              "#define\tNT%s\t%d\n", tags[i], i);
+                              "# define\tNT%s\t%d\n", tags[i], i);
          }
 #if 0
       /* `fdefines' is now a temporary file, so we need to copy its