summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/hash.c54
-rw-r--r--gas/hash.h12
3 files changed, 71 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 23c63e9251..6e004e60e0 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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.
diff --git a/gas/hash.c b/gas/hash.c
index 29c97b94b3..bc534e67ad 100644
--- a/gas/hash.c
+++ b/gas/hash.c
@@ -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. */
diff --git a/gas/hash.h b/gas/hash.h
index 4556f10a79..09c52f8edb 100644
--- a/gas/hash.h
+++ b/gas/hash.h
@@ -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. */