From ed290d6d0df5f4c694459f853983ab79929ea786 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 14 Feb 2014 15:53:06 -0800 Subject: * eval.c (eval_init): Register inhash as intrinsic. * hash.c (inhash): New function. * hash.h (inhash): Declared. * txr.1: Documented inhash. Also, added surprisingly missing documentation for gethash! --- hash.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'hash.c') diff --git a/hash.c b/hash.c index c74a6294..f9548c3c 100644 --- a/hash.c +++ b/hash.c @@ -542,6 +542,28 @@ val gethash(val hash, val key) return cdr(found); } +val inhash(val hash, val key, val init) +{ + struct hash *h = (struct hash *) cobj_handle(hash, hash_s); + val found; + + if (missingp(init)) { + val chain = vecref(h->table, num_fast(h->hash_fun(key) % h->modulus)); + found = h->assoc_fun(key, chain); + } else { + val *pchain = vecref_l(h->table, num_fast(h->hash_fun(key) % h->modulus)); + val old = *pchain, new; + val *place = h->acons_new_l_fun(key, &new, pchain); + if (old != *pchain && ++h->count > 2 * h->modulus) + hash_grow(h); + if (new) + *place = init; + found = h->assoc_fun(key, *pchain); + } + + return found; +} + val gethash_f(val hash, val key, val *found) { struct hash *h = (struct hash *) cobj_handle(hash, hash_s); -- cgit v1.2.3