m4-commit
[Top][All Lists]
Advanced

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

Changes to m4/m4/symtab.c,v


From: Eric Blake
Subject: Changes to m4/m4/symtab.c,v
Date: Mon, 18 Sep 2006 13:16:54 +0000

CVSROOT:        /sources/m4
Module name:    m4
Changes by:     Eric Blake <ericb>      06/09/18 13:16:45

Index: m4/symtab.c
===================================================================
RCS file: /sources/m4/m4/m4/symtab.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- m4/symtab.c 5 Sep 2006 13:25:24 -0000       1.59
+++ m4/symtab.c 18 Sep 2006 13:16:44 -0000      1.60
@@ -46,7 +46,6 @@
 
 struct m4_symbol_table {
   m4_hash *table;
-  bool *nuke_trace_bit;        /* default: &(context->no_gnu_ext_opt) */
 };
 
 static m4_symbol *symtab_fetch         (m4_symbol_table*, const char *);
@@ -66,13 +65,12 @@
    These functions are used to manage a symbol table as a whole.  */
 
 m4_symbol_table *
-m4_symtab_create (size_t size, bool *nuke_trace_bit)
+m4_symtab_create (size_t size)
 {
   m4_symbol_table *symtab = xmalloc (sizeof *symtab);
 
   symtab->table = m4_hash_new (size ? size : M4_SYMTAB_DEFAULT_SIZE,
                               m4_hash_string_hash, m4_hash_string_cmp);
-  symtab->nuke_trace_bit = nuke_trace_bit;
   return symtab;
 }
 
@@ -115,6 +113,7 @@
   return result;
 }
 
+/* Ensure that NAME exists in the table, creating an entry if needed.  */
 static m4_symbol *
 symtab_fetch (m4_symbol_table *symtab, const char *name)
 {
@@ -191,7 +190,7 @@
 {
   char *key = xstrdup ((char *) name);
 
-  m4_set_symbol_traced (symbol, false);
+  symbol->traced = false;
 
   while (key && m4_hash_lookup (symtab->table, key))
     m4_symbol_popdef (symtab, key);
@@ -216,7 +215,7 @@
 
   /* If just searching, return status of search -- if only an empty
      struct is returned, that is treated as a failed lookup.  */
-  return (psymbol && m4_get_symbol_value (*psymbol)) ? *psymbol : 0;
+  return (psymbol && m4_get_symbol_value (*psymbol)) ? *psymbol : NULL;
 }
 
 
@@ -276,14 +275,12 @@
 
   assert (psymbol);
   assert (*psymbol);
-  assert (symtab->nuke_trace_bit);
 
   symbol_popval (*psymbol);
 
   /* Only remove the hash table entry if the last value in the
      symbol value stack was successfully removed.  */
-  if (!m4_get_symbol_value (*psymbol))
-    if (*symtab->nuke_trace_bit || !m4_get_symbol_traced (*psymbol))
+  if (!m4_get_symbol_value (*psymbol) && !m4_get_symbol_traced (*psymbol))
       {
        DELETE (*psymbol);
        free (m4_hash_remove (symtab->table, name));
@@ -425,17 +422,43 @@
   return NULL;
 }
 
+/* Set the tracing status of the symbol NAME to TRACED.  This takes a
+   name, rather than a symbol, since we hide macros that are traced
+   but otherwise undefined from normal lookups, but still can affect
+   their tracing status.  Return true iff the macro was previously
+   traced.  */
 bool
-m4_set_symbol_name_traced (m4_symbol_table *symtab, const char *name)
+m4_set_symbol_name_traced (m4_symbol_table *symtab, const char *name,
+                          bool traced)
 {
   m4_symbol *symbol;
+  bool result;
 
   assert (symtab);
   assert (name);
 
+  if (traced)
   symbol = symtab_fetch (symtab, name);
+  else
+    {
+      m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (symtab->table,
+                                                          name);
+      if (!psymbol)
+       return false;
+      symbol = *psymbol;
+    }
+
+  result = symbol->traced;
+  symbol->traced = traced;
+  if (!traced && !m4_get_symbol_value (symbol))
+    {
+      /* Free an undefined entry once it is no longer traced.  */
+      assert (result);
+      free (symbol);
+      free (m4_hash_remove (symtab->table, name));
+    }
 
-  return m4_set_symbol_traced (symbol, true);
+  return result;
 }
 
 
@@ -459,14 +482,6 @@
   return symbol->traced;
 }
 
-#undef m4_set_symbol_traced
-bool
-m4_set_symbol_traced (m4_symbol *symbol, bool value)
-{
-  assert (symbol);
-  return symbol->traced = value;
-}
-
 #undef m4_symbol_value_create
 m4_symbol_value *
 m4_symbol_value_create (void)




reply via email to

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