35 |
#include <assert.h> |
#include <assert.h> |
36 |
|
|
37 |
#include <m4module.h> |
#include <m4module.h> |
38 |
|
#include <modules/m4.h> |
39 |
|
|
40 |
#ifdef NDEBUG |
#ifdef NDEBUG |
41 |
/* Include this header for speed, which gives us direct access to |
/* Include this header for speed, which gives us direct access to |
50 |
#define m4_builtin_table m4_LTX_m4_builtin_table |
#define m4_builtin_table m4_LTX_m4_builtin_table |
51 |
|
|
52 |
/* Exit code from last "syscmd" command. */ |
/* Exit code from last "syscmd" command. */ |
53 |
int m4_sysval = 0; |
int m4_sysval = 0; |
54 |
|
|
55 |
void m4_sysval_flush (m4 *context); |
void m4_sysval_flush (m4 *context); |
56 |
|
void m4_dump_symbols (m4 *context, m4_dump_symbol_data *data, int argc, |
57 |
|
m4_symbol_value **argv, boolean complain); |
58 |
|
|
59 |
m4_export m4_export_table[] = { |
m4_export m4_export_table[] = { |
60 |
{ "m4_sysval", &m4_sysval }, |
{ "m4_sysval", &m4_sysval }, |
61 |
{ "m4_sysval_flush", &m4_sysval_flush }, |
{ "m4_sysval_flush", &m4_sysval_flush }, |
62 |
|
{ "m4_dump_symbols", &m4_dump_symbols }, |
63 |
|
|
64 |
{ NULL, NULL } |
{ NULL, NULL } |
65 |
}; |
}; |
112 |
typedef unsigned long int unumber; |
typedef unsigned long int unumber; |
113 |
#endif |
#endif |
114 |
|
|
|
|
|
115 |
static void include (m4 *context, int argc, m4_symbol_value **argv, |
static void include (m4 *context, int argc, m4_symbol_value **argv, |
116 |
boolean silent); |
boolean silent); |
117 |
|
static int dumpdef_cmp_CB (const void *s1, const void *s2); |
118 |
static void * set_trace_CB (m4_symbol_table *symtab, const char *ignored, |
static void * set_trace_CB (m4_symbol_table *symtab, const char *ignored, |
119 |
m4_symbol *symbol, void *userdata); |
m4_symbol *symbol, void *userdata); |
120 |
|
static void * dump_symbol_CB (m4_symbol_table *ignored, const char*name, |
121 |
|
m4_symbol *symbol, void *userdata); |
122 |
static const char *ntoa (number value, int radix); |
static const char *ntoa (number value, int radix); |
123 |
static void numb_obstack (m4_obstack *obs, const number value, |
static void numb_obstack (m4_obstack *obs, const number value, |
124 |
const int radix, int min); |
const int radix, int min); |
288 |
} |
} |
289 |
|
|
290 |
|
|
291 |
|
/* qsort comparison routine, for sorting the table made in m4_dumpdef (). */ |
292 |
|
static int |
293 |
|
dumpdef_cmp_CB (const void *s1, const void *s2) |
294 |
|
{ |
295 |
|
return strcmp (*(const char **) s1, *(const char **) s2); |
296 |
|
} |
297 |
|
|
298 |
|
/* The function m4_dump_symbols () is for use by "dumpdef". It builds up a |
299 |
|
table of all defined symbol names. */ |
300 |
|
static void * |
301 |
|
dump_symbol_CB (m4_symbol_table *ignored, const char *name, m4_symbol *symbol, |
302 |
|
void *userdata) |
303 |
|
{ |
304 |
|
assert (name); |
305 |
|
assert (symbol); |
306 |
|
|
307 |
|
if (!m4_is_symbol_value_void (m4_get_symbol_value (symbol))) |
308 |
|
{ |
309 |
|
m4_dump_symbol_data *symbol_data = (m4_dump_symbol_data *) userdata; |
310 |
|
|
311 |
|
obstack_blank (symbol_data->obs, sizeof (const char *)); |
312 |
|
symbol_data->base = (const char **) obstack_base (symbol_data->obs); |
313 |
|
symbol_data->base[symbol_data->size++] = (const char *) name; |
314 |
|
} |
315 |
|
|
316 |
|
return NULL; |
317 |
|
} |
318 |
|
|
319 |
|
/* If there are no arguments, build a sorted list of all defined |
320 |
|
symbols, otherwise, only the specified symbols. */ |
321 |
|
void |
322 |
|
m4_dump_symbols (m4 *context, m4_dump_symbol_data *data, int argc, |
323 |
|
m4_symbol_value **argv, boolean complain) |
324 |
|
{ |
325 |
|
data->base = (const char **) obstack_base (data->obs); |
326 |
|
data->size = 0; |
327 |
|
|
328 |
|
if (argc == 1) |
329 |
|
{ |
330 |
|
m4_symtab_apply (M4SYMTAB, dump_symbol_CB, data); |
331 |
|
} |
332 |
|
else |
333 |
|
{ |
334 |
|
int i; |
335 |
|
m4_symbol *symbol; |
336 |
|
|
337 |
|
for (i = 1; i < argc; i++) |
338 |
|
{ |
339 |
|
symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (i)); |
340 |
|
if (symbol != NULL |
341 |
|
&& !m4_is_symbol_value_void (m4_get_symbol_value (symbol))) |
342 |
|
{ |
343 |
|
dump_symbol_CB (NULL, M4ARG (i), symbol, data); |
344 |
|
} |
345 |
|
else if (complain) |
346 |
|
M4WARN ((m4_get_warning_status_opt (context), 0, |
347 |
|
_("Warning: %s: undefined name: %s"), |
348 |
|
M4ARG (0), M4ARG (i))); |
349 |
|
} |
350 |
|
} |
351 |
|
|
352 |
|
obstack_finish (data->obs); |
353 |
|
qsort ((void*) data->base, data->size, sizeof (const char*), dumpdef_cmp_CB); |
354 |
|
} |
355 |
|
|
356 |
|
|
357 |
/* Implementation of "dumpdef" itself. It builds up a table of pointers to |
/* Implementation of "dumpdef" itself. It builds up a table of pointers to |
358 |
symbols, sorts it and prints the sorted table. */ |
symbols, sorts it and prints the sorted table. */ |
359 |
M4BUILTIN_HANDLER (dumpdef) |
M4BUILTIN_HANDLER (dumpdef) |
360 |
{ |
{ |
361 |
struct m4_dump_symbol_data data; |
m4_dump_symbol_data data; |
362 |
const m4_builtin *bp; |
const m4_builtin *bp; |
363 |
|
|
364 |
data.obs = obs; |
data.obs = obs; |
389 |
} |
} |
390 |
else |
else |
391 |
{ |
{ |
392 |
assert (!"illegal token in m4_dumpdef"); |
assert (!"illegal token in builtin_dumpdef"); |
393 |
} |
} |
394 |
} |
} |
395 |
} |
} |