X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f783ed4680c6862a1b7543237e89d1221334bae0..00255adf47970918999b2b4495ce8a69b036e68a:/src/xbt/config.c diff --git a/src/xbt/config.c b/src/xbt/config.c index a9071df134..39b4262834 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -64,7 +64,7 @@ static xbt_cfgelm_t xbt_cfgelm_get(xbt_cfg_t cfg, const char *name, xbt_cfg_t xbt_cfg_new(void) { - return (xbt_cfg_t) xbt_dict_new(); + return (xbt_cfg_t) xbt_dict_new_homogeneous(&xbt_cfgelm_free); } /** \brief Copy an existing configuration set @@ -263,7 +263,7 @@ xbt_cfg_register(xbt_cfg_t * cfg, XBT_ERROR("%d is an invalide type code", type); } - xbt_dict_set((xbt_dict_t) * cfg, name, res, &xbt_cfgelm_free); + xbt_dict_set((xbt_dict_t) * cfg, name, res, NULL); } /** @brief Unregister an element from a config set. @@ -589,7 +589,7 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) double d; char *str; - xbt_cfgelm_t variable = NULL; + volatile xbt_cfgelm_t variable = NULL; char *optionlist_cpy; char *option, *name, *val; @@ -660,10 +660,17 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); - name = xbt_strdup(name); - free(optionlist_cpy); - THROWF(not_found_error, 0, - "No registered variable corresponding to '%s'.", name); + TRY { + THROWF(not_found_error, 0, + "No registered variable corresponding to '%s'.", name); + } + TRY_CLEANUP { + /* name points into optionlist_cpy, it cannot be freed before */ + free(optionlist_cpy); + } + CATCH_ANONYMOUS { + RETHROW; + } } free(optionlist_cpy); RETHROW; @@ -821,8 +828,8 @@ void xbt_cfg_set_int(xbt_cfg_t cfg, const char *name, int val) variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_int); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -837,7 +844,7 @@ void xbt_cfg_set_int(xbt_cfg_t cfg, const char *name, int val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -856,8 +863,8 @@ void xbt_cfg_set_double(xbt_cfg_t cfg, const char *name, double val) variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_double); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -871,7 +878,7 @@ void xbt_cfg_set_double(xbt_cfg_t cfg, const char *name, double val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -895,9 +902,9 @@ void xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val) xbt_cfgelm_type_name[variable->type], variable->type, variable); if (variable->max == 1) { - if (xbt_dynar_length(variable->content)) { + if (!xbt_dynar_is_empty(variable->content)) { if (variable->cb_rm) - (*variable->cb_rm) (name, 0); + variable->cb_rm(name, 0); else if (variable->type == xbt_cfgelm_string) { char *sval = xbt_dynar_get_as(variable->content, 0, char *); free(sval); @@ -916,7 +923,7 @@ void xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -942,8 +949,8 @@ xbt_cfg_set_peer(xbt_cfg_t cfg, const char *name, const char *peer, variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_peer); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -957,7 +964,7 @@ xbt_cfg_set_peer(xbt_cfg_t cfg, const char *name, const char *peer, } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -986,7 +993,7 @@ void xbt_cfg_rm_int(xbt_cfg_t cfg, const char *name, int val) xbt_dynar_foreach(variable->content, cpt, seen) { if (seen == val) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1021,7 +1028,7 @@ void xbt_cfg_rm_double(xbt_cfg_t cfg, const char *name, double val) if (seen == val) { xbt_dynar_cursor_rm(variable->content, &cpt); if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); return; } } @@ -1053,7 +1060,7 @@ void xbt_cfg_rm_string(xbt_cfg_t cfg, const char *name, const char *val) xbt_dynar_foreach(variable->content, cpt, seen) { if (!strcpy(seen, val)) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1090,7 +1097,7 @@ xbt_cfg_rm_peer(xbt_cfg_t cfg, const char *name, const char *peer, xbt_dynar_foreach(variable->content, cpt, seen) { if (!strcpy(seen->name, peer) && seen->port == port) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1116,7 +1123,7 @@ void xbt_cfg_rm_at(xbt_cfg_t cfg, const char *name, int pos) pos, name, variable->min); if (variable->cb_rm) - (*variable->cb_rm) (name, pos); + variable->cb_rm(name, pos); xbt_dynar_remove_at(variable->content, pos, NULL); } @@ -1149,7 +1156,7 @@ void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) unsigned int cpt; void *ignored; xbt_dynar_foreach(variable->content, cpt, ignored) { - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); } } xbt_dynar_reset(variable->content); @@ -1238,7 +1245,7 @@ char *xbt_cfg_get_string(xbt_cfg_t cfg, const char *name) XBT_WARN ("You asked for the first value of the config element '%s', but there is %lu values\n", name, xbt_dynar_length(variable->content)); - } else if (xbt_dynar_length(variable->content) == 0) { + } else if (xbt_dynar_is_empty(variable->content)) { return NULL; }