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 (&macro_sequence_buf, defn, len, offset,
-                                  len - offset, &macro_sequence_regs)) >= 0)
+      while ((offset = re_search (&macro_sequence_buf, defn, text_len, offset,
+                                  text_len - offset,
+                                  &macro_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

Reply via email to