X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fhashtable.c;h=666ba2ad6f5ede1734a8107cd0152ff3c45cac0b;hb=453e4c0aa2fbca95676fa966cc5602f5daf0a1f2;hp=afb330432b4f33e1f60cf2bb2b3cb7b4b807bea6;hpb=61d0111323c7df3326d57856c7120c1af807a062;p=jansson.git diff --git a/src/hashtable.c b/src/hashtable.c index afb3304..666ba2a 100644 --- a/src/hashtable.c +++ b/src/hashtable.c @@ -1,10 +1,12 @@ /* - * Copyright (c) 2009 Petri Lehtinen + * Copyright (c) 2009, 2010 Petri Lehtinen * * This library is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ +#include + #include #include "hashtable.h" @@ -133,6 +135,23 @@ static int hashtable_do_del(hashtable_t *hashtable, return 0; } +static void hashtable_do_clear(hashtable_t *hashtable) +{ + list_t *list, *next; + pair_t *pair; + + for(list = hashtable->list.next; list != &hashtable->list; list = next) + { + next = list->next; + pair = list_to_pair(list); + if(hashtable->free_key) + hashtable->free_key(pair->key); + if(hashtable->free_value) + hashtable->free_value(pair->value); + free(pair); + } +} + static int hashtable_do_rehash(hashtable_t *hashtable) { list_t *list, *next; @@ -220,19 +239,7 @@ int hashtable_init(hashtable_t *hashtable, void hashtable_close(hashtable_t *hashtable) { - list_t *list, *next; - pair_t *pair; - for(list = hashtable->list.next; list != &hashtable->list; list = next) - { - next = list->next; - pair = list_to_pair(list); - if(hashtable->free_key) - hashtable->free_key(pair->key); - if(hashtable->free_value) - hashtable->free_value(pair->value); - free(pair); - } - + hashtable_do_clear(hashtable); free(hashtable->buckets); } @@ -292,6 +299,22 @@ int hashtable_del(hashtable_t *hashtable, const void *key) return hashtable_do_del(hashtable, key, hash); } +void hashtable_clear(hashtable_t *hashtable) +{ + unsigned int i; + + hashtable_do_clear(hashtable); + + for(i = 0; i < num_buckets(hashtable); i++) + { + hashtable->buckets[i].first = hashtable->buckets[i].last = + &hashtable->list; + } + + list_init(&hashtable->list); + hashtable->size = 0; +} + void *hashtable_iter(hashtable_t *hashtable) { return hashtable_iter_next(hashtable, &hashtable->list);