m4-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

32-fyi-m4-lookup-split.patch


From: Akim Demaille
Subject: 32-fyi-m4-lookup-split.patch
Date: Wed, 05 Sep 2001 09:16:10 +0200

Somewhat harder than expected, as the MODE is used in many different
places.

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * m4/symtab.c (m4_symbol_popdef, m4_symbol_delete): Rename as...
        (m4_symbol_pop, m4_symbol_del): this.
        (m4_symbol_lookup, m4_symbol_pushdef, m4_symbol_insert)
        (m4_symbol_popdef, m4_symbol_delete): New.
        (m4_lookup_symbol): Adjust.
        * m4/m4module.h, src/main.c, modules/gnu.c, modules/m4.c: Adjust.

Index: src/main.c
--- src/main.c Mon, 03 Sep 2001 16:48:00 +0200 akim
+++ src/main.c Tue, 04 Sep 2001 10:38:13 +0200 akim
@@ -439,7 +439,7 @@ Debugging:\n\
          break;

        case 't':
-         symbol = m4_lookup_symbol (defines->macro, M4_SYMBOL_INSERT);
+         symbol = m4_symbol_insert (defines->macro);
          M4_SYMBOL_TRACED (symbol) = TRUE;
          break;

Index: m4/m4module.h
--- m4/m4module.h Tue, 04 Sep 2001 10:18:28 +0200 akim
+++ m4/m4module.h Tue, 04 Sep 2001 10:25:06 +0200 akim
@@ -104,8 +104,12 @@

 extern m4_hash *m4_symtab;

-extern void    m4_symtab_init          (void);
-extern m4_symbol *m4_lookup_symbol     (const char *, m4_symbol_lookup_t);
+extern void      m4_symtab_init                (void);
+extern m4_symbol *m4_symbol_lookup     (const char *);
+extern m4_symbol *m4_symbol_pushdef    (const char *);
+extern m4_symbol *m4_symbol_insert     (const char *);
+extern void       m4_symbol_popdef     (const char *);
+extern void       m4_symbol_delete     (const char *);
 extern int     m4_symtab_apply (m4_symtab_apply_func *, void *);
 extern void    m4_remove_table_reference_symbols (lt_dlhandle);

Index: m4/symtab.c
--- m4/symtab.c Tue, 04 Sep 2001 10:18:28 +0200 akim
+++ m4/symtab.c Tue, 04 Sep 2001 10:43:44 +0200 akim
@@ -35,8 +35,8 @@
 static size_t  m4_symtab_hash          (const void *key);
 static int     m4_symtab_cmp           (const void *key, const void *try);
 static void    m4_token_data_delete    (m4_token_data *data);
-static void    m4_symbol_popdef        (m4_symbol *symbol);
-static void    m4_symbol_delete        (m4_symbol *symbol);
+static void    m4_symbol_pop           (m4_symbol *symbol);
+static void    m4_symbol_del           (m4_symbol *symbol);


 /* Pointer to symbol table.  */
@@ -89,14 +89,14 @@
 }

 void
