145 |
obstack_1grow (obs, '\0'); |
obstack_1grow (obs, '\0'); |
146 |
return obstack_finish (obs); |
return obstack_finish (obs); |
147 |
} |
} |
|
|
|
|
/* qsort comparison routine, for sorting the table made in m4_dumpdef (). */ |
|
|
static int |
|
|
dumpdef_cmp (const void *s1, const void *s2) |
|
|
{ |
|
|
return strcmp (*(const char **) s1, *(const char **) s2); |
|
|
} |
|
|
|
|
|
/* The function dump_symbol () is for use by "dumpdef". It builds up a |
|
|
table of all defined symbol names. */ |
|
|
void * |
|
|
m4_dump_symbol_CB (m4_symbol_table *ignored, const char *name, m4_symbol *symbol, |
|
|
void *userdata) |
|
|
{ |
|
|
assert (name); |
|
|
assert (symbol); |
|
|
assert (symbol->value); |
|
|
|
|
|
if (symbol->value->type != M4_SYMBOL_VOID) |
|
|
{ |
|
|
struct m4_dump_symbol_data *symbol_data |
|
|
= (struct m4_dump_symbol_data *) userdata; |
|
|
|
|
|
obstack_blank (symbol_data->obs, sizeof (const char *)); |
|
|
symbol_data->base = (const char **) obstack_base (symbol_data->obs); |
|
|
symbol_data->base[symbol_data->size++] = (const char *) name; |
|
|
} |
|
|
|
|
|
return NULL; |
|
|
} |
|
|
|
|
|
/* If there are no arguments, build a sorted list of all defined |
|
|
symbols, otherwise, only the specified symbols. */ |
|
|
void |
|
|
m4_dump_symbols (m4 *context, struct m4_dump_symbol_data *data, int argc, |
|
|
m4_symbol_value **argv, boolean complain) |
|
|
{ |
|
|
data->base = (const char **) obstack_base (data->obs); |
|
|
data->size = 0; |
|
|
|
|
|
if (argc == 1) |
|
|
{ |
|
|
m4_symtab_apply (M4SYMTAB, m4_dump_symbol_CB, data); |
|
|
} |
|
|
else |
|
|
{ |
|
|
int i; |
|
|
m4_symbol *symbol; |
|
|
|
|
|
for (i = 1; i < argc; i++) |
|
|
{ |
|
|
symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (i)); |
|
|
if (symbol != NULL && symbol->value->type != M4_SYMBOL_VOID) |
|
|
m4_dump_symbol_CB (NULL, M4ARG (i), symbol, data); |
|
|
else if (complain) |
|
|
M4WARN ((m4_get_warning_status_opt (context), 0, |
|
|
_("Warning: %s: undefined name: %s"), |
|
|
M4ARG (0), M4ARG (i))); |
|
|
} |
|
|
} |
|
|
|
|
|
obstack_finish (data->obs); |
|
|
qsort ((void *) data->base, data->size, sizeof (const char *), dumpdef_cmp); |
|
|
} |
|