From ed38f5d5d8fdaf1c37e4242b203bb0c94191427c Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Sat, 23 Oct 1999 15:56:52 +0000 Subject: [PATCH] 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 * 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 --- include/ChangeLog | 6 ++++++ include/hashtab.h | 10 ++++++++-- libiberty/ChangeLog | 9 +++++++++ libiberty/hashtab.c | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/include/ChangeLog b/include/ChangeLog index cfaab0aac816..545574f9f27e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,9 @@ +1999-10-23 08:51 -0700 Zack Weinberg + + * 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. + Fri Oct 15 01:47:51 1999 Vladimir Makarov * hashtab.h: New file. diff --git a/include/hashtab.h b/include/hashtab.h index 67c37a284f77..3990c14cbcaa 100644 --- a/include/hashtab.h +++ b/include/hashtab.h @@ -47,7 +47,7 @@ typedef const void *hash_table_entry_t; tables. All work with hash table should be executed only through functions mentioned below. */ -typedef struct +typedef struct hash_table { /* Current size (in entries) of the hash table */ size_t size; @@ -88,13 +88,19 @@ extern hash_table_entry_t *find_hash_table_entry extern void remove_element_from_hash_table_entry PARAMS ((hash_table_t, hash_table_entry_t)); +extern void clear_hash_table_slot PARAMS ((hash_table_t, hash_table_entry_t *)); + +extern void traverse_hash_table PARAMS ((hash_table_t, + int (*) (hash_table_entry_t, void *), + void *)); + extern size_t hash_table_size PARAMS ((hash_table_t)); extern size_t hash_table_elements_number PARAMS ((hash_table_t)); extern int hash_table_collisions PARAMS ((hash_table_t)); -extern int all_hash_table_collisions (); +extern int all_hash_table_collisions PARAMS ((void)); #ifdef __cplusplus } diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 78180af2d5dc..829b70ed19f5 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,12 @@ +1999-10-23 08:51 -0700 Zack Weinberg + + * 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 * cplus-dem.c (INTBUF_SIZE): New macro. diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c index 8137d77bc4e2..9fce8ccc1254 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 -- 2.39.2