aboutsummaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorZack Weinberg <zack@bitmover.com>1999-10-23 15:56:52 +0000
committerZack Weinberg <zack@gcc.gnu.org>1999-10-23 15:56:52 +0000
commited38f5d5d8fdaf1c37e4242b203bb0c94191427c (patch)
tree3ad8d02ae08a5e2403f87cba3849031590ae8f60 /libiberty
parent5e481b31ee1b68793b8c9b57ed1b946115584241 (diff)
downloadgcc-ed38f5d5d8fdaf1c37e4242b203bb0c94191427c.zip
gcc-ed38f5d5d8fdaf1c37e4242b203bb0c94191427c.tar.gz
gcc-ed38f5d5d8fdaf1c37e4242b203bb0c94191427c.tar.bz2
hashtab.c (find_hash_table_entry): When returning a DELETED_ENTRY slot, change it to EMPTY_ENTRY first.
1999-10-23 08:51 -0700 Zack Weinberg <zack@bitmover.com> * hashtab.c (find_hash_table_entry): When returning a DELETED_ENTRY slot, change it to EMPTY_ENTRY first. (clear_hash_table_slot): New function which deletes an entry by its position in the table, not its value. (traverse_hash_table): New function which calls a hook function for every live entry in the table. * hashtab.h: Give hash_table_t a struct tag. Add prototypes for clear_hash_table_slot and traverse_hash_table. Correct prototype of all_hash_table_collisions. From-SVN: r30138
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog9
-rw-r--r--libiberty/hashtab.c37
2 files changed, 45 insertions, 1 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 78180af..829b70e 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,12 @@
+1999-10-23 08:51 -0700 Zack Weinberg <zack@bitmover.com>
+
+ * hashtab.c (find_hash_table_entry): When returning a
+ DELETED_ENTRY slot, change it to EMPTY_ENTRY first.
+ (clear_hash_table_slot): New function which deletes an entry
+ by its position in the table, not its value.
+ (traverse_hash_table): New function which calls a hook
+ function for every live entry in the table.
+
1999-10-19 Mark Mitchell <mark@codesourcery.com>
* cplus-dem.c (INTBUF_SIZE): New macro.
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index 8137d77..9fce8cc 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -206,7 +206,7 @@ find_hash_table_entry (htab, element, reserve)
if (first_deleted_entry_ptr != NULL)
{
entry_ptr = first_deleted_entry_ptr;
- *entry_ptr = DELETED_ENTRY;
+ *entry_ptr = EMPTY_ENTRY;
}
}
break;
@@ -242,6 +242,41 @@ remove_element_from_hash_table_entry (htab, element)
htab->number_of_deleted_elements++;
}
+/* This function clears a specified slot in a hash table.
+ It is useful when you've already done the lookup and don't want to
+ do it again. */
+
+void
+clear_hash_table_slot (htab, slot)
+ hash_table_t htab;
+ hash_table_entry_t *slot;
+{
+ if (slot < htab->entries || slot >= htab->entries + htab->size
+ || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
+ abort ();
+ *slot = DELETED_ENTRY;
+ htab->number_of_deleted_elements++;
+}
+
+/* This function scans over the entire hash table calling
+ CALLBACK for each live entry. If CALLBACK returns false,
+ the iteration stops. INFO is passed as CALLBACK's second
+ argument. */
+
+void
+traverse_hash_table (htab, callback, info)
+ hash_table_t htab;
+ int (*callback) (hash_table_entry_t, void *);
+ void *info;
+{
+ hash_table_entry_t *entry_ptr;
+ for (entry_ptr = htab->entries; entry_ptr < htab->entries + htab->size;
+ entry_ptr++)
+ if (*entry_ptr != EMPTY_ENTRY && *entry_ptr != DELETED_ENTRY)
+ if (!callback (*entry_ptr, info))
+ break;
+}
+
/* The following function returns current size of given hash table. */
size_t