--- libaitcfg/src/parse.c 2012/08/01 00:39:11 1.9 +++ libaitcfg/src/parse.c 2012/08/06 14:52:51 1.9.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: parse.c,v 1.9 2012/08/01 00:39:11 misho Exp $ +* $Id: parse.c,v 1.9.2.1 2012/08/06 14:52:51 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -116,7 +116,7 @@ cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) flg = 0; /* concat line to value */ AIT_SET_STRCAT(&av->cfg_val, line); - if (!flg) + if (!flg && AIT_ADDR(&av->cfg_val)) io_UnquotStr((char*) AIT_GET_STR(&av->cfg_val)); continue; } @@ -211,7 +211,7 @@ cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i _invertQueue(cfg); SLIST_FOREACH(av, cfg, cfg_next) { /* add +1 line for section [] */ - if (!AIT_ISEMPTY(&av->cfg_sec) && + if (!AIT_ISEMPTY(&av->cfg_sec) && AIT_ADDR(&av->cfg_sec) && strcmp(AIT_GET_STR(&av->cfg_sec), szSection)) { strlcpy(szSection, AIT_GET_STR(&av->cfg_sec), sizeof szSection); if (!cfg_Write(f, "\n[%s]\n", AIT_GET_STR(&av->cfg_sec))) { @@ -231,14 +231,16 @@ cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i /* build line */ memset(line, 0, sizeof line); - if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string) { + if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string && + AIT_ADDR(&av->cfg_attr)) { strlcpy(line, AIT_GET_STR(&av->cfg_attr), sizeof line); if (whitespace) strlcat(line, " = ", sizeof line); else strlcat(line, "=", sizeof line); } - if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string) + if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string && + AIT_ADDR(&av->cfg_val)) strlcat(line, AIT_GET_STR(&av->cfg_val), sizeof line); /* write */ @@ -306,7 +308,7 @@ cfgConcatConfig(cfg_root_t * __restrict cfg, cfg_root_ int cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t * __restrict add_cfg) { - struct tagCfg *item, *merge, *add_next, *next = NULL; + struct tagCfg *item, *merge, *add_next, *next; int flg; if (!cfg || !add_cfg) @@ -314,29 +316,30 @@ cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t CFG_RC_LOCK(add_cfg); CFG_RC_LOCK(cfg); + + /* merge lists */ SLIST_FOREACH_SAFE(item, add_cfg, cfg_next, add_next) { flg = 0; SLIST_FOREACH_SAFE(merge, cfg, cfg_next, next) { if (AIT_ISEMPTY(&merge->cfg_sec) && AIT_ISEMPTY(&item->cfg_sec)) { - SLIST_INSERT_AFTER(merge, item, cfg_next); - RB_INSERT(tagRC, cfg, item); flg = 1; break; } if (!AIT_ISEMPTY(&merge->cfg_sec) && !AIT_ISEMPTY(&item->cfg_sec) && + AIT_ADDR(&merge->cfg_sec) && AIT_ADDR(&item->cfg_sec) && !strcmp(AIT_GET_STR(&merge->cfg_sec), AIT_GET_STR(&item->cfg_sec))) { - SLIST_INSERT_AFTER(merge, item, cfg_next); - RB_INSERT(tagRC, cfg, item); flg = 1; break; } } - if (!flg) { + if (!flg) + SLIST_INSERT_HEAD(cfg, item, cfg_next); + else SLIST_INSERT_AFTER(merge, item, cfg_next); - RB_INSERT(tagRC, cfg, item); - } + RB_INSERT(tagRC, cfg, item); } + CFG_RC_UNLOCK(cfg); CFG_RC_UNLOCK(add_cfg);