+2002-06-14 Akim Demaille <akim@epita.fr>
+
+ * src/files.c (action_obstack): Remove, unused.
+ (output_obstack): Remove it, and all its dependencies, as it is no
+ longer needed.
+ * src/reader.c (epilogue_set): Build the epilogue in the
+ muscle_obstack.
+ * src/output.h, src/output.c (muscle_obstack): Move to...
+ * src/muscle_tab.h, src/muscle_tab.h: here.
+ (muscle_init): Initialize muscle_obstack.
+ (muscle_free): New.
+ * src/main.c (main): Call it.
+
+
2002-06-14 Akim Demaille <akim@epita.fr>
* src/location.h: New, extracted from...
/* Open and close files for bison,
- Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002
+ Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
FILE *finput = NULL;
-struct obstack action_obstack;
-struct obstack output_obstack;
struct obstack pre_prologue_obstack;
struct obstack post_prologue_obstack;
extern FILE *finput;
-/* Output all the action code; precise form depends on which parser. */
-extern struct obstack action_obstack;
-
/* If semantic parser, output a .h file that defines YYSTYPE... */
extern struct obstack pre_prologue_obstack;
extern struct obstack post_prologue_obstack;
-/* The verbose output. */
-extern struct obstack output_obstack;
-
extern char *infile;
void compute_output_file_names PARAMS((void));
free_nullable ();
free_derives ();
grammar_free ();
-
+ muscle_free ();
/* If using alloca.c, flush the alloca'ed memory for the benefit of
people running Bison as a library in IDEs. */
#if C_ALLOCA
#include "muscle_tab.h"
#include "getargs.h"
+
+/* An obstack used to create some entries. */
+struct obstack muscle_obstack;
+
/* Initial capacity of muscles hash table. */
#define HT_INITIAL_CAPACITY 257
return hash_string (m->key, tablesize);
}
+/*-----------------------------------------------------------------.
+| Create the MUSCLE_TABLE, and initialize it with default values. |
+| Also set up the MUSCLE_OBSTACK. |
+`-----------------------------------------------------------------*/
+
void
muscle_init (void)
{
muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle,
- hash_compare_muscles, NULL);
+ hash_compare_muscles, free);
/* Version and input file. */
muscle_insert ("version", VERSION);
muscle_insert ("filename", infile);
+ /* FIXME: there should probably be no default here, only in the
+ skeletons. */
+
/* Types. */
muscle_insert ("ltype", "yyltype");
/* C++ macros. */
muscle_insert ("name", "Parser");
+
+ /* Initialize the muscle obstack. */
+ obstack_init (&muscle_obstack);
}
+
+/*------------------------------------------------------------.
+| Free all the memory consumed by the muscle machinery only. |
+`------------------------------------------------------------*/
+
+void
+muscle_free (void)
+{
+ hash_free (muscle_table);
+ obstack_free (&muscle_obstack, NULL);
+}
+
+
+
void
muscle_insert (const char *key, const char *value)
{
void muscle_init PARAMS ((void));
void muscle_insert PARAMS ((const char *key, const char *value));
const char *muscle_find PARAMS ((const char *key));
+void muscle_free PARAMS ((void));
+
+
+/* An obstack dedicated to receive muscle keys and values. */
+extern struct obstack muscle_obstack;
#define MUSCLE_INSERT_INT(Key, Value) \
{ \
static int lowzero;
static int high;
-struct obstack muscle_obstack;
static struct obstack format_obstack;
int error_verbose = 0;
/* Process the selected skeleton file. */
output_skeleton ();
- obstack_free (&muscle_obstack, NULL);
obstack_free (&format_obstack, NULL);
- obstack_free (&action_obstack, NULL);
obstack_free (&pre_prologue_obstack, NULL);
obstack_free (&post_prologue_obstack, NULL);
}
void actions_output PARAMS ((FILE *out));
void token_definitions_output PARAMS ((FILE *out));
-extern struct obstack muscle_obstack;
-
#endif /* !OUTPUT_H_ */
that conflicts with Posix. */
FILE *out = xfopen (spec_verbose_file, "w");
- size_t size = obstack_object_size (&output_obstack);
- fwrite (obstack_finish (&output_obstack), 1, size, out);
- obstack_free (&output_obstack, NULL);
-
- if (size)
- fputs ("\n\n", out);
-
reduce_output (out);
conflicts_output (out);
void
epilogue_set (const char *epilogue, location_t location)
{
- struct obstack el_obstack;
- obstack_init (&el_obstack);
-
if (!no_lines_flag)
{
- obstack_fgrow2 (&el_obstack, muscle_find ("linef"),
+ obstack_fgrow2 (&muscle_obstack, muscle_find ("linef"),
location.first_line,
quotearg_style (c_quoting_style,
muscle_find ("filename")));
}
- obstack_sgrow (&el_obstack, epilogue);
- obstack_1grow (&el_obstack, 0);
- muscle_insert ("epilogue", obstack_finish (&el_obstack));
+ obstack_sgrow (&muscle_obstack, epilogue);
+ obstack_1grow (&muscle_obstack, 0);
+ muscle_insert ("epilogue", obstack_finish (&muscle_obstack));
}
gram_control_t gram_control;
lineno = 1;
- /* Initialize the muscle obstack. */
- obstack_init (&muscle_obstack);
-
/* Initialize the symbol table. */
symbols_new ();
undeftoken->number = ntokens++;
/* Initialize the obstacks. */
- obstack_init (&action_obstack);
- obstack_init (&output_obstack);
obstack_init (&pre_prologue_obstack);
obstack_init (&post_prologue_obstack);