41 |
/* Debug (-d[flags]). */ |
/* Debug (-d[flags]). */ |
42 |
int debug_level = 0; |
int debug_level = 0; |
43 |
|
|
|
/* Hash table size (should be a prime) (-Hsize). */ |
|
|
int hash_table_size = HASHMAX; |
|
|
|
|
44 |
/* Disable GNU extensions (-G). */ |
/* Disable GNU extensions (-G). */ |
45 |
int no_gnu_extensions = 0; |
int no_gnu_extensions = 0; |
46 |
|
|
81 |
m4_token_data_t |
m4_token_data_t |
82 |
m4_token_data_type (m4_token_data *name) |
m4_token_data_type (m4_token_data *name) |
83 |
{ |
{ |
84 |
return M4_TOKEN_DATA_TYPE(name); |
return M4_TOKEN_DATA_TYPE(name); |
85 |
} |
} |
86 |
|
|
87 |
char * |
char * |
88 |
m4_token_data_text (m4_token_data *name) |
m4_token_data_text (m4_token_data *name) |
89 |
{ |
{ |
90 |
return M4_TOKEN_DATA_TEXT(name); |
return M4_TOKEN_DATA_TEXT(name); |
91 |
} |
} |
92 |
|
|
93 |
m4_builtin_func * |
m4_builtin_func * |
94 |
m4_token_data_func (m4_token_data *name) |
m4_token_data_func (m4_token_data *name) |
95 |
{ |
{ |
96 |
return M4_TOKEN_DATA_FUNC(name); |
return M4_TOKEN_DATA_FUNC(name); |
97 |
} |
} |
98 |
|
|
99 |
boolean |
boolean |
100 |
m4_token_data_func_traced (m4_token_data *name) |
m4_token_data_func_traced (m4_token_data *name) |
101 |
{ |
{ |
102 |
return M4_TOKEN_DATA_FUNC_TRACED(name); |
return M4_TOKEN_DATA_FUNC_TRACED(name); |
103 |
} |
} |
104 |
|
|
|
|
|
105 |
|
|
106 |
|
|
107 |
/* Give friendly warnings if a builtin macro is passed an inappropriate |
/* Give friendly warnings if a builtin macro is passed an inappropriate |
108 |
number of arguments. NAME is macro name for messages, ARGC is actual |
number of arguments. NAME is macro name for messages, ARGC is actual |
109 |
number of arguments, MIN is the minimum number of acceptable arguments, |
number of arguments, MIN is the minimum number of acceptable arguments, |
222 |
static int |
static int |
223 |
dumpdef_cmp (const void *s1, const void *s2) |
dumpdef_cmp (const void *s1, const void *s2) |
224 |
{ |
{ |
225 |
return strcmp (M4_SYMBOL_NAME (* (m4_symbol *const *) s1), |
return strcmp (*(const char **) s1, *(const char **) s2); |
|
M4_SYMBOL_NAME (* (m4_symbol *const *) s2)); |
|
226 |
} |
} |
227 |
|
|
228 |
/* The function dump_symbol () is for use by "dumpdef". It builds up a |
/* The function dump_symbol () is for use by "dumpdef". It builds up a |
229 |
table of all defined, un-shadowed, symbols. */ |
table of all defined symbol names. */ |
230 |
void |
int |
231 |
m4_dump_symbol (m4_symbol *symbol, struct m4_dump_symbol_data *data) |
m4_dump_symbol (const char *name, m4_symbol *symbol, void *data) |
232 |
{ |
{ |
233 |
if (!M4_SYMBOL_SHADOWED (symbol) && M4_SYMBOL_TYPE (symbol) != M4_TOKEN_VOID) |
if (M4_SYMBOL_TYPE (symbol) != M4_TOKEN_VOID) |
234 |
{ |
{ |
235 |
obstack_blank (data->obs, sizeof (m4_symbol *)); |
struct m4_dump_symbol_data *symbol_data |
236 |
data->base = (m4_symbol **) obstack_base (data->obs); |
= (struct m4_dump_symbol_data *) data; |
237 |
data->base[data->size++] = symbol; |
|
238 |
|
obstack_blank (symbol_data->obs, sizeof (const char *)); |
239 |
|
symbol_data->base = (const char **) obstack_base (symbol_data->obs); |
240 |
|
symbol_data->base[symbol_data->size++] = name; |
241 |
} |
} |
242 |
|
|
243 |
|
return 0; |
244 |
} |
} |
245 |
|
|
246 |
/* If there are no arguments, build a sorted list of all defined, |
/* If there are no arguments, build a sorted list of all defined |
247 |
un-shadowed, symbols, otherwise, only the specified symbols. */ |
symbols, otherwise, only the specified symbols. */ |
248 |
void |
void |
249 |
m4_dump_symbols (struct m4_dump_symbol_data *data, int argc, |
m4_dump_symbols (struct m4_dump_symbol_data *data, int argc, |
250 |
m4_token_data **argv, boolean complain) |
m4_token_data **argv, boolean complain) |
251 |
{ |
{ |
252 |
data->base = (m4_symbol **) obstack_base (data->obs); |
data->base = (const char **) obstack_base (data->obs); |
253 |
data->size = 0; |
data->size = 0; |
254 |
|
|
255 |
if (argc == 1) |
if (argc == 1) |
256 |
{ |
{ |
257 |
m4_hack_all_symbols (m4_dump_symbol, (char *) data); |
m4_symtab_apply (m4_dump_symbol, data); |
258 |
} |
} |
259 |
else |
else |
260 |
{ |
{ |
265 |
{ |
{ |
266 |
symbol = m4_lookup_symbol (M4_TOKEN_DATA_TEXT (argv[i]), M4_SYMBOL_LOOKUP); |
symbol = m4_lookup_symbol (M4_TOKEN_DATA_TEXT (argv[i]), M4_SYMBOL_LOOKUP); |
267 |
if (symbol != NULL && M4_SYMBOL_TYPE (symbol) != M4_TOKEN_VOID) |
if (symbol != NULL && M4_SYMBOL_TYPE (symbol) != M4_TOKEN_VOID) |
268 |
m4_dump_symbol (symbol, data); |
m4_dump_symbol (M4_TOKEN_DATA_TEXT (argv[i]), symbol, data); |
269 |
else if (complain) |
else if (complain) |
270 |
M4ERROR ((warning_status, 0, |
M4ERROR ((warning_status, 0, |
271 |
_("Undefined name %s"), M4_TOKEN_DATA_TEXT (argv[i]))); |
_("Undefined name %s"), M4_TOKEN_DATA_TEXT (argv[i]))); |
273 |
} |
} |
274 |
|
|
275 |
obstack_finish (data->obs); |
obstack_finish (data->obs); |
276 |
qsort ((char *) data->base, data->size, sizeof (m4_symbol *), dumpdef_cmp); |
qsort ((void *) data->base, data->size, sizeof (const char *), dumpdef_cmp); |
277 |
} |
} |