Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merging branch 5018:5083 into trunk
[simgrid.git] / src / xbt / dict.c
index 4422f9d..378bdbf 100644 (file)
@@ -165,11 +165,11 @@ 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) {
+                     void_f_pvoid_t   free_ctn) {
 
   unsigned int hash_code;
   xbt_dictelm_t current, previous = NULL;
@@ -217,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);
   
@@ -301,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;
 }
 
 
@@ -438,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);
@@ -448,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;
@@ -464,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;
   }
 }