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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> ----------------------------------------------------------------------- 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 <[EMAIL PROTECTED]> + + 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 <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED] +syscmd(`rm -f foo??????')sysval [EMAIL PROTECTED] define(`file1', maketemp(`fooXXXXXX'))dnl ifelse(esyscmd(`echo foo??????'), `foo??????', `no file', `created') @result{}created @@ -5901,6 +5901,20 @@ sysval @result{}0 @end example [EMAIL PROTECTED] [EMAIL PROTECTED] Not worth documenting, but make sure we don't leave trailing NUL in [EMAIL PROTECTED] the expansion. + [EMAIL PROTECTED] +syscmd(`rm -f foo??????')sysval [EMAIL PROTECTED] +len(mkstemp(`fooXXXXX')) [EMAIL PROTECTED] +syscmd(`rm foo??????')sysval [EMAIL PROTECTED] [EMAIL PROTECTED] example [EMAIL PROTECTED] 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 (¯o_sequence_buf, defn, len, offset, len - offset, ¯o_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, ®s); + msg = compile_pattern (regexp, arg_len (argv, 2), &buf, ®s); 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, ®s); + msg = compile_pattern (regexp, arg_len (argv, 2), &buf, ®s); 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
