+#include <stdarg.h>
+
+SG_BEGIN_DECL()
+
+/** @addtogroup XBT_config
+ * @brief Changing the configuration of SimGrid components (grounding feature)
+ *
+ * All modules of the SimGrid toolkit can be configured with this API.
+ * User modules and libraries can also use these facilities to handle their own configuration.
+ *
+ * A configuration set contain several \e variables which have a unique name in the set and can take a given type of
+ * value. For example, it may contain a \a size variable, accepting \e int values.
+ *
+ * It is impossible to set a value to a variable which has not been registered before.
+ * Usually, the module registers all the options it accepts in the configuration set, during its initialization and
+ * user code then set and unset values.
+ *
+ * The easiest way to register a variable is to use the xbt_str_register_str function, which accepts a string
+ * representation of the config element descriptor. The syntax is the following:
+ * \verbatim <name>:<min nb>_to_<max nb>_<type>\endverbatim
+ *
+ * For example, <tt>size:1_to_1_int</tt> describes a variable called \e size which must take exactly one value, and
+ * the value being an integer. Set the maximum to 0 to disable the upper bound on data count.
+ *
+ * Another example could be <tt>outputfiles:0_to_10_string</tt> which describes a variable called \e outputfiles and
+ * which can take between 0 and 10 strings as value.
+ *
+ * To some extend, configuration sets can be seen as typed hash structures.
+ *
+ * \section XBT_cfg_ex Example of use
+ *
+ * \dontinclude config.c
+ *
+ * First, let's create a configuration set with some registered variables.
+ * This must be done by the configurable library before the user interactions.
+ *
+ * \skip make_set
+ * \until end_of_make_set
+ *
+ * Now, set and get a single value
+ * \skip get_single_value
+ * \skip int
+ * \until cfg_free
+ *
+ * And now, set and get a multiple value
+ * \skip get_multiple_value
+ * \skip dyn
+ * \until cfg_free
+ *
+ * All those functions throws mismatch_error if asked to deal with an unregistered variable.
+ * \skip myset
+ * \until cfg_free
+ */
+/** @defgroup XBT_cfg_use User interface: changing values
+ * @ingroup XBT_config
+ *
+ * This is the only interface you should use unless you want to let your own code become configurable with this.
+ *
+ * If the variable accept at most one value, those functions replace the current value with the provided one. If max>1,
+ * the provided value is appended to the list.
+ *
+ * string values are strdup'ed before use, so you can (and should) free your copy
+ *
+ * @{
+ */
+/** @brief Configuration set's data type is opaque. */
+typedef void* xbt_cfg_t;