X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/97e83f57d51ddc111fca108acfaca4443730126f..66ad9903ba702428fa0ba27d22259bd0dd50c03b:/src/xbt/config.c diff --git a/src/xbt/config.c b/src/xbt/config.c index 9e06f582c8..b84c29ec44 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -33,7 +33,7 @@ typedef struct { /* Allowed type of the variable */ e_xbt_cfgelm_type_t type; - int min, max; + int min; unsigned isdefault:1; /* Callbacks */ @@ -87,7 +87,7 @@ void xbt_cfg_cpy(xbt_cfg_t tocopy, xbt_cfg_t * whereto) xbt_assert(tocopy, "cannot copy NULL config"); xbt_dict_foreach((xbt_dict_t) tocopy, cursor, name, variable) { - xbt_cfg_register(whereto, name, variable->desc, variable->type, variable->min, variable->max, variable->cb_set); + xbt_cfg_register(whereto, name, variable->desc, variable->type, variable->min, variable->cb_set); } } @@ -123,8 +123,8 @@ void xbt_cfg_dump(const char *name, const char *indent, xbt_cfg_t cfg) printf("%s %s:", indent, key); size = xbt_dynar_length(variable->content); - printf ("%d_to_%d_%s. Actual size=%d. postset=%p, List of values:\n", - variable->min, variable->max, xbt_cfgelm_type_name[variable->type], size, variable->cb_set); + printf ("%d_%s. Actual size=%d. postset=%p, List of values:\n", + variable->min, xbt_cfgelm_type_name[variable->type], size, variable->cb_set); switch (variable->type) { case xbt_cfgelm_int: @@ -190,12 +190,10 @@ void xbt_cfgelm_free(void *data) * @param name the name of the config element * @param desc a description for this item (used by xbt_cfg_help()) * @param type the type of the config element - * @param min the minimum number of values for this config element - * @param max the maximum number of values for this config element + * @param min the minimum number of values for this config element (0 for optional elements) * @param cb_set callback function called when a value is set */ -void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt_cfgelm_type_t type, int min, - int max, xbt_cfg_cb_t cb_set) +void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt_cfgelm_type_t type, int min, xbt_cfg_cb_t cb_set) { if (*cfg == NULL) *cfg = xbt_cfg_new(); @@ -207,13 +205,12 @@ void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt xbt_assert(NULL == res, "Refusing to register the config element '%s' twice.", name); res = xbt_new(s_xbt_cfgelm_t, 1); - XBT_DEBUG("Register cfg elm %s (%s) (%d to %d %s (=%d) @%p in set %p)", - name, desc, min, max, xbt_cfgelm_type_name[type], (int)type, res, *cfg); + XBT_DEBUG("Register cfg elm %s (%s) (%d %s (=%d) @%p in set %p)", + name, desc, min, xbt_cfgelm_type_name[type], (int)type, res, *cfg); res->desc = xbt_strdup(desc); res->type = type; res->min = min; - res->max = max; res->cb_set = cb_set; res->isdefault = 1; @@ -238,19 +235,19 @@ void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt } void xbt_cfg_register_double(const char *name, const char *desc, double default_value,xbt_cfg_cb_t cb_set){ - xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_double,1,1,cb_set); + xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_double,1,cb_set); xbt_cfg_setdefault_double(name, default_value); } void xbt_cfg_register_int(const char *name, const char *desc, int default_value,xbt_cfg_cb_t cb_set){ - xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_int,1,1,cb_set); + xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_int,1,cb_set); xbt_cfg_setdefault_int(name, default_value); } void xbt_cfg_register_string(const char *name, const char *desc, const char *default_value, xbt_cfg_cb_t cb_set){ - xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_string,1,1,cb_set); + xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_string,1,cb_set); xbt_cfg_setdefault_string(name, default_value); } void xbt_cfg_register_boolean(const char *name, const char *desc, const char*default_value,xbt_cfg_cb_t cb_set){ - xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_boolean,1,1,cb_set); + xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_boolean,1,cb_set); xbt_cfg_setdefault_boolean(name, default_value); } @@ -271,27 +268,12 @@ void xbt_cfg_register_alias(const char *newname, const char *oldname) res->desc = bprintf("Deprecated alias for %s",newname); res->type = xbt_cfgelm_alias; res->min = 1; - res->max = 1; res->isdefault = 1; res->content = (xbt_dynar_t)newname; xbt_dict_set(simgrid_config, oldname, res, NULL); } -/** @brief Unregister an element from a config set. - * - * @param cfg the config set - * @param name the name of the element to be freed - * - * Note that it removes both the description and the actual content. - * Throws not_found when no such element exists. - */ -void xbt_cfg_unregister(xbt_cfg_t cfg, const char *name) -{ - XBT_DEBUG("Unregister elm '%s' from set %p", name, cfg); - xbt_dict_remove((xbt_dict_t) cfg, name); -} - /** * @brief Parse a string and register the stuff described. * @@ -309,7 +291,7 @@ void xbt_cfg_register_str(xbt_cfg_t * cfg, const char *entry) char *entrycpy = xbt_strdup(entry); char *tok; - int min, max; + int min; e_xbt_cfgelm_type_t type; XBT_DEBUG("Register string '%s'", entry); @@ -320,13 +302,6 @@ void xbt_cfg_register_str(xbt_cfg_t * cfg, const char *entry) min = strtol(tok, &tok, 10); xbt_assert(tok, "Invalid minimum in config element descriptor %s", entry); - xbt_assert(strcmp(tok, "_to_"), "Invalid config element descriptor : %s%s", - entry, "; Should be :_to__"); - tok += strlen("_to_"); - - max = strtol(tok, &tok, 10); - xbt_assert(tok, "Invalid maximum in config element descriptor %s", entry); - xbt_assert(*tok == '_', "Invalid config element descriptor: %s%s", entry, "; Should be :_to__"); tok++; @@ -335,7 +310,7 @@ void xbt_cfg_register_str(xbt_cfg_t * cfg, const char *entry) xbt_assert(type < xbt_cfgelm_type_count, "Invalid type in config element descriptor: %s%s", entry, "; Should be one of 'string', 'int' or 'double'."); - xbt_cfg_register(cfg, entrycpy, NULL, type, min, max, NULL); + xbt_cfg_register(cfg, entrycpy, NULL, type, min, NULL); free(entrycpy); /* strdup'ed by dict mechanism, but cannot be const */ } @@ -383,13 +358,8 @@ void xbt_cfg_help(xbt_cfg_t cfg) printf(" %s: %s\n", name, variable->desc); printf(" Type: %s; ", xbt_cfgelm_type_name[variable->type]); - if (variable->min != 1 || variable->max != 1) { - printf("Arity: min:%d to max:", variable->min); - if (variable->max == 0) - printf("(no bound); "); - else - printf("%d; ", variable->max); - } + if (variable->min != 1) + printf("Arity: min:%d", variable->min); size = xbt_dynar_length(variable->content); printf("Current value%s: ", (size <= 1 ? "" : "s")); @@ -419,6 +389,7 @@ void xbt_cfg_help(xbt_cfg_t cfg) } default: printf("Invalid type!!%s", sep); + break; } } } @@ -448,12 +419,6 @@ void xbt_cfg_check(void) THROWF(mismatch_error, 0, "Config elem %s theoretically accepts %d %s, but has a default of %d values.", name, variable->min, xbt_cfgelm_type_name[variable->type], size); } - - if (variable->max > 0 && variable->max < size) { - xbt_dict_cursor_free(&cursor); - THROWF(mismatch_error, 0, "Config elem %s accepts at most %d %s, but there is %d values.", - name, variable->max, xbt_cfgelm_type_name[variable->type], size); - } } xbt_dict_cursor_free(&cursor); } @@ -772,15 +737,7 @@ void xbt_cfg_set_int(const char *name, int val) { xbt_cfgelm_t variable = xbt_cfgelm_get(simgrid_config, name, xbt_cfgelm_int); - if (variable->max == 1) { - xbt_dynar_set(variable->content, 0, &val); - } else { - if (variable->max && xbt_dynar_length(variable->content) == (unsigned long) variable->max) - THROWF(mismatch_error, 0, "Cannot add value %d to the config element %s since it's already full (size=%d)", - val, name, variable->max); - - xbt_dynar_push(variable->content, &val); - } + xbt_dynar_set(variable->content, 0, &val); if (variable->cb_set) variable->cb_set(name, xbt_dynar_length(variable->content) - 1); @@ -797,15 +754,7 @@ void xbt_cfg_set_double(const char *name, double val) { xbt_cfgelm_t variable = xbt_cfgelm_get(simgrid_config, name, xbt_cfgelm_double); - if (variable->max == 1) { - xbt_dynar_set(variable->content, 0, &val); - } else { - if (variable->max && xbt_dynar_length(variable->content) == variable->max) - THROWF(mismatch_error, 0, "Cannot add value %f to the config element %s since it's already full (size=%d)", - val, name, variable->max); - - xbt_dynar_push(variable->content, &val); - } + xbt_dynar_set(variable->content, 0, &val); if (variable->cb_set) variable->cb_set(name, xbt_dynar_length(variable->content) - 1); @@ -824,22 +773,13 @@ void xbt_cfg_set_string(const char *name, const char *val) char *newval = xbt_strdup(val); xbt_cfgelm_t variable = xbt_cfgelm_get(simgrid_config, name, xbt_cfgelm_string); - if (variable->max == 1) { - if (!xbt_dynar_is_empty(variable->content)) { - char *sval = xbt_dynar_get_as(variable->content, 0, char *); - free(sval); - } - - xbt_dynar_set(variable->content, 0, &newval); - } else { - if (variable->max - && xbt_dynar_length(variable->content) == variable->max) - THROWF(mismatch_error, 0, "Cannot add value %s to the config element %s since it's already full (size=%d)", - name, val, variable->max); - - xbt_dynar_push(variable->content, &newval); + if (!xbt_dynar_is_empty(variable->content)) { + char *sval = xbt_dynar_get_as(variable->content, 0, char *); + free(sval); } + xbt_dynar_set(variable->content, 0, &newval); + if (variable->cb_set) variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; @@ -869,167 +809,13 @@ void xbt_cfg_set_boolean(const char *name, const char *val) xbt_die("Value of option '%s' not valid. Should be a boolean (yes,no,on,off,true,false,0,1)", val); } - if (variable->max == 1) { - xbt_dynar_set(variable->content, 0, &bval); - } else { - if (variable->max && xbt_dynar_length(variable->content) == (unsigned long) variable->max) - THROWF(mismatch_error, 0, "Cannot add value %s to the config element %s since it's already full (size=%d)", - val, name, variable->max); - - xbt_dynar_push(variable->content, &bval); - } + xbt_dynar_set(variable->content, 0, &bval); if (variable->cb_set) variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } -/* ---- [ Removing ] ---- */ -/** @brief Remove the provided \e val integer value from a variable - * - * @param cfg the config set - * @param name the name of the variable - * @param val the value to be removed - */ -void xbt_cfg_rm_int(xbt_cfg_t cfg, const char *name, int val) -{ - unsigned int cpt; - int seen; - - xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_int); - - if (xbt_dynar_length(variable->content) == variable->min) - THROWF(mismatch_error, 0, - "Cannot remove value %d from the config element %s since it's already at its minimal size (=%d)", - val, name, variable->min); - - xbt_dynar_foreach(variable->content, cpt, seen) { - if (seen == val) { - xbt_dynar_cursor_rm(variable->content, &cpt); - return; - } - } - THROWF(not_found_error, 0, "Can't remove the value %d of config element %s: value not found.", val, name); -} - -/** @brief Remove the provided \e val double value from a variable - * - * @param cfg the config set - * @param name the name of the variable - * @param val the value to be removed - */ -void xbt_cfg_rm_double(xbt_cfg_t cfg, const char *name, double val) -{ - unsigned int cpt; - double seen; - - xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_double); - - if (xbt_dynar_length(variable->content) == variable->min) - THROWF(mismatch_error, 0, - "Cannot remove value %f from the config element %s since it's already at its minimal size (=%d)", - val, name, variable->min); - - xbt_dynar_foreach(variable->content, cpt, seen) { - if (seen == val) { - xbt_dynar_cursor_rm(variable->content, &cpt); - return; - } - } - - THROWF(not_found_error, 0,"Can't remove the value %f of config element %s: value not found.", val, name); -} - -/** @brief Remove the provided \e val string value from a variable - * - * @param cfg the config set - * @param name the name of the variable - * @param val the value of the string which will be removed - */ -void xbt_cfg_rm_string(xbt_cfg_t cfg, const char *name, const char *val) -{ - unsigned int cpt; - char *seen; - xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_string); - - if (xbt_dynar_length(variable->content) == variable->min) - THROWF(mismatch_error, 0, - "Cannot remove value %s from the config element %s since it's already at its minimal size (=%d)", - name, val, variable->min); - - xbt_dynar_foreach(variable->content, cpt, seen) { - if (!strcpy(seen, val)) { - xbt_dynar_cursor_rm(variable->content, &cpt); - return; - } - } - - THROWF(not_found_error, 0, "Can't remove the value %s of config element %s: value not found.", val, name); -} - -/** @brief Remove the provided \e val boolean value from a variable - * - * @param cfg the config set - * @param name the name of the variable - * @param val the value to be removed - */ -void xbt_cfg_rm_boolean(xbt_cfg_t cfg, const char *name, int val) -{ - unsigned int cpt; - int seen; - xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean); - - if (xbt_dynar_length(variable->content) == variable->min) - THROWF(mismatch_error, 0, - "Cannot remove value %d from the config element %s since it's already at its minimal size (=%d)", - val, name, variable->min); - - xbt_dynar_foreach(variable->content, cpt, seen) { - if (seen == val) { - xbt_dynar_cursor_rm(variable->content, &cpt); - return; - } - } - - THROWF(not_found_error, 0, "Can't remove the value %d of config element %s: value not found.", val, name); -} - -/** @brief Remove the \e pos th value from the provided variable */ -void xbt_cfg_rm_at(xbt_cfg_t cfg, const char *name, int pos) -{ - xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_any); - - if (xbt_dynar_length(variable->content) == variable->min) - THROWF(mismatch_error, 0, - "Cannot remove %dth value from the config element %s since it's already at its minimal size (=%d)", - pos, name, variable->min); - - xbt_dynar_remove_at(variable->content, pos, NULL); -} - -/** @brief Remove all the values from a variable - * - * @param cfg the config set - * @param name the name of the variable - */ -void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) -{ - xbt_cfgelm_t variable = NULL; - xbt_ex_t e; - - TRY { - variable = xbt_dict_get((xbt_dict_t) cfg, name); - } CATCH(e) { - if (e.category != not_found_error) - RETHROW; - - xbt_ex_free(e); - THROWF(not_found_error, 0, "Can't empty '%s' since this option does not exist", name); - } - - if (variable) - xbt_dynar_reset(variable->content); -} /* Say if the value is the default value */ int xbt_cfg_is_default_value(const char *name) @@ -1191,9 +977,9 @@ static xbt_cfg_t make_set() xbt_cfg_t set = NULL; xbt_log_threshold_set(&_XBT_LOGV(xbt_cfg), xbt_log_priority_critical); - xbt_cfg_register_str(&set, "speed:1_to_2_int"); - xbt_cfg_register_str(&set, "peername:1_to_1_string"); - xbt_cfg_register_str(&set, "user:1_to_10_string"); + xbt_cfg_register_str(&set, "speed:1_int"); + xbt_cfg_register_str(&set, "peername:1_string"); + xbt_cfg_register_str(&set, "user:1_string"); return set; } /* end_of_make_set */ @@ -1204,7 +990,7 @@ XBT_TEST_UNIT("memuse", test_config_memuse, "Alloc and free a config set") { simgrid_config = make_set(); xbt_test_add("Alloc and free a config set"); - xbt_cfg_set_parse("peername:veloce user:mquinson\nuser:oaumage\tuser:alegrand"); + xbt_cfg_set_parse("peername:veloce user:bidule"); xbt_cfg_free(&simgrid_config); } @@ -1224,9 +1010,9 @@ XBT_TEST_UNIT("validation", test_config_validation, "Validation tests") } xbt_test_add("Having too much values of 'speed'"); - xbt_cfg_set_parse("peername:toto:42 user:alegrand"); + xbt_cfg_set_parse("peername:toto:42 user:machin"); TRY { - xbt_cfg_set_parse("speed:42 speed:24 speed:34"); + xbt_cfg_set_parse("speed:42 speed:24"); } CATCH(e) { if (e.category != mismatch_error || strncmp(e.msg, "Cannot add value 34 to the config elem speed", strlen("Config elem speed needs"))) @@ -1251,29 +1037,6 @@ XBT_TEST_UNIT("use", test_config_use, "Data retrieving tests") xbt_test_fail("Speed value = %d, I expected 42", ival); } - xbt_test_add("Get multiple values"); - { - /* get_multiple_value */ - xbt_dynar_t dyn; - - xbt_cfg_set_parse("peername:veloce user:foo\nuser:bar\tuser:toto"); - xbt_cfg_set_parse("speed:42"); - xbt_cfg_check(); - dyn = xbt_cfg_get_dynar("user"); - - if (xbt_dynar_length(dyn) != 3) - xbt_test_fail("Dynar length = %lu, I expected 3", xbt_dynar_length(dyn)); - - if (strcmp(xbt_dynar_get_as(dyn, 0, char *), "foo")) - xbt_test_fail("Dynar[0] = %s, I expected foo", xbt_dynar_get_as(dyn, 0, char *)); - - if (strcmp(xbt_dynar_get_as(dyn, 1, char *), "bar")) - xbt_test_fail("Dynar[1] = %s, I expected bar", xbt_dynar_get_as(dyn, 1, char *)); - - if (strcmp(xbt_dynar_get_as(dyn, 2, char *), "toto")) - xbt_test_fail("Dynar[2] = %s, I expected toto", xbt_dynar_get_as(dyn, 2, char *)); - } - xbt_test_add("Access to a non-existant entry"); { xbt_ex_t e;