* under the terms of the license (GNU LGPL) which comes with this package. */
#include <string.h>
+#include <stdio.h>
#include "xbt/ex.h"
#include "xbt/log.h"
#include "xbt/mallocator.h"
* 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 &&
* 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);
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))) {
*/
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;
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))) {
* \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;
* 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;
}
*/
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);
while (element != NULL) {
printf("%s -> ", element->key);
if (output != NULL) {
- output(element->content);
+ (*output)(element->content);
}
printf("\n");
element = element->next;
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;
}
}
XBT_TEST_UNIT("basic",test_dict_basic,"Basic usage: change, retrieve, traverse"){
- xbt_test_add0("Traversal the empty dictionnary");
+ xbt_test_add0("Traversal the null dictionnary");
+ traverse(head);
+
+ xbt_test_add0("Traversal and search the empty dictionnary");
+ head = xbt_dict_new();
traverse(head);
+ TRY {
+ debuged_remove(head,"12346");
+ } CATCH(e) {
+ if (e.category != not_found_error)
+ xbt_test_exception(e);
+ xbt_ex_free(e);
+ }
+ xbt_dict_free(&head);
xbt_test_add0("Traverse the full dictionnary");
fill(&head);