X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/dcda594451ecd4d8ba699da3e4cc3c723f31b538..0ddebb8f377a5daa1f546f18a956db99c54685ca:/assoc.c diff --git a/assoc.c b/assoc.c index 26fe2c9..764a820 100644 --- a/assoc.c +++ b/assoc.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: assoc.c,v 1.1 2001/01/20 11:50:58 mdw Exp $ + * $Id: assoc.c,v 1.4 2004/04/08 01:36:11 mdw Exp $ * * Assocation tables * @@ -27,15 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: assoc.c,v $ - * Revision 1.1 2001/01/20 11:50:58 mdw - * Hash tables indexed by atoms, to avoid expense of hashing keys on each - * lookup, and to reduce storage used by key texts. - * - */ - /*----- Header files ------------------------------------------------------*/ #include "alloc.h" @@ -77,6 +68,8 @@ void assoc_destroy(assoc_table *t) for (;;) { hash_base *p; HASH_NEXT(&i, p); + if (!p) + break; x_free(t->t.a, p); } hash_destroy(&t->t); @@ -103,7 +96,7 @@ void assoc_destroy(assoc_table *t) void *assoc_find(assoc_table *t, atom *a, size_t sz, unsigned *f) { - hash_base **bin = HASH_BIN(&t->t, a->b.b.hash), **p; + hash_base **bin = HASH_BIN(&t->t, ATOM_HASH(a)), **p; assoc_base *q; /* --- Try to find the association --- */ @@ -127,6 +120,7 @@ void *assoc_find(assoc_table *t, atom *a, size_t sz, unsigned *f) /* --- Make a new assoication --- */ q = x_alloc(t->t.a, sz); + q->a = a; q->b.next = *bin; q->b.hash = ATOM_HASH(a); *bin = &q->b;