X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/be2a1a68efe93f7046f77b81346e4c740c14fb40..d1a1114f7f257f89887ea5825ba0d896dfaa747b:/src/muscle_tab.c diff --git a/src/muscle_tab.c b/src/muscle_tab.c index 30eb442c..895e2e3e 100644 --- a/src/muscle_tab.c +++ b/src/muscle_tab.c @@ -24,6 +24,10 @@ #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,13 +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 = { key, NULL }; - muscle_entry_t *entry = hash_lookup (muscle_table, &pair); + muscle_entry_t pair; + muscle_entry_t *entry = NULL; + + pair.key = key; + entry = hash_lookup (muscle_table, &pair); if (!entry) { @@ -88,8 +119,11 @@ muscle_insert (const char *key, const char *value) const char* muscle_find (const char *key) { - muscle_entry_t pair = { key, NULL }; - muscle_entry_t *result = hash_lookup (muscle_table, &pair); + muscle_entry_t pair; + muscle_entry_t *result = NULL; + + pair.key = key; + result = hash_lookup (muscle_table, &pair); return result ? result->value : NULL; } @@ -97,11 +131,12 @@ muscle_find (const char *key) /* Output the definition of all the current muscles into a list of m4_defines. */ -static void +static int muscle_m4_output (muscle_entry_t *entry, FILE *out) { fprintf (out, "m4_define([b4_%s],\n", entry->key); fprintf (out, " [[%s]])\n\n\n", entry->value); + return 1; }