X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9f091df92f0ee7966a3a75ff8461a134c93214a9..169edc40a9d6aac50da8647a98df1e2b7cd92727:/src/xbt/dict_cursor.c diff --git a/src/xbt/dict_cursor.c b/src/xbt/dict_cursor.c index 3dc52dc01a..ee1bfb44de 100644 --- a/src/xbt/dict_cursor.c +++ b/src/xbt/dict_cursor.c @@ -8,12 +8,13 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/misc.h" +#include "xbt/ex.h" #include "dict_private.h" #include /* strlen() */ -XBT_LOG_EXTERNAL_CATEGORY(dict); -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dict_cursor,dict,"To traverse dictionaries"); +XBT_LOG_EXTERNAL_CATEGORY(xbt_dict); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dict_cursor,xbt_dict,"To traverse dictionaries"); /*####[ Dict cursor functions ]#############################################*/ @@ -64,7 +65,7 @@ xbt_dict_cursor_free(xbt_dict_cursor_t *cursor) { if (*cursor) { xbt_dynar_free(&((*cursor)->keys)); xbt_dynar_free(&((*cursor)->key_lens)); - xbt_free(*cursor); + free(*cursor); *cursor = NULL; } } @@ -73,16 +74,13 @@ xbt_dict_cursor_free(xbt_dict_cursor_t *cursor) { * Sanity check to see if the head contains something */ static _XBT_INLINE -xbt_error_t +void __cursor_not_null(xbt_dict_cursor_t cursor) { xbt_assert0(cursor, "Null cursor"); - if (!cursor->head) { - return mismatch_error; - } - - return no_error; + if (!cursor->head) + THROW0(arg_error,0,"Null headed cursor"); } @@ -94,9 +92,9 @@ _cursor_push_keys(xbt_dict_cursor_t cursor, int i = 0; static volatile int count = 0; /* ??? */ - CDEBUG1(dict_cursor, "Push childs of %p in the cursor", (void*)elm); + CDEBUG3(xbt_dict_cursor, "Push childs of %p (%.*s) in the cursor", (void*)elm, elm->key_len, elm->key); - if (elm->content) { + if (!elm->internal) { xbt_dynar_push(cursor->keys, &elm->key ); xbt_dynar_push(cursor->key_lens, &elm->key_len); count++; @@ -107,14 +105,14 @@ _cursor_push_keys(xbt_dict_cursor_t cursor, _cursor_push_keys(cursor, child); } - CDEBUG1(dict_cursor, "Count = %d", count); + CDEBUG1(xbt_dict_cursor, "Count = %d", count); } /** @brief Reinitialize the cursor. Mandatory after removal or add in dict. */ void xbt_dict_cursor_rewind(xbt_dict_cursor_t cursor) { - CDEBUG0(dict_cursor, "xbt_dict_cursor_rewind"); + CDEBUG0(xbt_dict_cursor, "xbt_dict_cursor_rewind"); xbt_assert(cursor); xbt_dynar_reset(cursor->keys); @@ -155,6 +153,9 @@ void xbt_dict_cursor_step(xbt_dict_cursor_t cursor) { xbt_assert(cursor); + DEBUG2("step cursor. Current=%.*s", + xbt_dynar_get_as(cursor->key_lens,cursor->pos_len,int), + xbt_dynar_get_as(cursor->keys,cursor->pos,char *)); xbt_dynar_cursor_step(cursor->keys, &cursor->pos); xbt_dynar_cursor_step(cursor->key_lens, &cursor->pos_len); } @@ -166,10 +167,10 @@ xbt_dict_cursor_step(xbt_dict_cursor_t cursor) { */ int xbt_dict_cursor_get_or_free(xbt_dict_cursor_t *cursor, - char **key, - void **data) { - xbt_error_t errcode = no_error; - int key_len = 0; + char **key, + void **data) { + int key_len = 0; + xbt_ex_t e; if (!cursor || !(*cursor)) return FALSE; @@ -182,56 +183,47 @@ xbt_dict_cursor_get_or_free(xbt_dict_cursor_t *cursor, *key = xbt_dynar_get_as((*cursor)->keys, (*cursor)->pos, char*); key_len = xbt_dynar_get_as((*cursor)->key_lens, (*cursor)->pos_len, int); - errcode = xbt_dictelm_get_ext((*cursor)->head, *key, key_len, data); - if (errcode == mismatch_error) { - xbt_dict_cursor_free(cursor); - return FALSE; + TRY { + *data = xbt_dictelm_get_ext((*cursor)->head, *key, key_len); + } CATCH(e) { + if (e.category == mismatch_error) { + xbt_dict_cursor_free(cursor); + xbt_ex_free(e); + return FALSE; + } + RETHROW; } - - xbt_assert1(errcode == no_error, - "Unexpected problem while retrieving the content of cursor. Got %s", - xbt_error_name(errcode)); - return TRUE; } /** * @brief Get current key * @param cursor: the cursor - * @param key where to put the key + * @returns the current key */ -xbt_error_t -xbt_dict_cursor_get_key(xbt_dict_cursor_t cursor, - /*OUT*/char **key) { - xbt_error_t errcode = no_error; +char * +xbt_dict_cursor_get_key(xbt_dict_cursor_t cursor) { + __cursor_not_null(cursor); - TRY(__cursor_not_null(cursor)); - - *key = xbt_dynar_get_as(cursor->keys, cursor->pos - 1, char*); - - return errcode; + return xbt_dynar_get_as(cursor->keys, cursor->pos - 1, char*); } /** * @brief Get current data * @param cursor the cursor - * @param data where to put the data + * @returns the current data */ -xbt_error_t -xbt_dict_cursor_get_data(xbt_dict_cursor_t cursor, - /*OUT*/void **data) { - xbt_error_t errcode = no_error; +void * +xbt_dict_cursor_get_data(xbt_dict_cursor_t cursor) { char *key = NULL; int key_len = 0; - TRY(__cursor_not_null(cursor)); + __cursor_not_null(cursor); key = xbt_dynar_get_as(cursor->keys, cursor->pos-1, char *); key_len = xbt_dynar_get_as(cursor->key_lens, cursor->pos_len-1, int); - TRY(xbt_dictelm_get_ext(cursor->head, key, key_len, data)); - - return errcode; + return xbt_dictelm_get_ext(cursor->head, key, key_len); }