In many cases, the length of a macro name was previously learned; no
need to repeat the effort on a strlen.
* src/m4.h (struct symbol): Add len member.
(SYMBOL_NAME_LEN): New macro.
(lookup_symbol, define_user_macro): Update prototypes.
* src/symtab (lookup_symbol): Update signature to take length.
(symtab_debug, symtab_print_list): Adjust callers.
* src/builtin.c (define_user_macro): Update signature to take lengths.
(define_builtin, builtin_init, define_macro, m4_undefine, m4_popdef)
(m4_ifdef, m4_dumpdef, m4_indir, m4_defn, set_trace, m4_traceon)
(m4_traceoff): Adjust callers.
* src/freeze.c (reload_frozen_state): Likewise.
* src/m4.c (main): Likewise.
* src/macro.c (expand_token, collect_arguments): Likewise.
---
src/builtin.c | 57 ++++++++++++++++++++++++++++-----------------------
src/freeze.c | 3 ++-
src/m4.c | 9 +++++---
src/m4.h | 7 +++++--
src/macro.c | 5 +++--
src/symtab.c | 22 ++++++++++++++------
6 files changed, 63 insertions(+), 40 deletions(-)
diff --git a/src/builtin.c b/src/builtin.c
index 69eb2a8c..907efc9d 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -214,7 +214,7 @@ define_builtin (const char *name, const builtin *bp,
symbol_lookup mode)
{
symbol *sym;
- sym = lookup_symbol (name, mode);
+ sym = lookup_symbol (name, strlen (name), mode);
SYMBOL_TYPE (sym) = TOKEN_FUNC;
SYMBOL_MACRO_ARGS (sym) = bp->groks_macro_args;
SYMBOL_BLIND_NO_ARGS (sym) = bp->blind_if_no_args;
@@ -287,35 +287,36 @@ free_macro_sequence (void)
`-----------------------------------------------------------------*/
void
-define_user_macro (const char *name, const char *text, symbol_lookup mode)
+define_user_macro (const char *name, int name_len, const char *text,
+ size_t text_len, symbol_lookup mode)
{
symbol *s;
char *defn = xstrdup (text ? text : "");
- size_t len = strlen (defn);
- if (len > INT_MAX)
+ if (text_len > INT_MAX)
{
M4ERROR ((warning_status, 0,
_("macro `%s' definition too long; truncating to INT_MAX
bytes"),
name));
- len = INT_MAX;
+ text_len = INT_MAX;
}
- s = lookup_symbol (name, mode);
+ s = lookup_symbol (name, name_len, mode);
if (SYMBOL_TYPE (s) == TOKEN_TEXT)
free (SYMBOL_TEXT (s));
SYMBOL_TYPE (s) = TOKEN_TEXT;
SYMBOL_TEXT (s) = defn;
- SYMBOL_TEXT_LEN (s) = len;
+ SYMBOL_TEXT_LEN (s) = text_len;
/* Implement --warn-macro-sequence. */
if (macro_sequence_inuse && text)
{
regoff_t offset = 0;
- while ((offset = re_search (¯o_sequence_buf, defn, len, offset,
- len - offset, ¯o_sequence_regs)) >= 0)
+ while ((offset = re_search (¯o_sequence_buf, defn, text_len, offset,
+ text_len - offset,
+ ¯o_sequence_regs)) >= 0)
{
/* Skip empty matches. */
if (macro_sequence_regs.start[0] == macro_sequence_regs.end[0])
@@ -367,12 +368,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,
+ strlen (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,
+ strlen (pp->func), SYMBOL_INSERT);
}
}
@@ -565,14 +568,14 @@ define_macro (int argc, token_data **argv, symbol_lookup
mode)
if (argc == 2)
{
- define_user_macro (ARG (1), "", mode);
+ define_user_macro (ARG (1), ARGLEN (1), "", 0, mode);
return;
}
switch (TOKEN_DATA_TYPE (argv[2]))
{
case TOKEN_TEXT:
- define_user_macro (ARG (1), ARG (2), mode);
+ define_user_macro (ARG (1), ARGLEN (1), ARG (2), ARGLEN (2), mode);
break;
case TOKEN_FUNC:
@@ -604,7 +607,7 @@ m4_undefine (struct obstack *obs MAYBE_UNUSED, int argc,
token_data **argv)
if (bad_argc (argv[0], argc, 2, -1))
return;
for (i = 1; i < argc; i++)
- lookup_symbol (ARG (i), SYMBOL_DELETE);
+ lookup_symbol (ARG (i), ARGLEN (i), SYMBOL_DELETE);
}
static void
@@ -620,7 +623,7 @@ m4_popdef (struct obstack *obs MAYBE_UNUSED, int argc,
token_data **argv)
if (bad_argc (argv[0], argc, 2, -1))
return;
for (i = 1; i < argc; i++)
- lookup_symbol (ARG (i), SYMBOL_POPDEF);
+ lookup_symbol (ARG (i), ARGLEN (i), SYMBOL_POPDEF);
}
/*---------------------.
@@ -635,7 +638,7 @@ m4_ifdef (struct obstack *obs, int argc, token_data **argv)
if (bad_argc (argv[0], argc, 3, 4))
return;
- s = lookup_symbol (ARG (1), SYMBOL_LOOKUP);
+ s = lookup_symbol (ARG (1), ARGLEN (1), SYMBOL_LOOKUP);
if (s != NULL && SYMBOL_TYPE (s) != TOKEN_VOID)
result = 2;
@@ -752,7 +755,8 @@ m4_dumpdef (struct obstack *obs, int argc, token_data
**argv)
{
for (i = 1; i < argc; i++)
{
- s = lookup_symbol (TOKEN_DATA_TEXT (argv[i]), SYMBOL_LOOKUP);
+ s = lookup_symbol (TOKEN_DATA_TEXT (argv[i]),
+ TOKEN_DATA_LEN (argv[i]), SYMBOL_LOOKUP);
if (s != NULL && SYMBOL_TYPE (s) != TOKEN_VOID)
dump_symbol (s, &data);
else
@@ -867,7 +871,7 @@ m4_indir (struct obstack *obs, int argc, token_data **argv)
}
name = ARG (1);
- s = lookup_symbol (name, SYMBOL_LOOKUP);
+ s = lookup_symbol (name, ARGLEN (1), SYMBOL_LOOKUP);
if (s == NULL || SYMBOL_TYPE (s) == TOKEN_VOID)
M4ERROR ((warning_status, 0,
_("undefined macro `%s'"), name));
@@ -897,16 +901,16 @@ m4_defn (struct obstack *obs, int argc, token_data **argv)
{
symbol *s;
builtin_func *b;
- unsigned int i;
+ int i;
if (bad_argc (argv[0], argc, 2, -1))
return;
assert (0 < argc);
- for (i = 1; i < (unsigned) argc; i++)
+ for (i = 1; i < argc; i++)
{
- const char *arg = ARG((int) i);
- s = lookup_symbol (arg, SYMBOL_LOOKUP);
+ const char *arg = ARG(i);
+ s = lookup_symbol (arg, ARGLEN (i), SYMBOL_LOOKUP);
if (s == NULL)
continue;
@@ -1620,7 +1624,7 @@ set_trace (symbol *sym, void *data)
SYMBOL_TRACED (sym) = data != NULL;
/* Remove placeholder from table if macro is undefined and untraced. */
if (SYMBOL_TYPE (sym) == TOKEN_VOID && data == NULL)
- lookup_symbol (SYMBOL_NAME (sym), SYMBOL_POPDEF);
+ lookup_symbol (SYMBOL_NAME (sym), SYMBOL_NAME_LEN (sym), SYMBOL_POPDEF);
}
static void
@@ -1634,9 +1638,9 @@ m4_traceon (struct obstack *obs, int argc, token_data
**argv)
else
for (i = 1; i < argc; i++)
{
- s = lookup_symbol (ARG (i), SYMBOL_LOOKUP);
+ s = lookup_symbol (ARG (i), ARGLEN (i), SYMBOL_LOOKUP);
if (!s)
- s = lookup_symbol (ARG (i), SYMBOL_INSERT);
+ s = lookup_symbol (ARG (i), ARGLEN (i), SYMBOL_INSERT);
set_trace (s, obs);
}
}
@@ -1656,7 +1660,8 @@ m4_traceoff (struct obstack *obs MAYBE_UNUSED, int argc,
token_data **argv)
else
for (i = 1; i < argc; i++)
{
- s = lookup_symbol (TOKEN_DATA_TEXT (argv[i]), SYMBOL_LOOKUP);
+ s = lookup_symbol (TOKEN_DATA_TEXT (argv[i]), TOKEN_DATA_LEN (argv[i]),
+ SYMBOL_LOOKUP);
if (s != NULL)
set_trace (s, NULL);
}
diff --git a/src/freeze.c b/src/freeze.c
index d0b5cecd..bf7f24be 100644
--- a/src/freeze.c
+++ b/src/freeze.c
@@ -357,7 +357,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], strlen (string[0]), string[1],
+ strlen (string[1]), SYMBOL_PUSHDEF);
break;
case 'Q':
diff --git a/src/m4.c b/src/m4.c
index db66d8df..0439c6e2 100644
--- a/src/m4.c
+++ b/src/m4.c
@@ -665,17 +665,20 @@ main (int argc, char *const *argv)
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,
+ macro_value ? strlen (macro_value) : 0,
+ SYMBOL_INSERT);
free (macro_name);
}
break;
case 'U':
- lookup_symbol (defines->arg, SYMBOL_DELETE);
+ lookup_symbol (defines->arg, strlen (defines->arg), SYMBOL_DELETE);
break;
case 't':
- sym = lookup_symbol (defines->arg, SYMBOL_INSERT);
+ sym = lookup_symbol (defines->arg, strlen (defines->arg),
+ SYMBOL_INSERT);
SYMBOL_TRACED (sym) = true;
break;
diff --git a/src/m4.h b/src/m4.h
index b84f4262..6c2791cd 100644
--- a/src/m4.h
+++ b/src/m4.h
@@ -375,6 +375,7 @@ struct symbol
size_t hash;
char *name;
+ int namelen;
token_data data;
};
@@ -385,6 +386,7 @@ struct symbol
#define SYMBOL_DELETED(S) ((S)->deleted)
#define SYMBOL_PENDING_EXPANSIONS(S) ((S)->pending_expansions)
#define SYMBOL_NAME(S) ((S)->name)
+#define SYMBOL_NAME_LEN(S) ((S)->namelen)
#define SYMBOL_TYPE(S) (TOKEN_DATA_TYPE (&(S)->data))
#define SYMBOL_TEXT(S) (TOKEN_DATA_TEXT (&(S)->data))
#define SYMBOL_TEXT_LEN(S) (TOKEN_DATA_LEN (&(S)->data))
@@ -398,7 +400,7 @@ typedef void hack_symbol (symbol *, void *);
extern void free_symbol (symbol *sym);
extern void symtab_init (void);
-extern symbol *lookup_symbol (const char *, symbol_lookup);
+extern symbol *lookup_symbol (const char *, int, symbol_lookup);
extern void hack_all_symbols (hack_symbol *, void *);
/* File: macro.c --- macro expansion. */
@@ -440,7 +442,8 @@ extern void builtin_init (void);
extern void define_builtin (const char *, const builtin *, symbol_lookup);
extern void set_macro_sequence (const char *);
extern void free_macro_sequence (void);
-extern void define_user_macro (const char *, const char *, symbol_lookup);
+extern void define_user_macro (const char *, int, const char *, size_t,
+ symbol_lookup);
extern void undivert_all (void);
extern void expand_user_macro (struct obstack *, symbol *, int, token_data **);
extern void m4_placeholder (struct obstack *, int, token_data **)
diff --git a/src/macro.c b/src/macro.c
index 76e469e2..5932510b 100644
--- a/src/macro.c
+++ b/src/macro.c
@@ -100,7 +100,8 @@ expand_token (struct obstack *obs, token_type t, token_data
*td, int line)
break;
case TOKEN_WORD:
- sym = lookup_symbol (TOKEN_DATA_TEXT (td), SYMBOL_LOOKUP);
+ sym = lookup_symbol (TOKEN_DATA_TEXT (td), TOKEN_DATA_LEN (td),
+ SYMBOL_LOOKUP);
if (sym == NULL || SYMBOL_TYPE (sym) == TOKEN_VOID
|| (SYMBOL_TYPE (sym) == TOKEN_FUNC
&& SYMBOL_BLIND_NO_ARGS (sym)
@@ -238,7 +239,7 @@ collect_arguments (symbol *sym, struct obstack *argptr,
TOKEN_DATA_TYPE (&td) = TOKEN_TEXT;
TOKEN_DATA_TEXT (&td) = SYMBOL_NAME (sym);
- TOKEN_DATA_LEN (&td) = strlen (SYMBOL_NAME (sym));
+ TOKEN_DATA_LEN (&td) = SYMBOL_NAME_LEN (sym);
tdp = (token_data *) obstack_copy (arguments, &td, sizeof td);
obstack_ptr_grow (argptr, tdp);
diff --git a/src/symtab.c b/src/symtab.c
index ec3ba2a3..e18fc97d 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -172,7 +172,7 @@ free_symbol (symbol *sym)
`-------------------------------------------------------------------*/
symbol *
-lookup_symbol (const char *name, symbol_lookup mode)
+lookup_symbol (const char *name, int len, symbol_lookup mode)
{
size_t h;
int cmp = 1;
@@ -227,6 +227,7 @@ lookup_symbol (const char *name, symbol_lookup mode)
SYMBOL_TRACED (sym) = SYMBOL_TRACED (old);
sym->hash = h;
SYMBOL_NAME (sym) = SYMBOL_NAME (old);
+ SYMBOL_NAME_LEN (sym) = SYMBOL_NAME_LEN (old);
SYMBOL_MACRO_ARGS (sym) = false;
SYMBOL_BLIND_NO_ARGS (sym) = false;
SYMBOL_DELETED (sym) = false;
@@ -267,9 +268,13 @@ lookup_symbol (const char *name, symbol_lookup mode)
SYMBOL_STACK (sym)->next = NULL;
SYMBOL_TRACED (sym) = SYMBOL_TRACED (SYMBOL_STACK (sym));
SYMBOL_NAME (sym) = SYMBOL_NAME (SYMBOL_STACK (sym));
+ SYMBOL_NAME_LEN (sym) = SYMBOL_NAME_LEN (SYMBOL_STACK (sym));
}
else
- SYMBOL_NAME (sym) = xstrdup (name);
+ {
+ SYMBOL_NAME (sym) = xstrdup (name);
+ SYMBOL_NAME_LEN (sym) = len;
+ }
return sym;
case SYMBOL_DELETE:
@@ -315,6 +320,7 @@ lookup_symbol (const char *name, symbol_lookup mode)
SYMBOL_TRACED (sym) = true;
sym->hash = h;
SYMBOL_NAME (sym) = xstrdup (name);
+ SYMBOL_NAME_LEN (sym) = len;
SYMBOL_MACRO_ARGS (sym) = false;
SYMBOL_BLIND_NO_ARGS (sym) = false;
SYMBOL_DELETED (sym) = false;
@@ -378,24 +384,27 @@ symtab_debug (void)
symbol *s;
int delete;
static int i;
+ int len;
while (next_token (&td, NULL) == TOKEN_WORD)
{
text = TOKEN_DATA_TEXT (&td);
+ len = TOKEN_DATA_LEN (&td);
if (*text == '_')
{
delete = 1;
text++;
+ len--;
}
else
delete = 0;
- s = lookup_symbol (text, SYMBOL_LOOKUP);
+ s = lookup_symbol (text, len, SYMBOL_LOOKUP);
if (s == NULL)
xprintf ("Name `%s' is unknown\n", text);
- lookup_symbol (text, delete ? SYMBOL_DELETE : SYMBOL_INSERT);
+ lookup_symbol (text, len, delete ? SYMBOL_DELETE : SYMBOL_INSERT);
}
symtab_print_list (i++);
}
@@ -411,9 +420,10 @@ symtab_print_list (int i)
for (h = 0; h < hash_table_size; h++)
for (bucket = symtab[h]; bucket != NULL; bucket = bucket->next)
for (sym = bucket; sym; sym = sym->stack)
- xprintf ("\tname %s, hash %lu, bucket %lu, addr %p, stack %p, "
+ xprintf ("\tname %s, len %i, hash %lu, bucket %lu, addr %p, stack %p, "
"next %p, flags%s%s, pending %d\n",
- SYMBOL_NAME (sym), (unsigned long int) sym->hash,
+ SYMBOL_NAME (sym), SYMBOL_NAME_LEN (sym),
+ (unsigned long int) sym->hash,
(unsigned long int) h, sym, SYMBOL_STACK (sym),
sym->next,
SYMBOL_TRACED (sym) ? " traced" : "",
--
2.48.1
_______________________________________________
M4-patches mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/m4-patches