diff options
author | Eric Blake <ebb9@byu.net> | 2008-05-28 06:41:53 -0600 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2008-06-02 07:15:59 -0600 |
commit | a3aa897fc496179ff7bdd0fe6cd42a9e298e8473 (patch) | |
tree | 300a8eb9b374afc5f53eb643a29af3c62975064b /modules/gnu.c | |
parent | 3e33a6b3b9b2529939136c34b1e88bd3ee87a172 (diff) | |
download | m4-a3aa897fc496179ff7bdd0fe6cd42a9e298e8473.tar.gz |
Stage 24b: Allow embedded NUL in macro names.
* m4/m4module.h (m4_symtab_apply_func, m4_symbol_lookup)
(m4_symbol_pushdef, m4_symbol_define, m4_symbol_popdef)
(m4_symbol_rename, m4_symbol_delete): Add length parameter.
(m4_string): New type.
* ltdl/m4/gnulib-cache.m4: Import xmemdup0 module.
* m4/hash.c (m4_hash_string_hash, m4_hash_string_cmp): Account for
length.
* m4/symtab.c (m4_symtab_delete, m4_symtab_apply, symtab_fetch)
(m4__symtab_remove_module_references, symbol_destroy_CB)
(m4_symbol_lookup, m4_symbol_pushdef, m4_symbol_define)
(m4_symbol_popdef, m4_symbol_rename, m4_set_symbol_name_traced)
(m4_symbol_delete): Likewise.
* modules/m4.h (struct m4_dump_symbol_data): Adjust type to allow
passing length.
* m4/macro.c (expand_token): Adjust all callers.
* m4/module.c (install_builtin_table, install_macro_table):
Likewise.
* m4/utility.c (m4_symbol_value_lookup): Likewise.
* modules/gnu.c (indir, renamesyms, m4symbols): Likewise.
* modules/m4.c (define, undefine, pushdef, popdef)
(dumpdef_cmp_CB, dump_symbol_CB, m4_dump_symbols, dumpdef)
(traceon, traceoff): Likewise.
* src/main.c (main): Likewise.
* src/freeze.c (dump_symbol_CB, reload_frozen_state): Likewise.
* tests/freeze.at (reloading nul): Augment test.
* tests/null.out: Adjust expected output.
Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'modules/gnu.c')
-rw-r--r-- | modules/gnu.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/modules/gnu.c b/modules/gnu.c index 78c69b50..a13ae110 100644 --- a/modules/gnu.c +++ b/modules/gnu.c @@ -674,7 +674,8 @@ M4BUILTIN_HANDLER (indir) else { const char *name = M4ARG (1); - m4_symbol *symbol = m4_symbol_lookup (M4SYMTAB, name); + size_t len = M4ARGLEN (1); + m4_symbol *symbol = m4_symbol_lookup (M4SYMTAB, name, len); if (symbol == NULL) m4_warn (context, 0, me, _("undefined macro `%s'"), name); @@ -682,7 +683,7 @@ M4BUILTIN_HANDLER (indir) { m4_macro_args *new_argv; m4_symbol_value *value = m4_get_symbol_value (symbol); - new_argv = m4_make_argv_ref (context, argv, name, M4ARGLEN (1), + new_argv = m4_make_argv_ref (context, argv, name, len, m4_symbol_flatten_args (symbol), m4_get_symbol_traced (symbol)); m4_trace_prepare (context, m4_arg_info (new_argv), value); @@ -880,14 +881,14 @@ M4BUILTIN_HANDLER (renamesyms) for (; data.size > 0; --data.size, data.base++) { - const char *name = data.base[0]; + const m4_string *key = &data.base[0]; - if (regexp_substitute (context, data.obs, me, name, strlen (name), + if (regexp_substitute (context, data.obs, me, key->str, key->len, regexp, buf, replace, true)) { - obstack_1grow (data.obs, '\0'); - m4_symbol_rename (M4SYMTAB, name, - (char *) obstack_finish (data.obs)); + size_t newlen = obstack_object_size (data.obs); + m4_symbol_rename (M4SYMTAB, key->str, key->len, + (char *) obstack_finish (data.obs), newlen); } } } @@ -915,7 +916,8 @@ M4BUILTIN_HANDLER (m4symbols) for (; data.size > 0; --data.size, data.base++) { - m4_shipout_string (context, obs, data.base[0], SIZE_MAX, true); + m4_shipout_string (context, obs, data.base->str, data.base->len, + true); if (data.size > 1) obstack_1grow (obs, ','); } |