[Top][All Lists]
[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 (¯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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-readonly-23-g0710898,
Eric Blake <=