m4-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU M4 source repository branch, master, updated. cvs-readonly-104


From: Eric Blake
Subject: [SCM] GNU M4 source repository branch, master, updated. cvs-readonly-104-gc3e7dc1
Date: Thu, 01 May 2008 13:03:27 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU M4 source repository".

http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=c3e7dc183995ae374f6aedec21893b23196a5b39

The branch, master has been updated
       via  c3e7dc183995ae374f6aedec21893b23196a5b39 (commit)
      from  e6db1ee757abb49a7e739dc70a34dc8a14562e87 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit c3e7dc183995ae374f6aedec21893b23196a5b39
Author: Eric Blake <address@hidden>
Date:   Thu May 1 06:53:47 2008 -0600

    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.
    
    Signed-off-by: Eric Blake <address@hidden>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog         |   10 ++++++++++
 m4/m4module.h     |    2 +-
 m4/macro.c        |    2 +-
 m4/symtab.c       |   41 +++++++++++++++++++++++++----------------
 modules/m4.c      |    4 ++--
 tests/builtins.at |   10 ++++++++++
 6 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f53f91a..79da06b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-05-01  Eric Blake  <address@hidden>
+
+       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  <address@hidden>
 
        Simplify previous patch.
diff --git a/m4/m4module.h b/m4/m4module.h
index ced18d5..5b5e01b 100644
--- 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 3072444..bd0f88b 100644
--- 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 f4bb855..69f2200 100644
--- 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 f4013ef..b8562ec 100644
--- 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 c63246b..b059e7b 100644
--- 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
 
 


hooks/post-receive
--
GNU M4 source repository




reply via email to

[Prev in Thread] Current Thread [Next in Thread]