summaryrefslogtreecommitdiff
path: root/modules/gnu.c
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2008-05-28 06:41:53 -0600
committerEric Blake <ebb9@byu.net>2008-06-02 07:15:59 -0600
commita3aa897fc496179ff7bdd0fe6cd42a9e298e8473 (patch)
tree300a8eb9b374afc5f53eb643a29af3c62975064b /modules/gnu.c
parent3e33a6b3b9b2529939136c34b1e88bd3ee87a172 (diff)
downloadm4-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.c18
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, ',');
}