diff --git a/core/src/dap_config.c b/core/src/dap_config.c index e2738a08f1f2cd9be0957830143325afb3788573..b8adb7aaf6c398a5b6df84960bddacfeae9d17b1 100644 --- a/core/src/dap_config.c +++ b/core/src/dap_config.c @@ -57,9 +57,8 @@ const char *dap_config_path() return s_configs_path; } -#define dap_config_item_del(a_item) \ +#define dap_config_item_del(a_item, a_full) \ do { \ - DAP_DELETE(a_item->name); \ switch (a_item->type) { \ case DAP_CONFIG_ITEM_STRING: \ DAP_DELETE(a_item->val.val_str); \ @@ -70,31 +69,38 @@ do { \ default: \ break; \ } \ - DAP_DELETE(a_item); \ + if (a_full) \ + DAP_DEL_MULTY(a_item->name, a_item);\ } while (0) -void dap_config_dump(dap_config_t *a_conf) { - dap_config_item_t *l_item = NULL, *l_tmp = NULL; - log_it(L_DEBUG, " Config %s", a_conf->path); - HASH_ITER(hh, a_conf->items, l_item, l_tmp) { - switch (l_item->type) { +DAP_STATIC_INLINE void s_config_item_dump(dap_config_item_t *a_item) +{ + dap_return_if_pass(!a_item); + switch (a_item->type) { case DAP_CONFIG_ITEM_STRING: - log_it(L_DEBUG, " String param: %s = %s", l_item->name, l_item->val.val_str); + log_it(L_DEBUG, " String param: %s = %s", a_item->name, a_item->val.val_str); break; case DAP_CONFIG_ITEM_DECIMAL: - log_it(L_DEBUG, " Int param: %s = %"DAP_UINT64_FORMAT_U, l_item->name, l_item->val.val_int); + log_it(L_DEBUG, " Int param: %s = %"DAP_UINT64_FORMAT_U, a_item->name, a_item->val.val_int); break; case DAP_CONFIG_ITEM_BOOL: - log_it(L_DEBUG, " Bool param: %s = %d", l_item->name, l_item->val.val_bool); + log_it(L_DEBUG, " Bool param: %s = %d", a_item->name, a_item->val.val_bool); break; case DAP_CONFIG_ITEM_ARRAY: { - log_it(L_DEBUG, " Array param: %s = ", l_item->name); - for (char **l_str = l_item->val.val_arr; *l_str; ++l_str) { + log_it(L_DEBUG, " Array param: %s = ", a_item->name); + for (char **l_str = a_item->val.val_arr; *l_str; ++l_str) { log_it(L_DEBUG, " %s", *l_str); } break; } - } + } +} + +void dap_config_dump(dap_config_t *a_conf) { + dap_config_item_t *l_item = NULL, *l_tmp = NULL; + log_it(L_DEBUG, " Config %s", a_conf->path); + HASH_ITER(hh, a_conf->items, l_item, l_tmp) { + s_config_item_dump(l_item); } } @@ -252,14 +258,15 @@ static int _dap_config_load(const char* a_abs_path, dap_config_t **a_conf) { *c = '_'; } HASH_FIND_STR((*a_conf)->items, l_name, l_item); - + + bool l_replace = false; switch (l_type) { // 'r' is for an item being removed case 'r': DAP_DELETE(l_name); if (l_item) { HASH_DEL((*a_conf)->items, l_item); - dap_config_item_del(l_item); + dap_config_item_del(l_item, true); } dap_strfreev(l_values_arr); l_values_arr = NULL; @@ -267,20 +274,21 @@ static int _dap_config_load(const char* a_abs_path, dap_config_t **a_conf) { case DAP_CONFIG_ITEM_ARRAY: l_item_val.val_arr = dap_str_appv(l_item_val.val_arr, l_values_arr, NULL); DAP_DEL_Z(l_values_arr); - if (l_item) - dap_strfreev(l_item->val.val_arr); default: if (!l_item) { l_item = DAP_NEW_Z(dap_config_item_t); l_item->name = l_name; HASH_ADD_KEYPTR(hh, (*a_conf)->items, l_item->name, strlen(l_item->name), l_item); } else { - DAP_DELETE(l_name); - if ( l_type == DAP_CONFIG_ITEM_STRING ) - DAP_DELETE(l_item->val.val_str); + log_it(L_WARNING, "Config item %s from %s.cfg already exist and will be replace", l_item->name, (*a_conf)->path); + s_config_item_dump(l_item); + dap_config_item_del(l_item, false); + l_replace = true; } l_item->type = l_type; l_item->val = l_item_val; + if (l_replace) + s_config_item_dump(l_item); break; } } @@ -527,7 +535,7 @@ void dap_config_close(dap_config_t *a_conf) { dap_config_item_t *l_item = NULL, *l_tmp = NULL; HASH_ITER(hh, a_conf->items, l_item, l_tmp) { HASH_DEL(a_conf->items, l_item); - dap_config_item_del(l_item); + dap_config_item_del(l_item, true); } #if 0 HASH_DEL(g_configs_table, a_conf);