X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fhash.c;fp=src%2Flibgame%2Fhash.c;h=805190bfe81404424a3e34e40024bd683395e43a;hb=9c925fe76f2f2b3ad74251b775e938b80c81195d;hp=32c7dec9852f64bbe45739ee3484f0f4ad9ca817;hpb=0eaa7d33772143903b8a93abac8f1dce5422fa66;p=rocksndiamonds.git diff --git a/src/libgame/hash.c b/src/libgame/hash.c index 32c7dec9..805190bf 100644 --- a/src/libgame/hash.c +++ b/src/libgame/hash.c @@ -57,6 +57,7 @@ create_hashtable(unsigned int minsize, float maxloadfactor, if (NULL == h) return NULL; /*oom*/ h->table = (struct entry **)malloc(sizeof(struct entry*) * size); if (NULL == h->table) { free(h); return NULL; } /*oom*/ + for (i=0;itable[i] = NULL; } h->tablelength = size; h->entrycount = 0; @@ -194,9 +195,9 @@ hashtable_change(struct hashtable *h, void *k, void *v) /* Check hash value to short circuit heavier comparison */ if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { - free(e->v); - e->v = v; - return -1; + free(e->v); + e->v = v; + return -1; } e = e->next; } @@ -260,24 +261,23 @@ hashtable_destroy(struct hashtable *h, int free_values) unsigned int i; struct entry *e, *f; struct entry **table = h->table; - if (free_values) - { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; free(f->k); free(f->v); free(f); } - } - } - else + + for (i = 0; i < h->tablelength; i++) { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; free(f->k); free(f); } - } + e = table[i]; + while (NULL != e) + { + f = e; + e = e->next; + free(f->k); + if (free_values) + free(f->v); + free(f); + } } + + free(h->table); + free(h); }