2005-04-29 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 29 Apr 2005 16:56:12 +0000 (16:56 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 29 Apr 2005 16:56:12 +0000 (16:56 +0000)
* hash.c: Undo the last change.
* hash.h: Likewise.

gas/ChangeLog
gas/hash.c
gas/hash.h

index 23c63e9251c5511bfb5391f6be2b4a46e20c7dce..6e004e60e0f1d5d238a08cfaa6d6f3f71365b95c 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * hash.c: Undo the last change.
+       * hash.h: Likewise.
+
 2005-04-29  Ben Elliston  <bje@au.ibm.com>
 
        * Makefile.am (GAS_CFILES): Remove bignum-copy.c.
index 29c97b94b35b909ee0d0e86ea7612e18232ec196..bc534e67ad8e147d59d711397c953460cf7f699c 100644 (file)
@@ -294,6 +294,31 @@ hash_jam (struct hash_control *table, const char *key, PTR value)
   return NULL;
 }
 
+/* Replace an existing entry in a hash table.  This returns the old
+   value stored for the entry.  If the entry is not found in the hash
+   table, this does nothing and returns NULL.  */
+
+PTR
+hash_replace (struct hash_control *table, const char *key, PTR value)
+{
+  struct hash_entry *p;
+  PTR ret;
+
+  p = hash_lookup (table, key, NULL, NULL);
+  if (p == NULL)
+    return NULL;
+
+#ifdef HASH_STATISTICS
+  ++table->replacements;
+#endif
+
+  ret = p->data;
+
+  p->data = value;
+
+  return ret;
+}
+
 /* Find an entry in a hash table, returning its value.  Returns NULL
    if the entry is not found.  */
 
@@ -309,6 +334,35 @@ hash_find (struct hash_control *table, const char *key)
   return p->data;
 }
 
+/* Delete an entry from a hash table.  This returns the value stored
+   for that entry, or NULL if there is no such entry.  */
+
+PTR
+hash_delete (struct hash_control *table, const char *key)
+{
+  struct hash_entry *p;
+  struct hash_entry **list;
+
+  p = hash_lookup (table, key, &list, NULL);
+  if (p == NULL)
+    return NULL;
+
+  if (p != *list)
+    abort ();
+
+#ifdef HASH_STATISTICS
+  ++table->deletions;
+#endif
+
+  *list = p->next;
+
+  /* Note that we never reclaim the memory for this entry.  If gas
+     ever starts deleting hash table entries in a big way, this will
+     have to change.  */
+
+  return p->data;
+}
+
 /* Traverse a hash table.  Call the function on every entry in the
    hash table.  */
 
index 4556f10a7993b976029bbc9290482d843a04c94f..09c52f8edb09baf89cf2a40668b317428203ed5b 100644 (file)
@@ -51,11 +51,23 @@ extern const char *hash_insert (struct hash_control *,
 extern const char *hash_jam (struct hash_control *,
                             const char *key, PTR value);
 
+/* Replace an existing entry in a hash table.  This returns the old
+   value stored for the entry.  If the entry is not found in the hash
+   table, this does nothing and returns NULL.  */
+
+extern PTR hash_replace (struct hash_control *, const char *key,
+                        PTR value);
+
 /* Find an entry in a hash table, returning its value.  Returns NULL
    if the entry is not found.  */
 
 extern PTR hash_find (struct hash_control *, const char *key);
 
+/* Delete an entry from a hash table.  This returns the value stored
+   for that entry, or NULL if there is no such entry.  */
+
+extern PTR hash_delete (struct hash_control *, const char *key);
+
 /* Traverse a hash table.  Call the function on every entry in the
    hash table.  */