diff --git a/common/config/config_common.c b/common/config/config_common.c index 2bca71d912..c617c426d7 100644 --- a/common/config/config_common.c +++ b/common/config/config_common.c @@ -308,3 +308,63 @@ void config_assign_int(configmodule_interface_t *cfg, paramdef_t *cfgoptions, ch break; } } + +/** + * @brief Assigns the default value to a configuration parameter if available. + * + * This function checks the type of the parameter and assigns its default value + * if it is defined. It handles various parameter types, including strings, integers, + * arrays, doubles, IPv4 addresses, and lists. If the parameter is marked with + * PARAMFLAG_DONOTREAD, it is ignored. + * + * @param[in] cfg Pointer to the configuration module interface. + * @param[in] cfgoption Pointer to the parameter definition structure. + * @param[in] prefix Optional prefix for the parameter name (can be NULL). + * @return 1 if the default value was set, 0 if ignored, or -1 on error/unsupported type. + */ +int config_common_getdefault(configmodule_interface_t *cfg, paramdef_t *cfgoption, char *prefix) +{ + if( (cfgoption->paramflags & PARAMFLAG_DONOTREAD) != 0) { + return 0; + } + + switch(cfgoption->type) { + case TYPE_STRING: + return config_setdefault_string(cfg, cfgoption, prefix); + + case TYPE_STRINGLIST: + return config_setdefault_stringlist(cfg, cfgoption, prefix); + + case TYPE_UINT8: + case TYPE_INT8: + case TYPE_UINT16: + case TYPE_INT16: + case TYPE_UINT32: + case TYPE_INT32: + case TYPE_MASK: + return config_setdefault_int(cfg, cfgoption, prefix); + + case TYPE_UINT64: + case TYPE_INT64: + return config_setdefault_int64(cfg, cfgoption, prefix); + + case TYPE_UINTARRAY: + case TYPE_INTARRAY: + return config_setdefault_intlist(cfg, cfgoption, prefix); + + case TYPE_DOUBLE: + return config_setdefault_double(cfg, cfgoption, prefix); + + case TYPE_IPV4ADDR: + return config_setdefault_ipv4addr(cfg, cfgoption, prefix); + + case TYPE_LIST: + // No default value for list type + fprintf(stderr,"[CONFIG] %s.%s TYPE_LIST has no default value\n", prefix, cfgoption->optname); + return -1; + + default: + fprintf(stderr,"[CONFIG] %s.%s type %i not supported\n", prefix, cfgoption->optname, cfgoption->type); + return -1; + } /* switch on param type */ +} diff --git a/common/config/config_common.h b/common/config/config_common.h index 8e595e4556..00211c9519 100644 --- a/common/config/config_common.h +++ b/common/config/config_common.h @@ -50,6 +50,7 @@ int config_setdefault_double(configmodule_interface_t *cfg, paramdef_t *cfgoptio int config_setdefault_ipv4addr(configmodule_interface_t *cfg, paramdef_t *cfgoptions, char *prefix); void *config_allocate_new(configmodule_interface_t *cfg, int sz, bool autoFree); void config_assign_int(configmodule_interface_t *cfg, paramdef_t *cfgoptions, char *fullname, int val); +int config_common_getdefault(configmodule_interface_t *cfg, paramdef_t *cfgoption, char *prefix); #ifdef __cplusplus } diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c index 0934024391..0770fb2af8 100644 --- a/common/config/libconfig/config_libconfig.c +++ b/common/config/libconfig/config_libconfig.c @@ -356,7 +356,7 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, snprintf( *cfgoptions[i].strptr , cfgoptions[i].numelt, "%s", str); printf_params(cfg, "[LIBCONFIG] %s: \"%s\"\n", cfgpath, *cfgoptions[i].strptr); } else { - defval = config_setdefault_string(cfg, &cfgoptions[i], prefix); + defval = config_common_getdefault(cfg, &cfgoptions[i], prefix); } break; @@ -367,7 +367,7 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, if ( setting != NULL) { read_strlist(cfg, &cfgoptions[i], setting, cfgpath); } else { - defval = config_setdefault_stringlist(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } break; @@ -383,7 +383,7 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, config_check_valptr(cfg, &(cfgoptions[i]), sizeof(*cfgoptions[i].iptr), 1); config_assign_int(cfg, &(cfgoptions[i]), cfgpath, u); } else { - defval = config_setdefault_int(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } break; @@ -401,7 +401,7 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, printf_params(cfg, "[LIBCONFIG] %s: %ld\n", cfgpath, *cfgoptions[i].i64ptr); } } else { - defval = config_setdefault_int64(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } break; @@ -413,7 +413,7 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, if ( setting != NULL) { read_intarray(cfg, &cfgoptions[i], setting, cfgpath); } else { - defval = config_setdefault_intlist(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } break; @@ -424,14 +424,14 @@ int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, *cfgoptions[i].dblptr = dbl; printf_params(cfg, "[LIBCONFIG] %s: %lf\n", cfgpath, *(cfgoptions[i].dblptr)); } else { - defval = config_setdefault_double(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } break; case TYPE_IPV4ADDR: if ( !config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) { - defval = config_setdefault_ipv4addr(cfg, &(cfgoptions[i]), prefix); + defval = config_common_getdefault(cfg, &(cfgoptions[i]), prefix); } else { int rst = config_assign_ipv4addr(cfg, cfgoptions, str); diff --git a/common/config/yaml/config_yaml.cpp b/common/config/yaml/config_yaml.cpp index 138163ce0e..0da2d4bf56 100644 --- a/common/config/yaml/config_yaml.cpp +++ b/common/config/yaml/config_yaml.cpp @@ -25,8 +25,7 @@ extern "C" { #include "common/config/config_userapi.h" void *config_allocate_new(configmodule_interface_t *cfg, int sz, bool autoFree); void config_check_valptr(configmodule_interface_t *cfg, paramdef_t *cfgoptions, int elt_sz, int nb_elt); -#include "../config_userapi.h" -#include "../config_common.h" +int config_common_getdefault(configmodule_interface_t *cfg, paramdef_t *cfgoption, char *prefix); } #include #include @@ -44,71 +43,6 @@ class YamlConfig { } }; -void SetDefault(configmodule_interface_t *cfg, paramdef_t *param) -{ - switch (param->type) { - case TYPE_INT: - *param->iptr = param->defintval; - break; - case TYPE_UINT: - *param->uptr = param->defuintval; - break; - case TYPE_STRING: - if (param->defstrval != nullptr) { - if (param->numelt == 0) { - config_check_valptr(cfg, param, 1, strlen(param->defstrval) + 1); - } - sprintf(*param->strptr, "%s", param->defstrval); - } - break; - case TYPE_INT8: - *param->i8ptr = param->defintval; - break; - case TYPE_UINT8: - *param->u8ptr = param->defuintval; - break; - case TYPE_INT16: - *param->i16ptr = param->defintval; - break; - case TYPE_UINT16: - *param->u16ptr = param->defuintval; - break; - case TYPE_INT64: - *param->i64ptr = param->defint64val; - break; - case TYPE_UINT64: - *param->u64ptr = param->defint64val; - break; - case TYPE_DOUBLE: - *param->dblptr = param->defdblval; - break; - case TYPE_MASK: - *param->uptr = param->defuintval; - break; - case TYPE_STRINGLIST: - if (param->defstrlistval != nullptr) { - param->strlistptr = param->defstrlistval; - } - break; - case TYPE_INTARRAY: - if (param->defintarrayval) { - param->iptr = param->defintarrayval; - } - break; - case TYPE_UINTARRAY: - if (param->defintarrayval) { - param->uptr = (uint32_t *)param->defintarrayval; - } - break; - case TYPE_IPV4ADDR: - config_setdefault_ipv4addr(cfg, param, param->defstrval); - break; - default: - AssertFatal(false, "Unhandled type %d", param->type); - } - param->paramflags |= PARAMFLAG_PARAMSETDEF; -} - void SetNonDefault(configmodule_interface_t *cfg, const YAML::Node &node, paramdef_t *param) { auto optname = std::string(param->optname); @@ -213,7 +147,7 @@ void GetParams(configmodule_interface_t *cfg, const YAML::Node &node, paramdef_t if (node && node[std::string(params[i].optname)]) { SetNonDefault(cfg, node, ¶ms[i]); } else { - SetDefault(cfg, ¶ms[i]); + config_common_getdefault(cfg, ¶ms[i], nullptr); } } }