[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- 32-fyi-m4-lookup-split.patch,
Akim Demaille <=