From d9042af464cca6e6e52525392485b7cef6a12c2b Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Fri, 19 Jun 2009 22:14:54 +0000 Subject: [PATCH] partial dbghelp wine sync svn path=/trunk/; revision=41474 --- reactos/dll/win32/dbghelp/dbghelp_private.h | 9 ++++-- reactos/dll/win32/dbghelp/storage.c | 32 +++++++++------------ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/dbghelp/dbghelp_private.h b/reactos/dll/win32/dbghelp/dbghelp_private.h index 3eb420e75c2..31dc7027e3b 100644 --- a/reactos/dll/win32/dbghelp/dbghelp_private.h +++ b/reactos/dll/win32/dbghelp/dbghelp_private.h @@ -78,11 +78,17 @@ struct hash_table_elt struct hash_table_elt* next; }; +struct hash_table_bucket +{ + struct hash_table_elt* first; + struct hash_table_elt* last; +}; + struct hash_table { unsigned num_elts; unsigned num_buckets; - struct hash_table_elt** buckets; + struct hash_table_bucket* buckets; struct pool* pool; }; @@ -90,7 +96,6 @@ void hash_table_init(struct pool* pool, struct hash_table* ht, unsigned num_buckets); void hash_table_destroy(struct hash_table* ht); void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt); -void* hash_table_find(const struct hash_table* ht, const char* name); unsigned hash_table_hash(const char* name, unsigned num_buckets); struct hash_table_iter diff --git a/reactos/dll/win32/dbghelp/storage.c b/reactos/dll/win32/dbghelp/storage.c index 04ea378855e..baca0530b34 100644 --- a/reactos/dll/win32/dbghelp/storage.c +++ b/reactos/dll/win32/dbghelp/storage.c @@ -361,36 +361,30 @@ void hash_table_destroy(struct hash_table* ht) void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt) { unsigned hash = hash_table_hash(elt->name, ht->num_buckets); - struct hash_table_elt** p; if (!ht->buckets) { - ht->buckets = pool_alloc(ht->pool, ht->num_buckets * sizeof(struct hash_table_elt*)); + ht->buckets = pool_alloc(ht->pool, ht->num_buckets * sizeof(struct hash_table_bucket)); assert(ht->buckets); - memset(ht->buckets, 0, ht->num_buckets * sizeof(struct hash_table_elt*)); + memset(ht->buckets, 0, ht->num_buckets * sizeof(struct hash_table_bucket)); } /* in some cases, we need to get back the symbols of same name in the order * in which they've been inserted. So insert new elements at the end of the list. */ - for (p = &ht->buckets[hash]; *p; p = &((*p)->next)); - *p = elt; + if (!ht->buckets[hash].first) + { + ht->buckets[hash].first = elt; + } + else + { + ht->buckets[hash].last->next = elt; + } + ht->buckets[hash].last = elt; elt->next = NULL; ht->num_elts++; } -void* hash_table_find(const struct hash_table* ht, const char* name) -{ - unsigned hash = hash_table_hash(name, ht->num_buckets); - struct hash_table_elt* elt; - - if(!ht->buckets) return NULL; - - for (elt = ht->buckets[hash]; elt; elt = elt->next) - if (!strcmp(name, elt->name)) return elt; - return NULL; -} - void hash_table_iter_init(const struct hash_table* ht, struct hash_table_iter* hti, const char* name) { @@ -410,10 +404,10 @@ void hash_table_iter_init(const struct hash_table* ht, void* hash_table_iter_up(struct hash_table_iter* hti) { - if(!hti->ht->buckets) return NULL; + if (!hti->ht->buckets) return NULL; if (hti->element) hti->element = hti->element->next; while (!hti->element && hti->index < hti->last) - hti->element = hti->ht->buckets[++hti->index]; + hti->element = hti->ht->buckets[++hti->index].first; return hti->element; }