XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support");
-xbt_cfg_t simgrid_config = NULL;
-static void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt_cfgelm_type_t type, xbt_cfg_cb_t cb_set);
+XBT_EXPORT_NO_IMPORT(xbt_cfg_t) simgrid_config = NULL;
/* xbt_cfgelm_t: the typedef corresponding to a config variable. */
/* Callbacks */
xbt_cfg_cb_t cb_set;
+ /* Advanced callbacks */
+ xbt_cfg_cb_ext_t cb_set_ext;
+ void* cb_set_data;
+ xbt_cfg_cb_free_t cb_set_free;
+
/* actual content (could be an union or something) */
xbt_dynar_t content;
} s_xbt_cfgelm_t, *xbt_cfgelm_t;
return (xbt_cfg_t) xbt_dict_new_homogeneous(&xbt_cfgelm_free);
}
-/** \brief Copy an existing configuration set
- *
- * @param whereto the config set to be created
- * @param tocopy the source data
- *
- * This only copy the registrations, not the actual content
- */
-void xbt_cfg_cpy(xbt_cfg_t tocopy, xbt_cfg_t * whereto)
-{
- xbt_dict_cursor_t cursor = NULL;
- xbt_cfgelm_t variable = NULL;
- char *name = NULL;
-
- XBT_DEBUG("Copy cfg set %p", tocopy);
- *whereto = NULL;
- 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->cb_set);
-}
-
/** @brief Destructor */
void xbt_cfg_free(xbt_cfg_t * cfg)
{
printf("%s %s:", indent, key);
size = xbt_dynar_length(variable->content);
- printf ("%s. Actual size=%d. postset=%p, List of values:\n",
+ printf ("%s. Actual size=%d. postset=%p\n",
xbt_cfgelm_type_name[variable->type], size, variable->cb_set);
switch (variable->type) {
XBT_DEBUG("Frees cfgelm %p", c);
if (!c)
return;
+ if (c->cb_set_free)
+ c->cb_set_free(c->cb_set_data);
xbt_free(c->desc);
if (c->type != xbt_cfgelm_alias)
xbt_dynar_free(&(c->content));
* @param type the type of the config element
* @param cb_set callback function called when a value is set
*/
-static void xbt_cfg_register(xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt_cfgelm_type_t type, xbt_cfg_cb_t cb_set)
+static void xbt_cfg_register(
+ xbt_cfg_t * cfg, const char *name, const char *desc, e_xbt_cfgelm_type_t type,
+ xbt_cfg_cb_t cb_set,
+ xbt_cfg_cb_ext_t cb_set_ext, void* cb_set_data, xbt_cfg_cb_free_t cb_set_free)
{
if (*cfg == NULL)
*cfg = xbt_cfg_new();
res->desc = xbt_strdup(desc);
res->type = type;
res->cb_set = cb_set;
+ res->cb_set_ext = cb_set_ext;
+ res->cb_set_data = cb_set_data;
+ res->cb_set_free = cb_set_free;
res->isdefault = 1;
switch (type) {
xbt_dict_set((xbt_dict_t) * cfg, name, res, NULL);
}
-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,cb_set);
+
+
+void xbt_cfg_register_double(const char *name, double default_value,xbt_cfg_cb_t cb_set, const char *desc){
+ xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_double,cb_set, NULL, NULL, NULL);
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,cb_set);
+void xbt_cfg_register_int(const char *name, int default_value,xbt_cfg_cb_t cb_set, const char *desc) {
+ xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_int,cb_set, NULL, NULL, NULL);
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,cb_set);
+void xbt_cfg_register_string(const char *name, const char *default_value, xbt_cfg_cb_t cb_set, const char *desc){
+ xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_string,cb_set, NULL, NULL, NULL);
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,cb_set);
+void xbt_cfg_register_boolean(const char *name, const char*default_value,xbt_cfg_cb_t cb_set, const char *desc){
+ xbt_cfg_register(&simgrid_config,name,desc,xbt_cfgelm_boolean,cb_set, NULL, NULL, NULL);
xbt_cfg_setdefault_boolean(name, default_value);
}
+/** Register a config with an extended callback
+ *
+ * @param name Name of the flag
+ * @param desc Description of the flag
+ * @param type Type of the flag
+ * @param cb Extended callback
+ * @param data Data associated with the callback
+ * @param data_free Function used to free the callback data (or NULL)
+ */
+void xbt_cfg_register_ext(const char *name, const char *desc, e_xbt_cfgelm_type_t type,
+ xbt_cfg_cb_ext_t cb, void* data, xbt_cfg_cb_free_t data_free)
+{
+ xbt_cfg_register(&simgrid_config, name, desc, type, NULL, cb, data, data_free);
+}
+
void xbt_cfg_register_alias(const char *newname, const char *oldname)
{
if (simgrid_config == NULL)
xbt_assert(type < xbt_cfgelm_type_count,
"Invalid type in config element descriptor: %s; Should be one of 'string', 'int' or 'double'.", entry);
- xbt_cfg_register(cfg, entrycpy, NULL, type, NULL);
+ xbt_cfg_register(cfg, entrycpy, NULL, type, NULL, NULL, NULL, NULL);
free(entrycpy); /* strdup'ed by dict mechanism, but cannot be const */
}
XBT_DEBUG("Do not override configuration variable '%s' with value '%s' because it was already set.", name, val);
}
-/** @brief Set or add an integer value to \a name within \a cfg
+/** @brief Set an integer value to \a name within \a cfg
*
- * @param cfg the config set
* @param name the name of the variable
* @param val the value of the variable
*/
xbt_dynar_set(variable->content, 0, &val);
if (variable->cb_set)
- variable->cb_set(name, xbt_dynar_length(variable->content) - 1);
+ variable->cb_set(name);
+ if (variable->cb_set_ext)
+ variable->cb_set_ext(name, variable->cb_set_data);
variable->isdefault = 0;
}
/** @brief Set or add a double value to \a name within \a cfg
*
- * @param cfg the config set
* @param name the name of the variable
- * @param val the doule to set
+ * @param val the double to set
*/
void xbt_cfg_set_double(const char *name, double val)
{
xbt_dynar_set(variable->content, 0, &val);
if (variable->cb_set)
- variable->cb_set(name, xbt_dynar_length(variable->content) - 1);
+ variable->cb_set(name);
+ if (variable->cb_set_ext)
+ variable->cb_set_ext(name, variable->cb_set_data);
variable->isdefault = 0;
}
xbt_dynar_set(variable->content, 0, &newval);
if (variable->cb_set)
- variable->cb_set(name, xbt_dynar_length(variable->content) - 1);
+ variable->cb_set(name);
+ if (variable->cb_set_ext)
+ variable->cb_set_ext(name, variable->cb_set_data);
variable->isdefault = 0;
}
*/
void xbt_cfg_set_boolean(const char *name, const char *val)
{
- int i, bval;
+ int bval=-1;
xbt_cfgelm_t variable = xbt_cfgelm_get(simgrid_config, name, xbt_cfgelm_boolean);
- for (i = 0; xbt_cfgelm_boolean_values[i].true_val != NULL; i++) {
+ for (int i = 0; xbt_cfgelm_boolean_values[i].true_val != NULL; i++) {
if (strcmp(val, xbt_cfgelm_boolean_values[i].true_val) == 0){
bval = 1;
break;
break;
}
}
- if (xbt_cfgelm_boolean_values[i].true_val == NULL) {
- xbt_die("Value of option '%s' not valid. Should be a boolean (yes,no,on,off,true,false,0,1)", val);
- }
-
+ xbt_assert(bval != -1, "Value of option '%s' not valid. Should be a boolean (yes,no,on,off,true,false,0,1)", val);
xbt_dynar_set(variable->content, 0, &bval);
if (variable->cb_set)
- variable->cb_set(name, xbt_dynar_length(variable->content) - 1);
+ variable->cb_set(name);
+ if (variable->cb_set_ext)
+ variable->cb_set_ext(name, variable->cb_set_data);
variable->isdefault = 0;
}
return xbt_dynar_get_as(variable->content, 0, int);
}
-/** @brief Retrieve the dynar of all the values stored in a variable
- *
- * @param cfg where to search in
- * @param name what to search for
- *
- * Get the data stored in the config set.
- *
- * \warning the returned value is the actual content of the config set
- */
-xbt_dynar_t xbt_cfg_get_dynar(const char *name)
-{
- xbt_cfgelm_t variable = NULL;
- xbt_ex_t e;
-
- TRY {
- variable = xbt_dict_get((xbt_dict_t) simgrid_config, name);
- } CATCH(e) {
- if (e.category == not_found_error) {
- xbt_ex_free(e);
- THROWF(not_found_error, 0, "No registered variable %s in this config set", name);
- }
- RETHROW;
- }
-
- return variable->content;
-}
-
-/** @brief Retrieve one of the integer value of a variable */
-int xbt_cfg_get_int_at(xbt_cfg_t cfg, const char *name, int pos)
-{
- xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_int);
- return xbt_dynar_get_as(variable->content, pos, int);
-}
-
-/** @brief Retrieve one of the double value of a variable */
-double xbt_cfg_get_double_at(xbt_cfg_t cfg, const char *name, int pos)
-{
- xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_double);
- return xbt_dynar_get_as(variable->content, pos, double);
-}
-
-/** @brief Retrieve one of the string value of a variable */
-char *xbt_cfg_get_string_at(xbt_cfg_t cfg, const char *name, int pos)
-{
- xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_string);
- return xbt_dynar_get_as(variable->content, pos, char *);
-}
-
-/** @brief Retrieve one of the boolean value of a variable */
-int xbt_cfg_get_boolean_at(xbt_cfg_t cfg, const char *name, int pos)
-{
- xbt_cfgelm_t variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_boolean);
- return xbt_dynar_get_as(variable->content, pos, int);
-}
-
#ifdef SIMGRID_TEST
#include "xbt.h"
#include "xbt/ex.h"