From 40d0490b7c9ccbfba1d0380ab629abf2c1746a2c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Tue, 2 Oct 2001 23:17:25 +0000 Subject: [PATCH] add Hash_GetList to get a list of elements in the hash table (unsorted) --- include/QF/hash.h | 6 ++++++ libs/util/hash.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/QF/hash.h b/include/QF/hash.h index 32d5ee2f8..9cb87494a 100644 --- a/include/QF/hash.h +++ b/include/QF/hash.h @@ -114,4 +114,10 @@ void *Hash_DelElement (hashtab_t *tab, void *ele); */ unsigned long Hash_String (const char *str); +/* + return a list of all elements in the table. it is the caller's + responsibilty to free() the array. Null terminated. +*/ +void **Hash_GetList (hashtab_t *tab); + #endif // __hash_h diff --git a/libs/util/hash.c b/libs/util/hash.c index 8b85d2976..3a4a7a2b6 100644 --- a/libs/util/hash.c +++ b/libs/util/hash.c @@ -51,6 +51,7 @@ struct hashlink_s { struct hashtab_s { size_t tab_size; + size_t num_ele; void *user_data; int (*compare)(void*,void*,void*); unsigned long (*get_hash)(void*,void*); @@ -148,6 +149,7 @@ Hash_FlushTable (hashtab_t *tab) tab->free_ele (data, tab->user_data); } } + tab->num_ele = 0; } int @@ -165,6 +167,7 @@ Hash_Add (hashtab_t *tab, void *ele) lnk->prev = &tab->tab[ind]; lnk->data = ele; tab->tab[ind] = lnk; + tab->num_ele++; return 0; } @@ -183,6 +186,7 @@ Hash_AddElement (hashtab_t *tab, void *ele) lnk->prev = &tab->tab[ind]; lnk->data = ele; tab->tab[ind] = lnk; + tab->num_ele++; return 0; } @@ -231,6 +235,7 @@ Hash_Del (hashtab_t *tab, const char *key) lnk->next->prev = lnk->prev; *lnk->prev = lnk->next; free (lnk); + tab->num_ele--; return data; } lnk = lnk->next; @@ -253,9 +258,33 @@ Hash_DelElement (hashtab_t *tab, void *ele) lnk->next->prev = lnk->prev; *lnk->prev = lnk->next; free (lnk); + tab->num_ele--; return data; } lnk = lnk->next; } return 0; } + +void ** +Hash_GetList (hashtab_t *tab) +{ + void **list; + void **l; + size_t ind; + + l = list = malloc ((tab->num_ele + 1) * sizeof (void*)); + if (!list) + return 0; + for (ind = 0; ind < tab->tab_size; ind++) { + struct hashlink_s *lnk; + + for (lnk = tab->tab[ind]; lnk; lnk = lnk->next) { + if (l - list == tab->num_ele) + Sys_Error ("hash.c: internal error\n"); + *l++ = lnk->data; + } + } + *l++ = 0; + return list; +}