#include "gras_private.h"
-GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(set,GRAS);
+GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(set,tbx);
/*####[ Type definition ]####################################################*/
struct gras_set_ {
elm->name_len = strlen(elm->name);
}
- errcode = gras_dict_retrieve_ext (set->dict,
+ errcode = gras_dict_get_ext (set->dict,
elm->name, elm->name_len,
(void**) &found_in_dict);
if (errcode == no_error) {
- elm->ID=found_in_dict->ID;
- DEBUG2("Reinsertion of key %s (id %d)", elm->name, elm->ID);
- TRY(gras_dict_insert_ext(set->dict, elm->name, elm->name_len, elm, free_func));
- TRY(gras_dynar_set(set->dynar, elm->ID, &elm));
- return no_error;
-
+ if (elm == found_in_dict) {
+ DEBUG2("Ignoring request to insert the same element twice (key %s ; id %d)",
+ elm->name, elm->ID);
+ return no_error;
+ } else {
+ elm->ID=found_in_dict->ID;
+ DEBUG2("Reinsertion of key %s (id %d)", elm->name, elm->ID);
+ TRY(gras_dict_set_ext(set->dict, elm->name, elm->name_len, elm, free_func));
+ TRY(gras_dynar_set(set->dynar, elm->ID, &elm));
+ return no_error;
+ }
} else if (errcode != mismatch_error) {
return errcode; /* I expected mismatch_error */
}
elm->ID = gras_dynar_length( set->dynar );
- TRY(gras_dict_insert_ext(set->dict, elm->name, elm->name_len, elm, free_func));
+ TRY(gras_dict_set_ext(set->dict, elm->name, elm->name_len, elm, free_func));
TRY(gras_dynar_set(set->dynar, elm->ID, &elm));
- DEBUG2("Insertion of key %s (id %d)", elm->name, elm->ID);
+ DEBUG2("Insertion of key '%s' (id %d)", elm->name, elm->ID);
return no_error;
}
* @name: Name of the searched cell
* @dst: where to put the found data into
*
- * Retrieve a data stored in the cell by providing its name.
+ * get a data stored in the cell by providing its name.
*/
gras_error_t gras_set_get_by_name (gras_set_t *set,
const char *name,
/* OUT */gras_set_elm_t **dst) {
-
- return gras_dict_retrieve_ext(set->dict, name, strlen(name), (void**) dst);
+ gras_error_t errcode;
+ errcode = gras_dict_get_ext(set->dict, name, strlen(name), (void**) dst);
+ DEBUG2("Lookup key %s: %s",name,gras_error_name(errcode));
+ return errcode;
}
/**
* gras_set_get_by_name_ext:
* @name_len: length of the name, when strlen cannot be trusted
* @dst: where to put the found data into
*
- * Retrieve a data stored in the cell by providing its name (and the length
+ * get a data stored in the cell by providing its name (and the length
* of the name, when strlen cannot be trusted because you don't use a char*
* as name, you weird guy).
*/
int name_len,
/* OUT */gras_set_elm_t **dst) {
- return gras_dict_retrieve_ext (set->dict, name, name_len, (void**)dst);
+ return gras_dict_get_ext (set->dict, name, name_len, (void**)dst);
}
/**
* @name_len: length of the name, when strlen cannot be trusted
* @dst: where to put the found data into
*
- * Retrieve a data stored in the cell by providing its name (and the length
+ * get a data stored in the cell by providing its name (and the length
* of the name, when strlen cannot be trusted because you don't use a char*
* as name, you weird guy).
*/
if (id < gras_dynar_length(set->dynar) &&
id >= 0) {
gras_dynar_get(set->dynar,id,dst);
-
+ DEBUG3("Lookup type of id %d (of %d): %s",
+ id, gras_dynar_length(set->dynar), (*dst)->name);
+
} else {
DEBUG1("Cannot get ID %d: out of bound", id);
return mismatch_error;