]> git.saurik.com Git - bison.git/blobdiff - src/muscle_tab.c
* doc/bison.texinfo (Stack Overflow): xref to Recursion.
[bison.git] / src / muscle_tab.c
index 7d344a6a5695da36cfd32ab99ac67d5533bdc6d8..895e2e3e184f899f8b436f5996eac3633367da33 100644 (file)
 #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
 
@@ -44,18 +48,25 @@ hash_muscle (const void *x, unsigned int tablesize)
   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 ("stype", "int");
   muscle_insert ("ltype", "yyltype");
 
   /* Default #line formatting.  */
@@ -67,14 +78,33 @@ muscle_init (void)
 
   /* 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)
 {
   muscle_entry_t pair;
+  muscle_entry_t *entry = NULL;
+
   pair.key = key;
-  muscle_entry_t *entry = hash_lookup (muscle_table, &pair);
+  entry = hash_lookup (muscle_table, &pair);
 
   if (!entry)
     {
@@ -90,8 +120,10 @@ const char*
 muscle_find (const char *key)
 {
   muscle_entry_t pair;
+  muscle_entry_t *result = NULL;
+
   pair.key = key;
-  muscle_entry_t *result = hash_lookup (muscle_table, &pair);
+  result = hash_lookup (muscle_table, &pair);
   return result ? result->value : NULL;
 }