-m4_symbol_popdef (m4_symbol *symbol)
+m4_symbol_pop (m4_symbol *symbol)
 {
   m4_token_data *stale;

   assert (symbol);
   assert (M4_SYMBOL_DATA_NEXT (symbol));

-  stale                        = M4_SYMBOL_DATA (symbol);
+  stale                                = M4_SYMBOL_DATA (symbol);
   M4_SYMBOL_DATA (symbol)      = M4_TOKEN_DATA_NEXT (stale);

 #ifndef NDEBUG
@@ -107,12 +107,12 @@

 /* Free all storage associated with a symbol.  */
 void
-m4_symbol_delete (m4_symbol *symbol)
+m4_symbol_del (m4_symbol *symbol)
 {
   assert (symbol);

   while (M4_SYMBOL_DATA_NEXT (symbol))
-    m4_symbol_popdef (symbol);
+    m4_symbol_pop (symbol);

   assert (M4_SYMBOL_DATA_NEXT (symbol) == 0);

@@ -123,97 +123,140 @@
   XFREE (symbol);
 }

-/* Search in, and manipulation of the symbol table, are all done by
-   m4_lookup_symbol ().  It basically hashes NAME to a list in the symbol
-   table, and searched this list for the first occurence of a symbol with
-   the name.
-
-   The MODE parameter determines what m4_lookup_symbol () will do.  It can
-   either just do a lookup, do a lookup and insert if not present, do an
-   insertion even if the name is already in the list, delete the first
-   occurrence of the name on the list or delete all occurences of the name
-   on the list.  */
+
+/* Dispatch on all the following 5 functions.
+
+   Search in, and manipulation of the symbol table, are all done by
+   m4_lookup_symbol ().  It basically hashes NAME to a list in the
+   symbol table, and searched this list for the first occurence of a
+   symbol with the name.
+
+   The MODE parameter determines what m4_lookup_symbol () will do.  It
+   can either just do a lookup, do a lookup and insert if not present,
+   do an insertion even if the name is already in the list, delete the
+   first occurrence of the name on the list or delete all occurences
+   of the name on the list.  */
 m4_symbol *
 m4_lookup_symbol (const char *name, m4_symbol_lookup_t mode)
 {
-  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
-
   switch (mode)
     {
     case M4_SYMBOL_LOOKUP:
-      /* If just searching, return status of search.  */
-      return psymbol ? *psymbol : 0;
+      return m4_symbol_lookup (name);

     case M4_SYMBOL_INSERT:
-      /* Return the symbol, if the name was found in the table.
-        Otherwise, just insert the name, and return the new symbol.  */
-      if (psymbol)
-       return *psymbol;
-      /* NOBREAK */
+      return m4_symbol_insert (name);

     case M4_SYMBOL_PUSHDEF:
-      /* Insert a name in the symbol table.  If there is already a symbol
-        with the name, push the new value on top of the value stack for
-        this symbol.  */
-      {
-       m4_symbol *symbol               = 0;
-       m4_token_data *value            = XCALLOC (m4_token_data, 1);
-
-       if (psymbol)
-         {
-           symbol = *psymbol;
-           M4_TOKEN_DATA_NEXT (value)= M4_SYMBOL_DATA (symbol);
-         }
-       else
-         symbol = XCALLOC (m4_symbol, 1);
-
-       M4_SYMBOL_DATA (symbol) = value;
-       M4_SYMBOL_TYPE (symbol) = M4_TOKEN_VOID;
-
-       if (!psymbol)
-         m4_hash_insert (m4_symtab, xstrdup (name), symbol);
-
-       return symbol;
-      }
+      return m4_symbol_pushdef (name);

     case M4_SYMBOL_POPDEF:
-      /* Delete the first occurence of a symbol with NAME.  */
-      if (psymbol)
-       {
-         if (M4_SYMBOL_DATA_NEXT (*psymbol))
-           m4_symbol_popdef (*psymbol);
-         else
-           {
-             xfree (m4_hash_remove (m4_symtab, name));
-             m4_symbol_delete (*psymbol);
-           }
-       }
+      m4_symbol_popdef (name);
       return 0;

     case M4_SYMBOL_DELETE:
-      /* Delete all occurences of symbols with NAME.  */
-      if (psymbol)
-       {
-         xfree (m4_hash_remove (m4_symtab, name));
-         m4_symbol_delete (*psymbol);
-       }
-      else
-       M4ERROR ((warning_status, 0,
-                 _("INTERNAL ERROR: Attempt to delete non-existant symbol: 
%s"),
-                 name));
+      m4_symbol_delete (name);
       return 0;
     }

   M4ERROR ((warning_status, 0,
-           _("INTERNAL ERROR: Illegal mode to m4_symbol_lookup_t (%s, %d)"),
+           _("INTERNAL ERROR: Illegal mode to m4_symbol_lookup (%s, %d)"),
            name, mode));
   abort ();
   /*NOTREACHED*/
   return 0;
 }

-/* The following function removes from the symbol table, every symbol
-   that references the given module handle.  */
+
+/* Return the symbol associated to NAME, or else NULL.  */
+m4_symbol *
+m4_symbol_lookup (const char *name)
+{
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
+
+  /* If just searching, return status of search.  */
+  return psymbol ? *psymbol : 0;
+}
+
+
+/* Push a new slot associted to NAME, and return it.  */
+m4_symbol *
+m4_symbol_pushdef (const char *name)
+{
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
+
+  /* Insert a name in the symbol table.  If there is already a symbol
+     with the name, push the new value on top of the value stack for
+     this symbol.  */
+  m4_symbol *symbol    = 0;
+  m4_token_data *value = XCALLOC (m4_token_data, 1);
+
+  if (psymbol)
+    {
+      symbol = *psymbol;
+      M4_TOKEN_DATA_NEXT (value) = M4_SYMBOL_DATA (symbol);
+    }
+  else
+    symbol = XCALLOC (m4_symbol, 1);
+
+  M4_SYMBOL_DATA (symbol)      = value;
+  M4_SYMBOL_TYPE (symbol)      = M4_TOKEN_VOID;
+
+  if (!psymbol)
+    m4_hash_insert (m4_symtab, xstrdup (name), symbol);
+
+  return symbol;
+}
+
+
+/* Return a slot associated to NAME, creating it if needed.  */
+m4_symbol *
+m4_symbol_insert (const char *name)
+{
+  return (m4_symbol *) (m4_symbol_lookup (name) || m4_symbol_pushdef (name));
+}
+
+
+/* Remove the topmost definition associated to NAME.  */
+void
+m4_symbol_popdef (const char *name)
+{
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
+
+  if (!psymbol)
+    M4ERROR ((warning_status, 0,
+             "INTERNAL ERROR: m4_symbol_popdef (%s)", name));
+
+  if (M4_SYMBOL_DATA_NEXT (*psymbol))
+    m4_symbol_pop (*psymbol);
+  else
+    {
+      xfree (m4_hash_remove (m4_symtab, name));
+      m4_symbol_del (*psymbol);
+    }
+}
+
+
+/* Remove all the definitions associated with NAME.  */
+void
+m4_symbol_delete (const char *name)
+{
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
+
+  if (!psymbol)
+    M4ERROR ((warning_status, 0,
+             "INTERNAL ERROR: m4_symbol_delete (%s)", name));
+
+  if (psymbol)
+    {
+      xfree (m4_hash_remove (m4_symtab, name));
+      m4_symbol_del (*psymbol);
+    }
+}
+
+
+/* Remove every symbol that references the given module handle from
+   the symbol table.  */
 void
 m4_remove_table_reference_symbols (lt_dlhandle handle)
 {
@@ -244,11 +287,11 @@
       if (M4_SYMBOL_HANDLE (symbol) == handle)
        {
          if (M4_SYMBOL_DATA_NEXT (symbol))
-           m4_symbol_popdef (symbol);
+           m4_symbol_pop (symbol);
          else
            {
              xfree (m4_hash_remove (m4_symtab, m4_hash_iterator_key (place)));
-             m4_symbol_delete (symbol);
+             m4_symbol_del (symbol);
            }
        }
     }
Index: modules/gnu.c
--- modules/gnu.c Mon, 03 Sep 2001 15:40:52 +0200 akim
+++ modules/gnu.c Tue, 04 Sep 2001 10:37:11 +0200 akim
@@ -145,7 +145,7 @@
   if (m4_bad_argc (argv[0], argc, 2, -1))
     return;

-  symbol = m4_lookup_symbol (name, M4_SYMBOL_LOOKUP);
+  symbol = m4_symbol_lookup (name);
   if (symbol == NULL)
     M4ERROR ((warning_status, 0,
              _("Undefined name `%s'"), name));
Index: modules/m4.c
--- modules/m4.c Tue, 04 Sep 2001 10:18:28 +0200 akim
+++ modules/m4.c Tue, 04 Sep 2001 10:38:01 +0200 akim
@@ -212,7 +212,7 @@

   if (m4_bad_argc (argv[0], argc, 3, 4))
     return;
-  symbol = m4_lookup_symbol (M4ARG (1), M4_SYMBOL_LOOKUP);
+  symbol = m4_symbol_lookup (M4ARG (1));

   if (symbol)
     result = M4ARG (2);
@@ -279,7 +279,7 @@

   for (; data.size > 0; --data.size, data.base++)
     {
-      m4_symbol *symbol = m4_lookup_symbol (data.base[0], M4_SYMBOL_LOOKUP);
+      m4_symbol *symbol = m4_symbol_lookup (data.base[0]);

       fprintf (stderr, "%s:\t", data.base[0]);
       switch (M4_SYMBOL_TYPE (symbol))
@@ -322,7 +322,7 @@
   if (m4_bad_argc (argv[0], argc, 2, 2))
     return;

-  symbol = m4_lookup_symbol (M4ARG (1), M4_SYMBOL_LOOKUP);
+  symbol = m4_symbol_lookup (M4ARG (1));
   if (symbol == NULL)
     return;

@@ -629,7 +629,7 @@
     for (i = 1; i < argc; i++)
       {
        const char *name = M4_TOKEN_DATA_TEXT (argv[i]);
-       m4_symbol *symbol = m4_lookup_symbol (name, M4_SYMBOL_LOOKUP);
+       m4_symbol *symbol = m4_symbol_lookup (name);
        if (symbol != NULL)
          set_trace (name, symbol, (char *) obs);
        else
@@ -648,7 +648,7 @@
     for (i = 1; i < argc; i++)
       {
        const char *name = M4_TOKEN_DATA_TEXT (argv[i]);
-       m4_symbol *symbol = m4_lookup_symbol (name, M4_SYMBOL_LOOKUP);
+       m4_symbol *symbol = m4_symbol_lookup (name);
        if (symbol != NULL)
          set_trace (name, symbol, NULL);
        else



reply via email to

[Prev in Thread] Current Thread [Next in Thread]