-/* Muscle table manager for Bison,
+/* Muscle table manager for Bison.
+
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Boston, MA 02111-1307, USA. */
#include "system.h"
-#include "hash.h"
+
+#include <hash.h>
+#include <quotearg.h>
+
#include "files.h"
#include "muscle_tab.h"
#include "getargs.h"
+typedef struct
+{
+ const char *key;
+ char *value;
+} muscle_entry;
/* An obstack used to create some entries. */
struct obstack muscle_obstack;
static bool
hash_compare_muscles (void const *x, void const *y)
{
- const muscle_entry_t *m1 = x;
- const muscle_entry_t *m2 = y;
- return strcmp (m1->key, m2->key) ? FALSE : TRUE;
+ muscle_entry const *m1 = x;
+ muscle_entry const *m2 = y;
+ return strcmp (m1->key, m2->key) == 0;
}
static unsigned int
hash_muscle (const void *x, unsigned int tablesize)
{
- const muscle_entry_t *m = x;
+ muscle_entry const *m = x;
return hash_string (m->key, tablesize);
}
/* Version and input file. */
MUSCLE_INSERT_STRING ("version", VERSION);
- MUSCLE_INSERT_STRING ("filename", infile);
-
- /* FIXME: there should probably be no default here, only in the
- skeletons. */
-
- /* Types. */
- MUSCLE_INSERT_STRING ("ltype", "yyltype");
-
- /* Default #line formatting. */
- MUSCLE_INSERT_STRING ("linef", "#line %d %s\n");
-
- /* Stack parameters. */
- MUSCLE_INSERT_STRING ("maxdepth", "10000");
- MUSCLE_INSERT_STRING ("initdepth", "200");
-
- /* C++ macros. */
- MUSCLE_INSERT_STRING ("name", "Parser");
+ MUSCLE_INSERT_C_STRING ("filename", grammar_file);
}
void
muscle_insert (const char *key, char *value)
{
- muscle_entry_t probe;
- muscle_entry_t *entry = NULL;
+ muscle_entry probe;
+ muscle_entry *entry = NULL;
probe.key = key;
entry = hash_lookup (muscle_table, &probe);
if (!entry)
{
/* First insertion in the hash. */
- entry = XMALLOC (muscle_entry_t, 1);
+ MALLOC (entry, 1);
entry->key = key;
hash_insert (muscle_table, entry);
}
void
muscle_grow (const char *key, const char *val, const char *separator)
{
- muscle_entry_t probe;
- muscle_entry_t *entry = NULL;
+ muscle_entry probe;
+ muscle_entry *entry = NULL;
probe.key = key;
entry = hash_lookup (muscle_table, &probe);
if (!entry)
{
/* First insertion in the hash. */
- entry = XMALLOC (muscle_entry_t, 1);
+ MALLOC (entry, 1);
entry->key = key;
hash_insert (muscle_table, entry);
entry->value = xstrdup (val);
{
/* Grow the current value. */
char *new_val;
- fprintf (stderr, "<= %s + %s\n", entry->value, val);
obstack_sgrow (&muscle_obstack, entry->value);
free (entry->value);
obstack_sgrow (&muscle_obstack, separator);
obstack_1grow (&muscle_obstack, 0);
new_val = obstack_finish (&muscle_obstack);
entry->value = xstrdup (new_val);
- fprintf (stderr, "=> %s\n", new_val);
obstack_free (&muscle_obstack, new_val);
}
}
void muscle_pair_list_grow (const char *muscle,
const char *a1, const char *a2)
{
- char *value;
+ char *pair;
obstack_fgrow2 (&muscle_obstack, "[[[%s]], [[%s]]]", a1, a2);
obstack_1grow (&muscle_obstack, 0);
- value = obstack_finish (&muscle_obstack);
- muscle_grow (muscle, value, ",\n");
- obstack_free (&muscle_obstack, value);
+ pair = obstack_finish (&muscle_obstack);
+ muscle_grow (muscle, pair, ",\n");
+ obstack_free (&muscle_obstack, pair);
}
/*-------------------------------.
char*
muscle_find (const char *key)
{
- muscle_entry_t probe;
- muscle_entry_t *result = NULL;
+ muscle_entry probe;
+ muscle_entry *result = NULL;
probe.key = key;
result = hash_lookup (muscle_table, &probe);
| Output the definition of ENTRY as a m4_define. |
`------------------------------------------------*/
-static int
-muscle_m4_output (muscle_entry_t *entry, FILE *out)
+static inline bool
+muscle_m4_output (muscle_entry *entry, FILE *out)
{
fprintf (out, "m4_define([b4_%s],\n", entry->key);
fprintf (out, "[[%s]])\n\n\n", entry->value);
- return 1;
+ return true;
+}
+
+static bool
+muscle_m4_output_processor (void *entry, void *out)
+{
+ return muscle_m4_output (entry, out);
}
void
muscles_m4_output (FILE *out)
{
- hash_do_for_each (muscle_table,
- (Hash_processor) muscle_m4_output,
- out);
+ hash_do_for_each (muscle_table, muscle_m4_output_processor, out);
}