X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/10da10992e717ff220b7443d171e07559d45b3e4..f3507930c130404d05f982cf9fe960fb95f7eb4b:/src/xbt/dict.c?ds=sidebyside diff --git a/src/xbt/dict.c b/src/xbt/dict.c index 227347b76a..378bdbf9ac 100644 --- a/src/xbt/dict.c +++ b/src/xbt/dict.c @@ -8,6 +8,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include +#include #include "xbt/ex.h" #include "xbt/log.h" #include "xbt/mallocator.h" @@ -164,15 +165,17 @@ static unsigned int xbt_dict_hash(const char *str) { * Set the \a data in the structure under the \a key, which can be any kind * of data, as long as its length is provided in \a key_len. */ -void xbt_dict_set_ext(xbt_dict_t dict, +void xbt_dict_set_ext(xbt_dict_t dict, const char *key, int key_len, void *data, - void_f_pvoid_t *free_ctn) { - xbt_assert(dict); + void_f_pvoid_t free_ctn) { - unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; + unsigned int hash_code; xbt_dictelm_t current, previous = NULL; + xbt_assert(dict); + + hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; current = dict->table[hash_code]; while (current != NULL && @@ -214,10 +217,10 @@ void xbt_dict_set_ext(xbt_dict_t dict, * set the \a data in the structure under the \a key, which is a * null terminated string. */ -void xbt_dict_set(xbt_dict_t dict, +void xbt_dict_set(xbt_dict_t dict, const char *key, void *data, - void_f_pvoid_t *free_ctn) { + void_f_pvoid_t free_ctn) { xbt_assert(dict); @@ -237,11 +240,15 @@ void xbt_dict_set(xbt_dict_t dict, void *xbt_dict_get_ext(xbt_dict_t dict, const char *key, int key_len) { - xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; + + unsigned int hash_code; xbt_dictelm_t current; + xbt_assert(dict); + + hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; + current = dict->table[hash_code]; while (current != NULL && (key_len != current->key_len || strncmp(key, current->key, key_len))) { @@ -268,11 +275,15 @@ void *xbt_dict_get_ext(xbt_dict_t dict, */ void *xbt_dict_get(xbt_dict_t dict, const char *key) { - xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key) % dict->table_size; + + unsigned int hash_code ; xbt_dictelm_t current; + xbt_assert(dict); + + hash_code = xbt_dict_hash(key) % dict->table_size; + current = dict->table[hash_code]; while (current != NULL && (strcmp(key, current->key))) { current = current->next; @@ -290,17 +301,22 @@ void *xbt_dict_get(xbt_dict_t dict, */ void *xbt_dict_get_or_null(xbt_dict_t dict, const char *key) { - xbt_ex_t e; - void *result = NULL; - TRY { - result = xbt_dict_get(dict, key); - } CATCH(e) { - if (e.category != not_found_error) - RETHROW; - xbt_ex_free(e); - result = NULL; + unsigned int hash_code ; + xbt_dictelm_t current; + + xbt_assert(dict); + + hash_code = xbt_dict_hash(key) % dict->table_size; + + current = dict->table[hash_code]; + while (current != NULL && (strcmp(key, current->key))) { + current = current->next; } - return result; + + if (current == NULL) + return NULL; + + return current->content; } @@ -316,11 +332,15 @@ void *xbt_dict_get_or_null(xbt_dict_t dict, void xbt_dict_remove_ext(xbt_dict_t dict, const char *key, int key_len) { - xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; + + unsigned int hash_code ; xbt_dictelm_t current, previous = NULL; + xbt_assert(dict); + + hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; + current = dict->table[hash_code]; while (current != NULL && (key_len != current->key_len || strncmp(key, current->key, key_len))) { @@ -364,10 +384,12 @@ void xbt_dict_remove(xbt_dict_t dict, * \param dict the dict */ void xbt_dict_reset(xbt_dict_t dict) { - xbt_assert(dict); + int i; xbt_dictelm_t current, previous = NULL; + + xbt_assert(dict); if (dict->count == 0) return; @@ -399,9 +421,13 @@ int xbt_dict_length(xbt_dict_t dict) { * Add an already mallocated element to a dictionary. */ void xbt_dict_add_element(xbt_dict_t dict, xbt_dictelm_t element) { - xbt_assert(dict); - int hashcode = xbt_dict_hash_ext(element->key,element->key_len) % dict->table_size; + + int hashcode; + + xbt_assert(dict); + + hashcode = xbt_dict_hash_ext(element->key,element->key_len) % dict->table_size; element->next = dict->table[hashcode]; dict->table[hashcode] = element; } @@ -417,7 +443,7 @@ void xbt_dict_add_element(xbt_dict_t dict, xbt_dictelm_t element) { */ void xbt_dict_dump(xbt_dict_t dict, - void_f_pvoid_t *output) { + void_f_pvoid_t output) { int i; xbt_dictelm_t element; printf("Dict %p:\n", dict); @@ -427,7 +453,7 @@ void xbt_dict_dump(xbt_dict_t dict, while (element != NULL) { printf("%s -> ", element->key); if (output != NULL) { - output(element->content); + (*output)(element->content); } printf("\n"); element = element->next; @@ -443,7 +469,9 @@ void xbt_dict_dump(xbt_dict_t dict, void xbt_dict_exit(void) { if (dict_mallocator != NULL) { xbt_mallocator_free(dict_mallocator); + dict_mallocator = NULL; xbt_mallocator_free(dict_elm_mallocator); + dict_elm_mallocator = NULL; } }