m4-commit
[Top][All Lists]
Advanced

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

[SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-r


From: Eric Blake
Subject: [SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-readonly-23-g0710898
Date: Thu, 29 Nov 2007 14:07:35 +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=07108982f9559379e136462c08509777ddeaaec0

The branch, branch-1_4 has been updated
       via  07108982f9559379e136462c08509777ddeaaec0 (commit)
      from  fd71421c2cda7ba7c7e3653f12977840ec720525 (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 07108982f9559379e136462c08509777ddeaaec0
Author: Eric Blake <address@hidden>
Date:   Fri Oct 19 10:13:06 2007 -0600

    Stage 3: cache length, rather than computing it
    
    * src/input.c (next_token): Grab length from obstack rather than
    calling strlen.
    * src/m4.h (token_data, macro_arguments): Add length field.
    (TOKEN_DATA_LEN): New accessor.
    (define_user_macro): Add parameter.
    * src/builtin.c (define_user_macro, mkstemp_helper): Use
    pre-computed length.
    (builtin_init, define_macro, m4_maketemp, m4_mkstemp): Adjust
    callers.
    (dump_args, m4_ifdef, m4_ifelse, m4_builtin, m4_indir, m4_eval)
    (m4_len, m4_substr, m4_translit, m4_regexp, m4_patsubst)
    (expand_user_macro): Use cached lengths.
    * src/freeze.c (reload_frozen_state): Adjust callers.
    * src/m4.c (main): Likewise.
    * src/macro.c (expand_token, expand_argument, collect_arguments)
    (arg_len): Use cached length.
    * doc/m4.texinfo (Mkstemp): Ensure mkstemp does not produce NUL.
    
    (cherry picked from commit cd50e094b5f49104f66ff807c0a01d2f20c61c7f)
    
    Signed-off-by: Eric Blake <address@hidden>

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

Summary of changes:
 ChangeLog      |   21 +++++++++++
 doc/m4.texinfo |   18 ++++++++-
 src/builtin.c  |  105 ++++++++++++++++++++++++++++++++++---------------------
 src/freeze.c   |    3 +-
 src/input.c    |   37 +++++++++++--------
 src/m4.c       |    3 +-
 src/m4.h       |    8 ++++-
 src/macro.c    |   18 +++++-----
 8 files changed, 143 insertions(+), 70 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3301ac0..7cd6fc8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2007-11-29  Eric Blake  <address@hidden>
+
+       Stage 3: cache length, rather than computing it.
+       * src/input.c (next_token): Grab length from obstack rather than
+       calling strlen.
+       * src/m4.h (token_data, macro_arguments): Add length field.
+       (TOKEN_DATA_LEN): New accessor.
+       (define_user_macro): Add parameter.
+       * src/builtin.c (define_user_macro, mkstemp_helper): Use
+       pre-computed length.
+       (builtin_init, define_macro, m4_maketemp, m4_mkstemp): Adjust
+       callers.
+       (dump_args, m4_ifdef, m4_ifelse, m4_builtin, m4_indir, m4_eval)
+       (m4_len, m4_substr, m4_translit, m4_regexp, m4_patsubst)
+       (expand_user_macro): Use cached lengths.
+       * src/freeze.c (reload_frozen_state): Adjust callers.
+       * src/m4.c (main): Likewise.
+       * src/macro.c (expand_token, expand_argument, collect_arguments)
+       (arg_len): Use cached length.
+       * doc/m4.texinfo (Mkstemp): Ensure mkstemp does not produce NUL.
+
 2007-11-27  Eric Blake  <address@hidden>
 
        Stage 2: use accessors, not direct reference, into argv.
diff --git a/doc/m4.texinfo b/doc/m4.texinfo
index 3cc3539..3da16fc 100644
--- a/doc/m4.texinfo
+++ b/doc/m4.texinfo
@@ -5880,8 +5880,8 @@ recommend that you use the new @code{mkstemp} macro, 
introduced in
 
 @example
 $ @kbd{m4}
-syscmd(`echo foo??????')dnl
address@hidden
+syscmd(`rm -f foo??????')sysval
address@hidden
 define(`file1', maketemp(`fooXXXXXX'))dnl
 ifelse(esyscmd(`echo foo??????'), `foo??????', `no file', `created')
 @result{}created
@@ -5901,6 +5901,20 @@ sysval
 @result{}0
 @end example
 
address@hidden
address@hidden Not worth documenting, but make sure we don't leave trailing NUL 
in
address@hidden the expansion.
+
address@hidden
+syscmd(`rm -f foo??????')sysval
address@hidden
+len(mkstemp(`fooXXXXX'))
address@hidden
+syscmd(`rm foo??????')sysval
address@hidden
address@hidden example
address@hidden ignore
+
 @node Miscellaneous
 @chapter Miscellaneous builtin macros
 
diff --git a/src/builtin.c b/src/builtin.c
index fbfc2fe..e719cdd 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -407,7 +407,8 @@ free_regex (void)
 `-------------------------------------------------------------------------*/
 
 void
-define_user_macro (const char *name, const char *text, symbol_lookup mode)
+define_user_macro (const char *name, size_t len, const char *text,
+                  symbol_lookup mode)
 {
   symbol *s;
   char *defn = xstrdup (text ? text : "");
@@ -423,7 +424,6 @@ define_user_macro (const char *name, const char *text, 
symbol_lookup mode)
   if (macro_sequence_inuse && text)
     {
       regoff_t offset = 0;
-      size_t len = strlen (defn);
 
       while ((offset = re_search (&macro_sequence_buf, defn, len, offset,
                                  len - offset, &macro_sequence_regs)) >= 0)
@@ -479,12 +479,14 @@ builtin_init (void)
     if (no_gnu_extensions)
       {
        if (pp->unix_name != NULL)
-         define_user_macro (pp->unix_name, pp->func, SYMBOL_INSERT);
+         define_user_macro (pp->unix_name, strlen (pp->unix_name),
+                            pp->func, SYMBOL_INSERT);
       }
     else
       {
        if (pp->gnu_name != NULL)
-         define_user_macro (pp->gnu_name, pp->func, SYMBOL_INSERT);
+         define_user_macro (pp->gnu_name, strlen (pp->gnu_name),
+                            pp->func, SYMBOL_INSERT);
       }
 }
 
@@ -621,7 +623,7 @@ dump_args (struct obstack *obs, int start, macro_arguments 
*argv,
        dump_sep = true;
       if (quoted)
        obstack_grow (obs, lquote.string, lquote.length);
-      obstack_grow (obs, ARG (i), strlen (ARG (i)));
+      obstack_grow (obs, ARG (i), arg_len (argv, i));
       if (quoted)
        obstack_grow (obs, rquote.string, rquote.length);
     }
@@ -665,14 +667,14 @@ define_macro (int argc, macro_arguments *argv, 
symbol_lookup mode)
 
   if (argc == 2)
     {
-      define_user_macro (ARG (1), "", mode);
+      define_user_macro (ARG (1), arg_len (argv, 1), "", mode);
       return;
     }
 
   switch (arg_type (argv, 2))
     {
     case TOKEN_TEXT:
-      define_user_macro (ARG (1), ARG (2), mode);
+      define_user_macro (ARG (1), arg_len (argv, 1), ARG (2), mode);
       break;
 
     case TOKEN_FUNC:
@@ -730,20 +732,27 @@ m4_ifdef (struct obstack *obs, int argc, macro_arguments 
*argv)
 {
   symbol *s;
   const char *result;
+  size_t len = 0;
 
   if (bad_argc (ARG (0), argc, 2, 3))
     return;
   s = lookup_symbol (ARG (1), SYMBOL_LOOKUP);
 
   if (s != NULL && SYMBOL_TYPE (s) != TOKEN_VOID)
-    result = ARG (2);
+    {
+      result = ARG (2);
+      len = arg_len (argv, 2);
+    }
   else if (argc >= 4)
-    result = ARG (3);
+    {
+      result = ARG (3);
+      len = arg_len (argv, 3);
+    }
   else
     result = NULL;
 
   if (result != NULL)
-    obstack_grow (obs, result, strlen (result));
+    obstack_grow (obs, result, len);
 }
 
 static void
@@ -752,6 +761,7 @@ m4_ifelse (struct obstack *obs, int argc, macro_arguments 
*argv)
   const char *result;
   const char *me;
   int index;
+  size_t len = 0;
 
   if (argc == 2)
     return;
@@ -769,8 +779,12 @@ m4_ifelse (struct obstack *obs, int argc, macro_arguments 
*argv)
   result = NULL;
   while (result == NULL)
 
-    if (strcmp (ARG (index), ARG (index + 1)) == 0)
-      result = ARG (index + 2);
+    if (arg_len (argv, index) == arg_len (argv, index + 1)
+       && strcmp (ARG (index), ARG (index + 1)) == 0)
+      {
+       result = ARG (index + 2);
+       len = arg_len (argv, index + 2);
+      }
 
     else
       switch (argc)
@@ -781,6 +795,7 @@ m4_ifelse (struct obstack *obs, int argc, macro_arguments 
*argv)
        case 4:
        case 5:
          result = ARG (index + 3);
+         len = arg_len (argv, index + 3);
          break;
 
        default:
@@ -788,7 +803,7 @@ m4_ifelse (struct obstack *obs, int argc, macro_arguments 
*argv)
          index += 3;
        }
 
-  obstack_grow (obs, result, strlen (result));
+  obstack_grow (obs, result, len);
 }
 
 /*---------------------------------------------------------------------.
@@ -939,6 +954,7 @@ m4_builtin (struct obstack *obs, int argc, macro_arguments 
*argv)
       new_argv->argc = argc - 1;
       new_argv->inuse = false;
       new_argv->argv0 = name;
+      new_argv->argv0_len = arg_len (argv, 1);
       new_argv->arraylen = argc - 2;
       memcpy (&new_argv->array[0], &argv->array[1],
              (argc - 2) * sizeof (token_data *));
@@ -992,6 +1008,7 @@ m4_indir (struct obstack *obs, int argc, macro_arguments 
*argv)
       new_argv->argc = argc - 1;
       new_argv->inuse = false;
       new_argv->argv0 = name;
+      new_argv->argv0_len = arg_len (argv, 1);
       new_argv->arraylen = argc - 2;
       memcpy (&new_argv->array[0], &argv->array[1],
              (argc - 2) * sizeof (token_data *));
@@ -1169,6 +1186,7 @@ m4_eval (struct obstack *obs, int argc, macro_arguments 
*argv)
   int radix = 10;
   int min = 1;
   const char *s;
+  size_t len;
 
   if (bad_argc (me, argc, 1, 3))
     return;
@@ -1176,7 +1194,7 @@ m4_eval (struct obstack *obs, int argc, macro_arguments 
*argv)
   if (*ARG (2) && !numeric_arg (me, ARG (2), &radix))
     return;
 
-  if (radix < 1 || radix > (int) strlen (digits))
+  if (radix < 1 || radix > 36)
     {
       m4_warn (0, me, _("radix %d out of range"), radix);
       return;
@@ -1218,10 +1236,11 @@ m4_eval (struct obstack *obs, int argc, macro_arguments 
*argv)
       obstack_1grow (obs, '-');
       s++;
     }
-  for (min -= strlen (s); --min >= 0;)
+  len = strlen (s);
+  for (min -= len; --min >= 0;)
     obstack_1grow (obs, '0');
 
-  obstack_grow (obs, s, strlen (s));
+  obstack_grow (obs, s, len);
 }
 
 static void
@@ -1466,18 +1485,18 @@ m4_sinclude (struct obstack *obs, int argc, 
macro_arguments *argv)
 | Use the first argument as a template for a temporary file name.  |
 `-----------------------------------------------------------------*/
 
-/* Add trailing 'X' to NAME if necessary, securely create the file,
-   and place the new file name on OBS.  Report errors on behalf of ME.  */
+/* Add trailing 'X' to NAME of length LEN as necessary, then securely
+   create the file, and place the new file name on OBS.  Report errors
+   on behalf of ME.  */
 static void
-mkstemp_helper (struct obstack *obs, const char *me, const char *name)
+mkstemp_helper (struct obstack *obs, const char *me, const char *name,
+               size_t len)
 {
   int fd;
-  int len;
   int i;
 
   /* Guarantee that there are six trailing 'X' characters, even if the
      user forgot to supply them.  */
-  len = strlen (name);
   obstack_grow (obs, name, len);
   for (i = 0; len > 0 && i < 6; i++)
     if (name[--len] != 'X')
@@ -1494,7 +1513,13 @@ mkstemp_helper (struct obstack *obs, const char *me, 
const char *name)
       obstack_free (obs, obstack_finish (obs));
     }
   else
-    close (fd);
+    {
+      close (fd);
+      /* Undo trailing NUL.  */
+      /* FIXME - should we be quoting this name, on the tiny chance
+        that the random name generated matches a user's macro?  */
+      obstack_blank (obs, -1);
+    }
 }
 
 static void
@@ -1518,9 +1543,9 @@ m4_maketemp (struct obstack *obs, int argc, 
macro_arguments *argv)
           maketemp(XXXXXXXX) -> `X00nnnnn', where nnnnn is 16-bit pid
       */
       const char *str = ARG (1);
-      int len = strlen (str);
-      int i;
-      int len2;
+      size_t len = arg_len (argv, 1);
+      size_t i;
+      size_t len2;
 
       m4_warn (0, me, _("recommend using mkstemp instead"));
       for (i = len; i > 1; i--)
@@ -1535,11 +1560,11 @@ m4_maketemp (struct obstack *obs, int argc, 
macro_arguments *argv)
        {
          while (i++ < len - len2)
            obstack_1grow (obs, '0');
-         obstack_grow0 (obs, str, len2);
+         obstack_grow (obs, str, len2);
        }
     }
   else
-    mkstemp_helper (obs, me, ARG (1));
+    mkstemp_helper (obs, me, ARG (1), arg_len (argv, 1));
 }
 
 static void
@@ -1549,7 +1574,7 @@ m4_mkstemp (struct obstack *obs, int argc, 
macro_arguments *argv)
 
   if (bad_argc (me, argc, 1, 1))
     return;
-  mkstemp_helper (obs, me, ARG (1));
+  mkstemp_helper (obs, me, ARG (1), arg_len (argv, 1));
 }
 
 /*----------------------------------------.
@@ -1641,7 +1666,7 @@ m4_m4wrap (struct obstack *obs, int argc, macro_arguments 
*argv)
   if (bad_argc (ARG (0), argc, 1, -1))
     return;
   if (no_gnu_extensions)
-    obstack_grow (obs, ARG (1), strlen (ARG (1)));
+    obstack_grow (obs, ARG (1), arg_len (argv, 1));
   else
     dump_args (obs, 1, argv, " ", false);
   obstack_1grow (obs, '\0');
@@ -1788,7 +1813,7 @@ m4_len (struct obstack *obs, int argc, macro_arguments 
*argv)
 {
   if (bad_argc (ARG (0), argc, 1, 1))
     return;
-  shipout_int (obs, strlen (ARG (1)));
+  shipout_int (obs, arg_len (argv, 1));
 }
 
 /*-------------------------------------------------------------------------.
@@ -1848,11 +1873,11 @@ m4_substr (struct obstack *obs, int argc, 
macro_arguments *argv)
     {
       /* builtin(`substr') is blank, but substr(`abc') is abc.  */
       if (argc == 2)
-       obstack_grow (obs, ARG (1), strlen (ARG (1)));
+       obstack_grow (obs, ARG (1), arg_len (argv, 1));
       return;
     }
 
-  length = avail = strlen (ARG (1));
+  length = avail = arg_len (argv, 1);
   if (!numeric_arg (me, ARG (2), &start))
     return;
 
@@ -1934,7 +1959,7 @@ m4_translit (struct obstack *obs, int argc, 
macro_arguments *argv)
     {
       /* builtin(`translit') is blank, but translit(`abc') is abc.  */
       if (argc == 2)
-       obstack_grow (obs, ARG (1), strlen (ARG (1)));
+       obstack_grow (obs, ARG (1), arg_len (argv, 1));
       return;
     }
 
@@ -2124,14 +2149,14 @@ m4_regexp (struct obstack *obs, int argc, 
macro_arguments *argv)
              argc == 3 ? "" : "{", repl, argc == 3 ? "" : "}");
 #endif /* DEBUG_REGEX */
 
-  msg = compile_pattern (regexp, strlen (regexp), &buf, &regs);
+  msg = compile_pattern (regexp, arg_len (argv, 2), &buf, &regs);
   if (msg != NULL)
     {
       m4_warn (0, me, _("bad regular expression: `%s': %s"), regexp, msg);
       return;
     }
 
-  length = strlen (victim);
+  length = arg_len (argv, 1);
   /* Avoid overhead of allocating regs if we won't use it.  */
   startpos = re_search (buf, victim, length, 0, length,
                        argc == 3 ? NULL : regs);
@@ -2171,7 +2196,7 @@ m4_patsubst (struct obstack *obs, int argc, 
macro_arguments *argv)
     {
       /* builtin(`patsubst') is blank, but patsubst(`abc') is abc.  */
       if (argc == 2)
-       obstack_grow (obs, ARG (1), strlen (ARG (1)));
+       obstack_grow (obs, ARG (1), arg_len (argv, 1));
       return;
     }
 
@@ -2183,7 +2208,7 @@ m4_patsubst (struct obstack *obs, int argc, 
macro_arguments *argv)
      replacement, we need not waste time with it.  */
   if (!*regexp && !*repl)
     {
-      obstack_grow (obs, victim, strlen (victim));
+      obstack_grow (obs, victim, arg_len (argv, 1));
       return;
     }
 
@@ -2192,14 +2217,14 @@ m4_patsubst (struct obstack *obs, int argc, 
macro_arguments *argv)
     xfprintf (trace_file, "p:{%s}:{%s}\n", regexp, repl);
 #endif /* DEBUG_REGEX */
 
-  msg = compile_pattern (regexp, strlen (regexp), &buf, &regs);
+  msg = compile_pattern (regexp, arg_len (argv, 2), &buf, &regs);
   if (msg != NULL)
     {
       m4_warn (0, me, _("bad regular expression `%s': %s"), regexp, msg);
       return;
     }
 
-  length = strlen (victim);
+  length = arg_len (argv, 1);
 
   offset = 0;
   matchpos = 0;
@@ -2302,7 +2327,7 @@ expand_user_macro (struct obstack *obs, symbol *sym,
                i = i * 10 + (*text - '0');
            }
          if (i < argc)
-           obstack_grow (obs, ARG (i), strlen (ARG (i)));
+           obstack_grow (obs, ARG (i), arg_len (argv, i));
          break;
 
        case '#':               /* number of arguments */
diff --git a/src/freeze.c b/src/freeze.c
index 16a4ed2..52a69d1 100644
--- a/src/freeze.c
+++ b/src/freeze.c
@@ -349,7 +349,8 @@ reload_frozen_state (const char *name)
 
              /* Enter a macro having an expansion text as a definition.  */
 
-             define_user_macro (string[0], string[1], SYMBOL_PUSHDEF);
+             define_user_macro (string[0], number[0], string[1],
+                                SYMBOL_PUSHDEF);
              break;
 
            case 'Q':
diff --git a/src/input.c b/src/input.c
index 3d96ec7..0aa6036 100644
--- a/src/input.c
+++ b/src/input.c
@@ -59,8 +59,8 @@
    accordingly.  */
 
 #ifdef ENABLE_CHANGEWORD
-#include "regex.h"
-#endif
+# include "regex.h"
+#endif /* ENABLE_CHANGEWORD */
 
 enum input_type
 {
@@ -164,7 +164,7 @@ static bool pop_input (bool);
 
 #ifdef DEBUG_INPUT
 static const char *token_type_string (token_type);
-#endif
+#endif /* DEBUG_INPUT */
 
 
 /*-------------------------------------------------------------------.
@@ -688,7 +688,7 @@ input_init (void)
 
 #ifdef ENABLE_CHANGEWORD
   set_word_regexp (NULL, user_word_regexp);
-#endif
+#endif /* ENABLE_CHANGEWORD */
 }
 
 
@@ -827,7 +827,7 @@ next_token (token_data *td, int *line, const char *caller)
 #ifdef ENABLE_CHANGEWORD
   int startpos;
   char *orig_text = NULL;
-#endif
+#endif /* ENABLE_CHANGEWORD */
   const char *file;
   int dummy;
 
@@ -841,7 +841,7 @@ next_token (token_data *td, int *line, const char *caller)
     {
 #ifdef DEBUG_INPUT
       xfprintf (stderr, "next_token -> EOF\n");
-#endif
+#endif /* DEBUG_INPUT */
       next_char ();
       return TOKEN_EOF;
     }
@@ -852,7 +852,7 @@ next_token (token_data *td, int *line, const char *caller)
 #ifdef DEBUG_INPUT
       xfprintf (stderr, "next_token -> MACDEF (%s)\n",
                find_builtin_by_addr (TOKEN_DATA_FUNC (td))->name);
-#endif
+#endif /* DEBUG_INPUT */
       return TOKEN_MACDEF;
     }
 
@@ -973,19 +973,24 @@ next_token (token_data *td, int *line, const char *caller)
       type = TOKEN_STRING;
     }
 
-  obstack_1grow (&token_stack, '\0');
-
   TOKEN_DATA_TYPE (td) = TOKEN_TEXT;
+  TOKEN_DATA_LEN (td) = obstack_object_size (&token_stack);
+  obstack_1grow (&token_stack, '\0');
   TOKEN_DATA_TEXT (td) = (char *) obstack_finish (&token_stack);
 #ifdef ENABLE_CHANGEWORD
   if (orig_text == NULL)
-    orig_text = TOKEN_DATA_TEXT (td);
-  TOKEN_DATA_ORIG_TEXT (td) = orig_text;
-#endif
+    TOKEN_DATA_ORIG_TEXT (td) = TOKEN_DATA_TEXT (td);
+  else
+    {
+      TOKEN_DATA_ORIG_TEXT (td) = orig_text;
+      TOKEN_DATA_LEN (td) = strlen (orig_text);
+    }
+#endif /* ENABLE_CHANGEWORD */
 #ifdef DEBUG_INPUT
-  xfprintf (stderr, "next_token -> %s (%s)\n",
-           token_type_string (type), TOKEN_DATA_TEXT (td));
-#endif
+  xfprintf (stderr, "next_token -> %s (%s), len %zu\n",
+           token_type_string (type), TOKEN_DATA_TEXT (td),
+           TOKEN_DATA_LEN (td));
+#endif /* DEBUG_INPUT */
   return type;
 }
 
@@ -1115,4 +1120,4 @@ lex_debug (void)
   while ((t = next_token (&td, NULL, "<debug>")) != TOKEN_EOF)
     print_token ("lex", t, &td);
 }
-#endif
+#endif /* DEBUG_INPUT */
diff --git a/src/m4.c b/src/m4.c
index 217d389..0c7f33f 100644
--- a/src/m4.c
+++ b/src/m4.c
@@ -626,7 +626,8 @@ main (int argc, char *const *argv, char *const *envp)
            char *macro_value = strchr (macro_name, '=');
            if (macro_value)
              *macro_value++ = '\0';
-           define_user_macro (macro_name, macro_value, SYMBOL_INSERT);
+           define_user_macro (macro_name, strlen (macro_name),
+                              macro_value, SYMBOL_INSERT);
            free (macro_name);
          }
          break;
