rnd-20061230-1-src
[rocksndiamonds.git] / src / libgame / hash.c
index 32c7dec9852f64bbe45739ee3484f0f4ad9ca817..e44313a87ba8a323bb0ca1d62c8807ea29fb4626 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2003 Artsoft Entertainment                      *
+* (c) 1994-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -57,7 +57,8 @@ 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;i<size;i++) { h->table[i] = NULL; }
+
+    for (i=0; i < size; i++) { h->table[i] = NULL; }
     h->tablelength  = size;
     h->entrycount   = 0;
     h->hashfn       = hashf;
@@ -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);
 }