From: Akim Demaille Date: Fri, 22 Jun 2012 12:47:31 +0000 (+0200) Subject: code_props: factor more. X-Git-Tag: v2.7.90~424 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/6a0655d9cddec57a13a7fd813aa1dc81bdbcb38f code_props: factor more. * src/symtab.h, src/symtab.c (code_props_type_string): No longer static. * src/output.c (CODE_PROPS): Remove, we can now iterate on both the destructor and the printer. (SET_KEY2): New. --- diff --git a/src/output.c b/src/output.c index c967fa7a..e8cff20e 100644 --- a/src/output.c +++ b/src/output.c @@ -402,9 +402,16 @@ prepare_symbol_definitions (void) const char *key; const char *value; -#define SET_KEY(Entry) \ - obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry); \ - obstack_1grow (&format_obstack, 0); \ +#define SET_KEY(Entry) \ + obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", \ + i, Entry); \ + obstack_1grow (&format_obstack, 0); \ + key = obstack_finish (&format_obstack); + +#define SET_KEY2(Entry, Suffix) \ + obstack_fgrow3 (&format_obstack, "symbol(%d, %s_%s)", \ + i, Entry, Suffix); \ + obstack_1grow (&format_obstack, 0); \ key = obstack_finish (&format_obstack); // Whether the symbol has an identifier. @@ -436,28 +443,29 @@ prepare_symbol_definitions (void) SET_KEY("type"); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); -#define CODE_PROP(PropName) \ - do { \ - code_props const *p = symbol_code_props_get (sym, PropName); \ - SET_KEY("has_" #PropName); \ - MUSCLE_INSERT_INT (key, !!p->code); \ - \ - if (p->code) \ - { \ - SET_KEY(#PropName "_file"); \ - MUSCLE_INSERT_STRING (key, p->location.start.file); \ - \ - SET_KEY(#PropName "_line"); \ - MUSCLE_INSERT_INT (key, p->location.start.line); \ - \ - SET_KEY(#PropName); \ - MUSCLE_INSERT_STRING_RAW (key, p->code); \ - } \ - } while (0) - - CODE_PROP(destructor); - CODE_PROP(printer); -#undef CODE_PROP + { + int j; + for (j = 0; j < CODE_PROPS_SIZE; ++j) + { + char const *pname = code_props_type_string (j); + code_props const *p = symbol_code_props_get (sym, j); + SET_KEY2("has", pname); + MUSCLE_INSERT_INT (key, !!p->code); + + if (p->code) + { + SET_KEY2(pname, "file"); + MUSCLE_INSERT_STRING (key, p->location.start.file); + + SET_KEY2(pname, "line"); + MUSCLE_INSERT_INT (key, p->location.start.line); + + SET_KEY(pname); + MUSCLE_INSERT_STRING_RAW (key, p->code); + } + } + } +#undef SET_KEY2 #undef SET_KEY } } diff --git a/src/symtab.c b/src/symtab.c index b30ccaf1..14d107c9 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -100,11 +100,7 @@ symbol_new (uniqstr tag, location loc) return res; } -/*-------------------------------------------------------. -| Name of the code_props type: %destructor or %printer. | -`-------------------------------------------------------*/ - -static char const * +char const * code_props_type_string (code_props_type kind) { switch (kind) diff --git a/src/symtab.h b/src/symtab.h index 0ef4db29..70b4a817 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -154,7 +154,10 @@ void symbol_print (symbol *s, FILE *f); /** Is this a dummy nonterminal? */ bool symbol_is_dummy (const symbol *sym); -/** Return the name of the symbol that can be used as an identifier. +/** The name of the code_props type: "\%destructor" or "\%printer". */ +char const *code_props_type_string (code_props_type kind); + +/** The name of the symbol that can be used as an identifier. ** Consider the alias if needed. ** Return 0 if there is none (e.g., the symbol is only defined as ** a string). */