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 M4-patches@gnu.org https://lists.gnu.org/mailman/listinfo/m4-patches