/* does not free, regardless of the value of ht->free_keyval, invoked only when deleting. */ boolean ht_remove(hashtable ht, const void *key) { unsigned int hkey; hashentry *he, *prehe; assert(ht!=NULL); hkey = ht->hash(key); prehe = NULL; LOCK; he = ht->table[hkey%ht->table_size]; while(he!=NULL) { if(he->hashkey == hkey && ht->isequal(he->keyval,key)) { if(prehe != NULL) { prehe->next = he->next; } else { ht->table[hkey%ht->table_size] = he->next; } UNLOCK; free(he); return TRUE; } prehe = he; he = he->next; } UNLOCK; return FALSE; }