diff --git a/src/m4.h b/src/m4.h
index 522bda2..3a6acc3 100644
--- a/src/m4.h
+++ b/src/m4.h
@@ -284,6 +284,10 @@ struct token_data
     {
       struct
        {
+         /* We don't support NUL in text, yet.  So len is just a
+            cache for now.  But it will be essential if we ever DO
+            support NUL.  */
+         size_t len;
          char *text;
 #ifdef ENABLE_CHANGEWORD
          char *original_text;
@@ -313,6 +317,7 @@ struct macro_arguments
      until next byte read from file.  */
   bool inuse;
   const char *argv0; /* The macro name being expanded.  */
+  size_t argv0_len; /* Length of argv0.  */
   size_t arraylen; /* True length of allocated elements in array.  */
   /* Used as a variable-length array, storing information about each
      argument.  */
@@ -320,6 +325,7 @@ struct macro_arguments
 };
 
 #define TOKEN_DATA_TYPE(Td)            ((Td)->type)
+#define TOKEN_DATA_LEN(Td)             ((Td)->u.u_t.len)
 #define TOKEN_DATA_TEXT(Td)            ((Td)->u.u_t.text)
 #ifdef ENABLE_CHANGEWORD
 # define TOKEN_DATA_ORIG_TEXT(Td)      ((Td)->u.u_t.original_text)
@@ -472,7 +478,7 @@ void builtin_init (void);
 void define_builtin (const char *, const builtin *, symbol_lookup);
 void set_macro_sequence (const char *);
 void free_regex (void);
-void define_user_macro (const char *, const char *, symbol_lookup);
+void define_user_macro (const char *, size_t, const char *, symbol_lookup);
 void undivert_all (void);
 void expand_user_macro (struct obstack *, symbol *, int, macro_arguments *);
 void m4_placeholder (struct obstack *, int, macro_arguments *);
diff --git a/src/macro.c b/src/macro.c
index 9997ce1..320727d 100644
--- a/src/macro.c
+++ b/src/macro.c
@@ -95,8 +95,7 @@ expand_token (struct obstack *obs, token_type t, token_data 
*td, int line)
     case TOKEN_CLOSE:
     case TOKEN_SIMPLE:
     case TOKEN_STRING:
-      shipout_text (obs, TOKEN_DATA_TEXT (td), strlen (TOKEN_DATA_TEXT (td)),
-                   line);
+      shipout_text (obs, TOKEN_DATA_TEXT (td), TOKEN_DATA_LEN (td), line);
       break;
 
     case TOKEN_WORD:
@@ -108,11 +107,10 @@ expand_token (struct obstack *obs, token_type t, 
token_data *td, int line)
        {
 #ifdef ENABLE_CHANGEWORD
          shipout_text (obs, TOKEN_DATA_ORIG_TEXT (td),
-                       strlen (TOKEN_DATA_ORIG_TEXT (td)), line);
+                       TOKEN_DATA_LEN (td), line);
 #else
-         shipout_text (obs, TOKEN_DATA_TEXT (td),
-                       strlen (TOKEN_DATA_TEXT (td)), line);
-#endif
+         shipout_text (obs, TOKEN_DATA_TEXT (td), TOKEN_DATA_LEN (td), line);
+#endif /* !ENABLE_CHANGEWORD */
        }
       else
        expand_macro (sym);
