X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3d0d626e19a7b79320e7d922c9c1dcf122076cea..505fa6b336fedfbe5951b01dc5c49f8c3f54e177:/src/xbt/dict_cursor.c diff --git a/src/xbt/dict_cursor.c b/src/xbt/dict_cursor.c index ba7812823a..4a2986b620 100644 --- a/src/xbt/dict_cursor.c +++ b/src/xbt/dict_cursor.c @@ -2,272 +2,186 @@ /* dict_cursor - iterators over dictionnaries */ -/* Authors: Martin Quinson */ -/* Copyright (C) 2003,2004 Martin Quinson. */ +/* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "gras_private.h" +#include "xbt/misc.h" +#include "xbt/ex.h" #include "dict_private.h" #include /* strlen() */ -GRAS_LOG_EXTERNAL_CATEGORY(dict); -GRAS_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 ]#############################################*/ /* To traverse (simple) dicts */ /* Don't add or remove entries to the dict while traversing !!! */ /*###########################################################################*/ -struct gras_dict_cursor_ { - /* we store all level encountered until here, to backtrack on next() */ - gras_dynar_t *keys; - gras_dynar_t *key_lens; - int pos; - int pos_len; - gras_dictelm_t *head; +struct xbt_dict_cursor_ { + xbt_dictelm_t current; + int line; + xbt_dict_t dict; }; -static _GRAS_INLINE void -_cursor_push_keys(gras_dict_cursor_t *p_cursor, - gras_dictelm_t *p_elm); +#undef xbt_dict_CURSOR_DEBUG +/*#define xbt_dict_CURSOR_DEBUG 1*/ -#undef gras_dict_CURSOR_DEBUG -/*#define gras_dict_CURSOR_DEBUG 1*/ - -/** - * gras_dict_cursor_new: - * - * @head: the head of the dict - * @cursor: the curent position in the dict - * - * Structure creator +/** @brief Creator + * @param dict the dict */ -void -gras_dict_cursor_new(const gras_dict_t *p_head, - /*OUT*/gras_dict_cursor_t **pp_cursor) { - gras_error_t errcode = no_error; - gras_dict_cursor_t *p_cursor = NULL; +xbt_dict_cursor_t xbt_dict_cursor_new(const xbt_dict_t dict) { + xbt_dict_cursor_t res = NULL; - p_cursor = gras_new(gras_dict_cursor_t,1); + res = xbt_new(s_xbt_dict_cursor_t, 1); + res->dict = dict; - gras_dynar_new(&p_cursor->keys, sizeof(char **), NULL); - gras_dynar_new(&p_cursor->key_lens, sizeof(int *), NULL); - - p_cursor->pos = 0; - p_cursor->pos_len = 0; - p_cursor->head = p_head ? p_head->head : NULL; - - gras_dict_cursor_rewind(p_cursor); - - *pp_cursor = p_cursor; + xbt_dict_cursor_rewind(res); + return res; } /** - * gras_dict_cursor_free: - * - * @cursor: poor victim - * - * Structure destructor + * @brief Destructor + * @param cursor poor victim */ -void -gras_dict_cursor_free(gras_dict_cursor_t *p_cursor) { - if (p_cursor) { - gras_dynar_free(p_cursor->keys); - gras_dynar_free(p_cursor->key_lens); - memset(p_cursor, 0, sizeof(gras_dict_cursor_t)); - gras_free(p_cursor); +void xbt_dict_cursor_free(xbt_dict_cursor_t *cursor) { + if (*cursor) { + xbt_free(*cursor); + *cursor = NULL; } } -/** - * __cursor_not_null: - * +/* * Sanity check to see if the head contains something */ -static _GRAS_INLINE -gras_error_t -__cursor_not_null(gras_dict_cursor_t *p_cursor) { - - gras_assert0(p_cursor, "Null cursor"); - - if (!p_cursor->head) { - return mismatch_error; - } - - return no_error; +static XBT_INLINE void __cursor_not_null(xbt_dict_cursor_t cursor) { + xbt_assert0(cursor, "Null cursor"); } -static _GRAS_INLINE -void -_cursor_push_keys(gras_dict_cursor_t *p_cursor, - gras_dictelm_t *p_elm) { - gras_error_t errcode = no_error; - gras_dictelm_t *p_child = NULL; - int i = 0; - static volatile int count = 0; /* ??? */ +/** @brief Reinitialize the cursor. Mandatory after removal or add in dict. */ +void xbt_dict_cursor_rewind(xbt_dict_cursor_t cursor) { + CDEBUG0(xbt_dict_cursor, "xbt_dict_cursor_rewind"); + xbt_assert(cursor); - CDEBUG1(dict_cursor, "Push childs of %p in the cursor", (void*)p_elm); - - if (p_elm->content) { - gras_dynar_push(p_cursor->keys, &p_elm->key ); - gras_dynar_push(p_cursor->key_lens, &p_elm->key_len); - count++; + cursor->line = 0; + if (cursor->dict != NULL) { + cursor->current = cursor->dict->table[0]; } - - gras_dynar_foreach(p_elm->sub, i, p_child) { - if (p_child) - _cursor_push_keys(p_cursor, p_child); + else { + cursor->current = NULL; } - - CDEBUG1(dict_cursor, "Count = %d", count); } /** - * gras_dict_cursor_rewind: - * @cursor: the cursor - * @Returns: gras_error_t + * @brief Create the cursor if it does not exists. Rewind it in any case. * - * back to the first element + * @param dict on what to let the cursor iterate + * @param[out] cursor dest address */ -void -gras_dict_cursor_rewind(gras_dict_cursor_t *p_cursor) { - gras_error_t errcode = no_error; +void xbt_dict_cursor_first(const xbt_dict_t dict, + xbt_dict_cursor_t *cursor){ + DEBUG0("xbt_dict_cursor_first"); + if (!*cursor) { + DEBUG0("Create the cursor on first use"); + *cursor = xbt_dict_cursor_new(dict); + } + else { + xbt_dict_cursor_rewind(*cursor); + } + if (dict != NULL && (*cursor)->current == NULL) { + xbt_dict_cursor_step(*cursor); /* find the first element */ + } +} - CDEBUG0(dict_cursor, "gras_dict_cursor_rewind"); - gras_assert(p_cursor); - gras_dynar_reset(p_cursor->keys); - gras_dynar_reset(p_cursor->key_lens); +/** + * \brief Move to the next element. + */ +void xbt_dict_cursor_step(xbt_dict_cursor_t cursor) { - if (!p_cursor->head) - return ; - _cursor_push_keys(p_cursor, p_cursor->head); + xbt_dictelm_t current ; + int line; - gras_dynar_cursor_first(p_cursor->keys, &p_cursor->pos ); - gras_dynar_cursor_first(p_cursor->key_lens, &p_cursor->pos_len); + DEBUG0("xbt_dict_cursor_step"); + xbt_assert(cursor); -} + current = cursor->current; + line = cursor->line; -/** - * gras_dict_cursor_first: - * @dict: on what to let the cursor iterate - * @cursor: dest address - * - * Create the cursor if it does not exists. Rewind it in any case. - */ -void gras_dict_cursor_first (const gras_dict_t *dict, - gras_dict_cursor_t **cursor){ + if (cursor->dict != NULL) { - if (!*cursor) { - DEBUG0("Create the cursor on first use"); - gras_dict_cursor_new(dict,cursor); + if (current != NULL) { + DEBUG0("current is not null, take the next element"); + current = current->next; + DEBUG1("next element: %p", current); + } + + while (current == NULL && ++line <= cursor->dict->table_size) { + DEBUG0("current is NULL, take the next line"); + current = cursor->dict->table[line]; + DEBUG1("element in the next line: %p", current); + } + DEBUG2("search finished, current = %p, line = %d", current, line); + + cursor->current = current; + cursor->line = line; } - - gras_dict_cursor_rewind(*cursor); } - /** - * gras_dict_cursor_step: - * @cursor: the cursor + * @brief Get current data, or free the cursor if there is no data left * - * Move to the next element. + * @returns true if it's ok, false if there is no more data */ -void -gras_dict_cursor_step(gras_dict_cursor_t *p_cursor) { - gras_assert(p_cursor); +int xbt_dict_cursor_get_or_free(xbt_dict_cursor_t *cursor, + char **key, + void **data) { - gras_dynar_cursor_step(p_cursor->keys, &p_cursor->pos); - gras_dynar_cursor_step(p_cursor->key_lens, &p_cursor->pos_len); -} + xbt_dictelm_t current; -/** - * gras_dict_cursor_get_or_free: - * @cursor: the cursor - * @Returns: true if it's ok, false if there is no more data - * - * Get current data - */ -int -gras_dict_cursor_get_or_free(gras_dict_cursor_t **cursor, - char **key, - void **data) { - gras_error_t errcode = no_error; - int key_len = 0; - - if (!cursor || !(*cursor)) - return FALSE; + DEBUG0("xbt_dict_get_or_free"); - if (gras_dynar_length((*cursor)->keys) <= (*cursor)->pos) { - gras_dict_cursor_free(*cursor); - *cursor=NULL; + + if (!cursor || !(*cursor)) return FALSE; - } - - gras_dynar_get((*cursor)->keys, (*cursor)->pos, key ); - gras_dynar_get((*cursor)->key_lens, (*cursor)->pos_len, &key_len); - errcode = gras_dictelm_get_ext((*cursor)->head, *key, key_len, data); - if (errcode == mismatch_error) { - gras_dict_cursor_free(*cursor); - *cursor=NULL; + current = (*cursor)->current; + if (current == NULL) { /* no data left */ + xbt_dict_cursor_free(cursor); return FALSE; } - - gras_assert1(errcode == no_error, - "Unexpected problem while retrieving the content of cursor. Got %s", - gras_error_name(errcode)); - + + *key = current->key; + *data = current->content; return TRUE; } /** - * gras_dict_cursor_get_key: - * @cursor: the cursor - * @key: the current element - * @Returns: gras_error_t - * - * Get current key + * @brief Get current key + * @param cursor: the cursor + * @returns the current key */ -gras_error_t -gras_dict_cursor_get_key(gras_dict_cursor_t *p_cursor, - /*OUT*/char **key) { - gras_error_t errcode = no_error; - - TRY(__cursor_not_null(p_cursor)); +char *xbt_dict_cursor_get_key(xbt_dict_cursor_t cursor) { + __cursor_not_null(cursor); - gras_dynar_get(p_cursor->keys, p_cursor->pos - 1, key); - - return errcode; + return cursor->current->key; } /** - * gras_dict_cursor_get_data: - * @cursor: the cursor - * - * Get current data + * @brief Get current data + * @param cursor the cursor + * @returns the current data */ -gras_error_t -gras_dict_cursor_get_data(gras_dict_cursor_t *p_cursor, - /*OUT*/void **data) { - gras_error_t errcode = no_error; - char *key = NULL; - int key_len = 0; - - TRY(__cursor_not_null(p_cursor)); - - gras_dynar_get(p_cursor->keys, p_cursor->pos-1, &key ); - gras_dynar_get(p_cursor->key_lens, p_cursor->pos_len-1, &key_len); - - TRY(gras_dictelm_get_ext(p_cursor->head, key, key_len, data)); +void *xbt_dict_cursor_get_data(xbt_dict_cursor_t cursor) { + __cursor_not_null(cursor); - return errcode; + return cursor->current->content; }