X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=hash.c;h=fd3c04b1464a09b7c98bee3ec670fc2e93c9c93c;hb=8f9844399efbefe64a90741767bd07f816a26790;hp=ea36860212a2c4f64b451f673da43a36446209a9;hpb=924eb6a12fa17c4ebbff5c8a15bd266358c16b09;p=libradsec.git diff --git a/hash.c b/hash.c index ea36860..fd3c04b 100644 --- a/hash.c +++ b/hash.c @@ -12,12 +12,6 @@ #include "list.h" #include "hash.h" -struct entry { - void *key; - uint32_t keylen; - void *data; -}; - /* allocates and initialises hash structure; returns NULL if malloc fails */ struct hash *hash_create() { struct hash *h = malloc(sizeof(struct hash)); @@ -35,12 +29,12 @@ struct hash *hash_create() { /* frees all memory associated with the hash */ void hash_destroy(struct hash *h) { struct list_node *ln; - + if (!h) return; for (ln = list_first(h->hashlist); ln; ln = list_next(ln)) { - free(((struct entry *)ln->data)->key); - free(((struct entry *)ln->data)->data); + free(((struct hash_entry *)ln->data)->key); + free(((struct hash_entry *)ln->data)->data); } list_destroy(h->hashlist); pthread_mutex_destroy(&h->mutex); @@ -48,13 +42,14 @@ void hash_destroy(struct hash *h) { /* insert entry in hash; returns 1 if ok, 0 if malloc fails */ int hash_insert(struct hash *h, void *key, uint32_t keylen, void *data) { - struct entry *e; + struct hash_entry *e; if (!h) return 0; - e = malloc(sizeof(struct entry)); + e = malloc(sizeof(struct hash_entry)); if (!e) return 0; + memset(e, 0, sizeof(struct hash_entry)); e->key = malloc(keylen); if (!e->key) { free(e); @@ -77,18 +72,65 @@ int hash_insert(struct hash *h, void *key, uint32_t keylen, void *data) { /* reads entry from hash */ void *hash_read(struct hash *h, void *key, uint32_t keylen) { struct list_node *ln; - struct entry *e; - + struct hash_entry *e; + if (!h) return 0; pthread_mutex_lock(&h->mutex); for (ln = list_first(h->hashlist); ln; ln = list_next(ln)) { - e = (struct entry *)ln->data; + e = (struct hash_entry *)ln->data; if (e->keylen == keylen && !memcmp(e->key, key, keylen)) { - pthread_mutex_unlock(&h->mutex); - return e->data; + pthread_mutex_unlock(&h->mutex); + return e->data; } } pthread_mutex_unlock(&h->mutex); return NULL; } + +/* extracts entry from hash */ +void *hash_extract(struct hash *h, void *key, uint32_t keylen) { + struct list_node *ln; + struct hash_entry *e; + + if (!h) + return 0; + pthread_mutex_lock(&h->mutex); + for (ln = list_first(h->hashlist); ln; ln = list_next(ln)) { + e = (struct hash_entry *)ln->data; + if (e->keylen == keylen && !memcmp(e->key, key, keylen)) { + free(e->key); + list_removedata(h->hashlist, e); + free(e); + pthread_mutex_unlock(&h->mutex); + return e->data; + } + } + pthread_mutex_unlock(&h->mutex); + return NULL; +} + +/* returns first entry */ +struct hash_entry *hash_first(struct hash *hash) { + struct list_node *ln; + struct hash_entry *e; + if (!hash || !((ln = list_first(hash->hashlist)))) + return NULL; + e = (struct hash_entry *)ln->data; + e->next = ln->next; + return e; +} + +/* returns the next node after the argument */ +struct hash_entry *hash_next(struct hash_entry *entry) { + struct hash_entry *e; + if (!entry || !entry->next) + return NULL; + e = (struct hash_entry *)entry->next->data; + e->next = (struct list_node *)entry->next->next; + return e; +} + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */