90 |
|
|
91 |
|
|
92 |
/* Generate prototypes for each builtin handler function. */ |
/* Generate prototypes for each builtin handler function. */ |
93 |
#define BUILTIN(handler, macros, blind, min, max) M4BUILTIN(handler) |
#define BUILTIN(handler, macros, blind, min, max) M4BUILTIN(handler) |
94 |
builtin_functions |
builtin_functions |
95 |
#undef BUILTIN |
#undef BUILTIN |
96 |
|
|
452 |
/* Implementation of "symbols". It builds up a table of pointers to |
/* Implementation of "symbols". It builds up a table of pointers to |
453 |
symbols, sorts it and ships out the symbol names. */ |
symbols, sorts it and ships out the symbol names. */ |
454 |
|
|
|
/* TODO: Import this through the m4_export list of m4 module. */ |
|
|
extern void m4_dump_symbols (m4 *context, m4_dump_symbol_data *data, int argc, |
|
|
m4_symbol_value **argv, boolean complain); |
|
|
|
|
455 |
/** |
/** |
456 |
* symbols([...]) |
* symbols([...]) |
457 |
**/ |
**/ |
458 |
M4BUILTIN_HANDLER (symbols) |
M4BUILTIN_HANDLER (symbols) |
459 |
{ |
{ |
460 |
m4_dump_symbol_data data; |
M4_MODULE_IMPORT (m4, m4_dump_symbols); |
|
m4_obstack data_obs; |
|
|
|
|
|
obstack_init (&data_obs); |
|
|
data.obs = &data_obs; |
|
|
m4_dump_symbols (context, &data, argc, argv, FALSE); |
|
461 |
|
|
462 |
for (; data.size > 0; --data.size, data.base++) |
if (m4_dump_symbols) |
463 |
{ |
{ |
464 |
m4_shipout_string (context, obs, data.base[0], 0, TRUE); |
m4_dump_symbol_data data; |
465 |
if (data.size > 1) |
m4_obstack data_obs; |
466 |
obstack_1grow (obs, ','); |
|
467 |
|
obstack_init (&data_obs); |
468 |
|
data.obs = &data_obs; |
469 |
|
m4_dump_symbols (context, &data, argc, argv, FALSE); |
470 |
|
|
471 |
|
for (; data.size > 0; --data.size, data.base++) |
472 |
|
{ |
473 |
|
m4_shipout_string (context, obs, data.base[0], 0, TRUE); |
474 |
|
if (data.size > 1) |
475 |
|
obstack_1grow (obs, ','); |
476 |
|
} |
477 |
|
obstack_free (&data_obs, NULL); |
478 |
} |
} |
|
obstack_free (&data_obs, NULL); |
|
479 |
} |
} |
480 |
|
|
481 |
|
|
507 |
* esyscmd(SHELL-COMMAND) |
* esyscmd(SHELL-COMMAND) |
508 |
**/ |
**/ |
509 |
|
|
|
/* TODO: Import these through the m4_export list of m4 module. */ |
|
|
extern int m4_sysval; |
|
|
extern void m4_sysval_flush (m4 *); |
|
|
|
|
510 |
M4BUILTIN_HANDLER (esyscmd) |
M4BUILTIN_HANDLER (esyscmd) |
511 |
{ |
{ |
512 |
FILE *pin; |
M4_MODULE_IMPORT (m4, m4_set_sysval); |
513 |
int ch; |
M4_MODULE_IMPORT (m4, m4_sysval_flush); |
514 |
|
|
515 |
m4_sysval_flush (context); |
if (m4_set_sysval && m4_sysval_flush) |
|
pin = popen (M4ARG (1), "r"); |
|
|
if (pin == NULL) |
|
|
{ |
|
|
M4ERROR ((m4_get_warning_status_opt (context), errno, |
|
|
_("Cannot open pipe to command `%s'"), M4ARG (1))); |
|
|
m4_sysval = 0xff << 8; |
|
|
} |
|
|
else |
|
516 |
{ |
{ |
517 |
while ((ch = getc (pin)) != EOF) |
FILE *pin; |
518 |
obstack_1grow (obs, (char) ch); |
int ch; |
519 |
m4_sysval = pclose (pin); |
|
520 |
|
m4_sysval_flush (context); |
521 |
|
pin = popen (M4ARG (1), "r"); |
522 |
|
if (pin == NULL) |
523 |
|
{ |
524 |
|
M4ERROR ((m4_get_warning_status_opt (context), errno, |
525 |
|
_("Cannot open pipe to command `%s'"), M4ARG (1))); |
526 |
|
m4_set_sysval (0xff << 8); |
527 |
|
} |
528 |
|
else |
529 |
|
{ |
530 |
|
while ((ch = getc (pin)) != EOF) |
531 |
|
obstack_1grow (obs, (char) ch); |
532 |
|
m4_set_sysval (pclose (pin)); |
533 |
|
} |
534 |
} |
} |
535 |
} |
} |
536 |
|
|