defend my thesis. */
typedef struct {
+ /* Description */
+ const char *desc;
+
/* Allowed type of the variable */
e_xbt_cfgelm_type_t type;
int min, max;
xbt_assert0(tocopy, "cannot copy NULL config");
xbt_dict_foreach((xbt_dict_t) tocopy, cursor, name, variable) {
- xbt_cfg_register(*whereto, name, variable->type, variable->min,
+ xbt_cfg_register(*whereto, name, variable->desc, variable->type, variable->min,
variable->max, variable->cb_set, variable->cb_rm);
}
}
void
xbt_cfg_register(xbt_cfg_t cfg,
- const char *name, e_xbt_cfgelm_type_t type,
+ const char *name, const char *desc, e_xbt_cfgelm_type_t type,
int min, int max, xbt_cfg_cb_t cb_set, xbt_cfg_cb_t cb_rm)
{
xbt_cfgelm_t res;
}
res = xbt_new(s_xbt_cfgelm_t, 1);
- DEBUG7("Register cfg elm %s (%d to %d %s (=%d) @%p in set %p)",
- name, min, max, xbt_cfgelm_type_name[type], type, res, cfg);
+ DEBUG8("Register cfg elm %s (%s) (%d to %d %s (=%d) @%p in set %p)",
+ name, desc, min, max, xbt_cfgelm_type_name[type], type, res, cfg);
+ res->desc = desc;
res->type = type;
res->min = min;
res->max = max;
* The string may consist in several variable descriptions separated by a space.
* Each of them must use the following syntax: \<name\>:\<min nb\>_to_\<max nb\>_\<type\>
* with type being one of 'string','int', 'peer' or 'double'.
+ *
+ * @fixme: this does not allow to set the description
*/
void xbt_cfg_register_str(xbt_cfg_t cfg, const char *entry)
"Invalid type in config element descriptor: %s%s", entry,
"; Should be one of 'string', 'int', 'peer' or 'double'.");
- xbt_cfg_register(cfg, entrycpy, type, min, max, NULL, NULL);
+ xbt_cfg_register(cfg, entrycpy, NULL, type, min, max, NULL, NULL);
free(entrycpy); /* strdup'ed by dict mechanism, but cannot be const */
}
-/** @brief Check that each variable have the right amount of values */
+/** @brief Displays the declared options and their description */
+void xbt_cfg_help(xbt_cfg_t cfg) {
+ xbt_dict_cursor_t cursor;
+ xbt_cfgelm_t variable;
+ char *name;
+
+ int i;
+ int size;
+
+ 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)
+ printf("Arrity: min:%d to max:%d; ",variable->min,variable->max);
+ printf("Current value: ");
+ size = xbt_dynar_length(variable->content);
+
+ switch (variable->type) {
+ int ival;
+ char *sval;
+ double dval;
+ xbt_peer_t hval;
+
+ case xbt_cfgelm_int:
+ for (i = 0; i < size; i++) {
+ ival = xbt_dynar_get_as(variable->content, i, int);
+ printf("%s%d\n", (i==0?"":" "),ival);
+ }
+ break;
+
+ case xbt_cfgelm_double:
+ for (i = 0; i < size; i++) {
+ dval = xbt_dynar_get_as(variable->content, i, double);
+ printf("%s%f\n", (i==0?"":" "),dval);
+ }
+ break;
+
+ case xbt_cfgelm_string:
+ for (i = 0; i < size; i++) {
+ sval = xbt_dynar_get_as(variable->content, i, char *);
+ printf("%s'%s'\n", (i==0?"":" "),sval);
+ }
+ break;
+
+ case xbt_cfgelm_peer:
+ for (i = 0; i < size; i++) {
+ hval = xbt_dynar_get_as(variable->content, i, xbt_peer_t);
+ printf("%s%s:%d\n", (i==0?"":" "),hval->name, hval->port);
+ }
+ break;
+
+ default:
+ printf("Invalid type!!\n");
+ }
+
+ }
+}
+/** @brief Check that each variable have the right amount of values */
void xbt_cfg_check(xbt_cfg_t cfg)
{
xbt_dict_cursor_t cursor;
*
* \arg cfg config set to fill
* \arg options a string containing the content to add to the config set. This
- * is a '\\t',' ' or '\\n' separated list of variables. Each individual variable is
+ * is a '\\t',' ' or '\\n' or ',' separated list of variables. Each individual variable is
* like "[name]:[value]" where [name] is the name of an already registred
* variable, and [value] conforms to the data type under which this variable was
* registred.
/* Pass the value */
while (option - name <= (len - 1) && *option != ' ' && *option != '\n'
- && *option != '\t') {
+ && *option != '\t' && *option != ',') {
DEBUG1("Take %c.", *option);
option++;
}
}
*(val++) = '\0';
- DEBUG2("name='%s';val='%s'", name, val);
+ INFO2("Configuration change: Set '%s' to '%s'", name, val);
TRY {
variable = xbt_dict_get((xbt_dict_t) cfg, name);
#include "xbt.h"
#include "xbt/ex.h"
+XBT_LOG_EXTERNAL_CATEGORY(xbt_cfg);
+
XBT_TEST_SUITE("config", "Configuration support");
static xbt_cfg_t make_set()
{
xbt_cfg_t set = NULL;
+ xbt_log_threshold_set(&_XBT_LOGV(xbt_cfg),xbt_log_priority_critical);
set = xbt_cfg_new();
xbt_cfg_register_str(set, "speed:1_to_2_int");
xbt_cfg_register_str(set, "peername:1_to_1_string");