131 static size_t htable_hash(
const char *s,
size_t size)
141 h = (h << 4U) + *(
unsigned const char *) s++;
142 if ((g = (h & 0xf0000000)) != 0) {
152 #define htable_link(table, element) { \
153 HTABLE_INFO **_h = table->data + htable_hash(element->key, table->size);\
155 if ((element->next = *_h) != 0) \
156 (*_h)->prev = element; \
163 static void htable_size(
HTABLE *table,
size_t size)
184 htable_size(table, size < 13 ? 13 : size);
191 static void htable_grow(
HTABLE *table)
195 size_t old_size = table->
size;
199 htable_size(table, 2 * old_size);
201 while (old_size-- > 0) {
202 for (ht = *h++; ht; ht = next) {
207 myfree((
void *) old_entries);
231 #define STREQ(x,y) (x == y || (x[0] == y[0] && strcmp(x,y) == 0))
234 for (ht = table->
data[htable_hash(key, table->
size)]; ht; ht = ht->
next)
246 #define STREQ(x,y) (x == y || (x[0] == y[0] && strcmp(x,y) == 0))
249 for (ht = table->
data[htable_hash(key, table->
size)]; ht; ht = ht->
next)
263 #define STREQ(x,y) (x == y || (x[0] == y[0] && strcmp(x,y) == 0))
265 for (ht = *h; ht; ht = ht->
next) {
275 if (free_fn && ht->
value)
276 (*free_fn) (ht->
value);
281 msg_panic(
"htable_delete: unknown_key: \"%s\"", key);
290 ssize_t i = table->
size;
296 for (ht = *h++; ht; ht = next) {
299 if (free_fn && ht->
value)
300 (*free_fn) (ht->
value);
318 ssize_t i = table->
size;
323 for (ht = *h++; ht; ht = ht->
next)
339 for (i = 0; i < table->
size; i++)
340 for (member = table->
data[i]; member != 0; member = member->
next)
341 list[count++] = member;
380 int main(
int unused_argc,
char **unused_argv)
402 msg_panic(
"%ld entries found, but %lu entries exist",
403 (
long) i, (
unsigned long) hash->
used);
405 for (i = 0; i < hash->
used; i++) {
408 ht_info[i] = ht_info[r];
411 for (ht = ht_info; *ht; ht++)
void htable_free(HTABLE *table, void(*free_fn)(void *))
struct HTABLE_INFO * next
HTABLE_INFO * htable_locate(HTABLE *table, const char *key)
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
int vstring_get(VSTRING *vp, VSTREAM *fp)
HTABLE_INFO ** seq_element
HTABLE_INFO ** seq_bucket
void htable_walk(HTABLE *table, void(*action)(HTABLE_INFO *, void *), void *ptr)
HTABLE * htable_create(ssize_t size)
HTABLE_INFO ** htable_list(HTABLE *table)
HTABLE_INFO * htable_sequence(HTABLE *table, int how)
#define CAST_INT_TO_VOID_PTR(ival)
VSTRING * vstring_alloc(ssize_t len)
void * htable_find(HTABLE *table, const char *key)
#define htable_link(table, element)
VSTRING * vstring_free(VSTRING *vp)
void htable_delete(HTABLE *table, const char *key, void(*free_fn)(void *))
struct HTABLE_INFO * prev
void * mymalloc(ssize_t len)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)