diff options
author | Zack Weinberg <zack@bitmover.com> | 1999-10-23 15:56:52 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 1999-10-23 15:56:52 +0000 |
commit | ed38f5d5d8fdaf1c37e4242b203bb0c94191427c (patch) | |
tree | 3ad8d02ae08a5e2403f87cba3849031590ae8f60 /libiberty/hashtab.c | |
parent | 5e481b31ee1b68793b8c9b57ed1b946115584241 (diff) | |
download | gcc-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/hashtab.c')
-rw-r--r-- | libiberty/hashtab.c | 37 |
1 files changed, 36 insertions, 1 deletions
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 |