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; }
h->tablelength = size;
h->entrycount = 0;
/* 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;
}
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);
}