X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f780443504c3b73f0b9d1c58c6c5a21e2affce2d..64561039d3dec9e50b4eaf1b78b3edef71898383:/src/xbt/config.c diff --git a/src/xbt/config.c b/src/xbt/config.c index 56213d5a16..cd6cfbc63a 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -21,12 +21,39 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support"); +/* xbt_cfgelm_t: the typedef corresponding to a config variable. + + Both data and DTD are mixed, but fixing it now would prevent me to ever + defend my thesis. */ + +typedef struct { + /* Description */ + char *desc; + + /* Allowed type of the variable */ + e_xbt_cfgelm_type_t type; + int min, max; + int isdefault:1; + + /* Callbacks */ + xbt_cfg_cb_t cb_set; + xbt_cfg_cb_t cb_rm; + + /* actual content + (cannot be an union because type peer uses both str and i) */ + xbt_dynar_t content; +} s_xbt_cfgelm_t, *xbt_cfgelm_t; + static const char *xbt_cfgelm_type_name[xbt_cfgelm_type_count] = { "int", "double", "string", "peer", "any" }; /* Internal stuff used in cache to free a variable */ static void xbt_cfgelm_free(void *data); +/* Retrieve the variable we'll modify */ +static xbt_cfgelm_t xbt_cfgelm_get(xbt_cfg_t cfg, const char *name, + e_xbt_cfgelm_type_t type); + /*----[ Memory management ]-----------------------------------------------*/ /** @brief Constructor @@ -310,17 +337,30 @@ void xbt_cfg_register_str(xbt_cfg_t * cfg, const char *entry) free(entrycpy); /* strdup'ed by dict mechanism, but cannot be const */ } +static int strcmp_voidp(const void *pa, const void *pb) +{ + return strcmp(*(const char **)pa, *(const char **)pb); +} + /** @brief Displays the declared options and their description */ void xbt_cfg_help(xbt_cfg_t cfg) { - xbt_dict_cursor_t cursor; + xbt_dict_cursor_t dict_cursor; + unsigned int dynar_cursor; xbt_cfgelm_t variable; char *name; + xbt_dynar_t names = xbt_dynar_new(sizeof(char *), NULL); - int i; - int size; + xbt_dict_foreach((xbt_dict_t )cfg, dict_cursor, name, variable) { + xbt_dynar_push(names, &name); + } + xbt_dynar_sort(names, strcmp_voidp); + + xbt_dynar_foreach(names, dynar_cursor, name) { + int i; + int size; + variable = xbt_dict_get((xbt_dict_t )cfg, name); - xbt_dict_foreach((xbt_dict_t) cfg, cursor, name, variable) { printf(" %s: %s\n", name, variable->desc); printf(" Type: %s; ", xbt_cfgelm_type_name[variable->type]); if (variable->min != 1 || variable->max != 1) { @@ -372,6 +412,8 @@ void xbt_cfg_help(xbt_cfg_t cfg) } } + + xbt_dynar_free(&names); } /** @brief Check that each variable have the right amount of values */ @@ -407,7 +449,7 @@ void xbt_cfg_check(xbt_cfg_t cfg) xbt_dict_cursor_free(&cursor); } -xbt_cfgelm_t xbt_cfgelm_get(xbt_cfg_t cfg, +static xbt_cfgelm_t xbt_cfgelm_get(xbt_cfg_t cfg, const char *name, e_xbt_cfgelm_type_t type) { @@ -609,8 +651,8 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) } *(val++) = '\0'; - if(strcmp(name,"simix/context")) - INFO2("Configuration change: Set '%s' to '%s'", name, val); + if (strcmp(name,"contexts/factory")) + INFO2("Configuration change: Set '%s' to '%s'", name, val); TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); @@ -1118,6 +1160,14 @@ void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) xbt_dynar_reset(variable->content); } } +/* + * Say if the value is the default value + */ +int xbt_cfg_is_default_value(xbt_cfg_t cfg, const char *name) +{ + xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_any); + return variable->isdefault; +} /*----[ Getting ]---------------------------------------------------------*/