@@ -183,6 +181,7 @@ expand_argument (struct obstack *obs, token_data *argp, 
const char *caller)
                    return t == TOKEN_COMMA;
                  warn_builtin_concat (caller, TOKEN_DATA_FUNC (argp));
                }
+             TOKEN_DATA_LEN (argp) = obstack_object_size (obs);
              obstack_1grow (obs, '\0');
              TOKEN_DATA_TYPE (argp) = TOKEN_TEXT;
              TOKEN_DATA_TEXT (argp) = (char *) obstack_finish (obs);
@@ -255,6 +254,7 @@ collect_arguments (symbol *sym, struct obstack *argptr, 
unsigned int argv_base,
   args.argc = 1;
   args.inuse = false;
   args.argv0 = SYMBOL_NAME (sym);
+  args.argv0_len = strlen (args.argv0);
   args.arraylen = 0;
   obstack_grow (argptr, &args, offsetof (macro_arguments, array));
 
@@ -269,6 +269,7 @@ collect_arguments (symbol *sym, struct obstack *argptr, 
unsigned int argv_base,
            {
              TOKEN_DATA_TYPE (&td) = TOKEN_TEXT;
              TOKEN_DATA_TEXT (&td) = (char *) "";
+             TOKEN_DATA_LEN (&td) = 0;
            }
          tdp = (token_data *) obstack_copy (arguments, &td, sizeof td);
          obstack_ptr_grow (argptr, tdp);
@@ -448,14 +449,13 @@ arg_text (macro_arguments *argv, unsigned int index)
 size_t
 arg_len (macro_arguments *argv, unsigned int index)
 {
-  /* TODO - update macro_arguments to cache this.  */
   if (index == 0)
-    return strlen (argv->argv0);
+    return argv->argv0_len;
   if (index >= argv->argc)
     return 0;
   if (TOKEN_DATA_TYPE (argv->array[index - 1]) != TOKEN_TEXT)
     return SIZE_MAX;
-  return strlen (TOKEN_DATA_TEXT (argv->array[index - 1]));
+  return TOKEN_DATA_LEN (argv->array[index - 1]);
 }
 
 /* Given ARGV, return the builtin function referenced by argument


hooks/post-receive
--
GNU M4 source repository




reply via email to

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