]> Savannah Git Hosting - m4.git/commitdiff

Savannah Git Hosting - m4.git/commitdiff

git git@sv / m4.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: e6db1ee)
Fix regression in define from 2008年02月22日.
Thu, 1 May 2008 12:53:47 +0000 (06:53 -0600)
Thu, 1 May 2008 12:53:47 +0000 (06:53 -0600)
* m4/m4module.h (m4_symbol_value_copy): Add parameter.
* m4/symtab.c (m4_symbol_value_copy): Support copying $@
back-references.
* m4/macro.c (expand_argument): Update callers.
* modules/m4.c (define, pushdef): Likewise.
* tests/builtins.at (define): Enhance test to catch this.

Signed-off-by: Eric Blake <ebb9@byu.net>

diff --git a/ChangeLog b/ChangeLog
index f53f91a0ffa69bfa0128fb70613e4bb504100308..79da06b88e0a6a08b0ae85528b6418b03980e26b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008年05月01日 Eric Blake <ebb9@byu.net>
+
+ Fix regression in define from 2008年02月22日.
+ * m4/m4module.h (m4_symbol_value_copy): Add parameter.
+ * m4/symtab.c (m4_symbol_value_copy): Support copying $@
+ back-references.
+ * m4/macro.c (expand_argument): Update callers.
+ * modules/m4.c (define, pushdef): Likewise.
+ * tests/builtins.at (define): Enhance test to catch this.
+
2008年04月21日 Eric Blake <ebb9@byu.net>
Simplify previous patch.
diff --git a/m4/m4module.h b/m4/m4module.h
index ced18d5f4dec289e66fa77d609dbc5cd29a831a7..5b5e01b22a59d45ac8a0b832573685971fd759bc 100644 (file)
--- a/m4/m4module.h
+++ b/m4/m4module.h
@@ -312,7 +312,7 @@ extern bool m4_symbol_value_flatten_args (m4_symbol_value *);
extern m4_symbol_value *m4_symbol_value_create (void);
extern void m4_symbol_value_delete (m4_symbol_value *);
-extern void m4_symbol_value_copy (m4_symbol_value *,
+extern void m4_symbol_value_copy (m4 *, m4_symbol_value *,
m4_symbol_value *);
extern bool m4_is_symbol_value_text (m4_symbol_value *);
extern bool m4_is_symbol_value_func (m4_symbol_value *);
diff --git a/m4/macro.c b/m4/macro.c
index 307244436d7b740cd2af62f89793416c73823691..bd0f88ba044e234db0f5263bc341f9f1bd4dc6b7 100644 (file)
--- a/m4/macro.c
+++ b/m4/macro.c
@@ -392,7 +392,7 @@ expand_argument (m4 *context, m4_obstack *obs, m4_symbol_value *argp,
case M4_TOKEN_MACDEF:
if (argp->type == M4_SYMBOL_VOID && obstack_object_size (obs) == 0)
- m4_symbol_value_copy (argp, &token);
+ m4_symbol_value_copy (context, argp, &token);
else
argp->type = M4_SYMBOL_TEXT;
break;
diff --git a/m4/symtab.c b/m4/symtab.c
index f4bb855400b5d0956d784195b837f4ba22753640..69f2200af8c3f365eb3947af75b292e65127765a 100644 (file)
--- a/m4/symtab.c
+++ b/m4/symtab.c
@@ -406,7 +406,7 @@ arg_destroy_CB (m4_hash *hash, const void *name, void *arg, void *ignored)
}
void
-m4_symbol_value_copy (m4_symbol_value *dest, m4_symbol_value *src)
+m4_symbol_value_copy (m4 *context, m4_symbol_value *dest, m4_symbol_value *src)
{
m4_symbol_value *next;
@@ -465,26 +465,35 @@ m4_symbol_value_copy (m4_symbol_value *dest, m4_symbol_value *src)
case M4_SYMBOL_COMP:
{
m4__symbol_chain *chain = src->u.u_c.chain;
- size_t len = 0;
+ size_t len;
char *str;
- char *p;
+ const m4_string_pair *quotes;
+ m4_obstack *obs = m4_arg_scratch (context);
while (chain)
{
- /* TODO for now, only text links are supported. */
- assert (chain->type == M4__CHAIN_STR);
- len += chain->u.u_s.len;
+ switch (chain->type)
+ {
+ case M4__CHAIN_STR:
+ obstack_grow (obs, chain->u.u_s.str, chain->u.u_s.len);
+ break;
+ case M4__CHAIN_ARGV:
+ quotes = m4__quote_cache (M4SYNTAX, NULL, chain->quote_age,
+ chain->u.u_a.quotes);
+ m4__arg_print (context, obs, chain->u.u_a.argv,
+ chain->u.u_a.index, quotes, true, NULL, NULL,
+ NULL, false, false);
+ break;
+ default:
+ assert (!"m4_symbol_value_copy");
+ abort ();
+ }
chain = chain->next;
}
- p = str = xcharalloc (len + 1);
- chain = src->u.u_c.chain;
- while (chain)
- {
- memcpy (p, chain->u.u_s.str, chain->u.u_s.len);
- p += chain->u.u_s.len;
- chain = chain->next;
- }
- *p = '0円';
- m4_set_symbol_value_text (dest, str, len, 0);
+ obstack_1grow (obs, '0円');
+ len = obstack_object_size (obs);
+ str = xcharalloc (len);
+ memcpy (str, obstack_finish (obs), len);
+ m4_set_symbol_value_text (dest, str, len - 1, 0);
}
break;
default:
diff --git a/modules/m4.c b/modules/m4.c
index f4013efa6600c900b8b8cbf8f29edae48dcb15fe..b8562ec23c82fdd7049b213436f4360782969479 100644 (file)
--- a/modules/m4.c
+++ b/modules/m4.c
@@ -157,7 +157,7 @@ M4BUILTIN_HANDLER (define)
{
m4_symbol_value *value = m4_symbol_value_create ();
- m4_symbol_value_copy (value, m4_arg_symbol (argv, 2));
+ m4_symbol_value_copy (context, value, m4_arg_symbol (argv, 2));
m4_symbol_define (M4SYMTAB, M4ARG (1), value);
}
else
@@ -179,7 +179,7 @@ M4BUILTIN_HANDLER (pushdef)
{
m4_symbol_value *value = m4_symbol_value_create ();
- m4_symbol_value_copy (value, m4_arg_symbol (argv, 2));
+ m4_symbol_value_copy (context, value, m4_arg_symbol (argv, 2));
m4_symbol_pushdef (M4SYMTAB, M4ARG (1), value);
}
else
diff --git a/tests/builtins.at b/tests/builtins.at
index c63246bbb73f02c1cae4a44e928b7b5e77658b16..b059e7b553d7d48be0033a23e47ae03aac195cc0 100644 (file)
--- a/tests/builtins.at
+++ b/tests/builtins.at
@@ -210,6 +210,16 @@ base value.
]], [[m4:define.m4:1: Warning: undefine: undefined macro `macro'
]])
+dnl check regression present 2008年02月22日 to 2008年04月30日.
+AT_DATA([in.m4], [[define(`qq', ``$*;$@'')dnl
+define(`foo', qq(`a', `b'))dnl
+foo
+defn(`foo')
+]])
+AT_CHECK_M4([in.m4], [0], [[a,b;a,b
+a,b;`a',`b'
+]])
+
AT_CLEANUP
GNU M4 source repository
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /