summaryrefslogtreecommitdiff
path: root/lib/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hash.c')
-rw-r--r--lib/hash.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/hash.c b/lib/hash.c
index 56e41fa826..4d3da66d79 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -225,6 +225,31 @@ hash_iterate (struct hash *hash,
}
}
+/* Iterator function for hash. */
+void
+hash_walk (struct hash *hash,
+ int (*func) (struct hash_backet *, void *), void *arg)
+{
+ unsigned int i;
+ struct hash_backet *hb;
+ struct hash_backet *hbnext;
+ int ret = HASHWALK_CONTINUE;
+
+ for (i = 0; i < hash->size; i++)
+ {
+ for (hb = hash->index[i]; hb; hb = hbnext)
+ {
+ /* get pointer to next hash backet here, in case (*func)
+ * decides to delete hb by calling hash_release
+ */
+ hbnext = hb->next;
+ ret = (*func) (hb, arg);
+ if (ret == HASHWALK_ABORT)
+ return;
+ }
+ }
+}
+
/* Clean up hash. */
void
hash_clean (struct hash *hash, void (*free_func) (void *))