--- libaitcfg/src/parse.c 2012/07/30 11:44:35 1.8.4.4 +++ libaitcfg/src/parse.c 2012/08/30 13:49:44 1.10.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: parse.c,v 1.8.4.4 2012/07/30 11:44:35 misho Exp $ +* $Id: parse.c,v 1.10.2.2 2012/08/30 13:49:44 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))) { @@ -232,14 +232,14 @@ 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) { - strlcpy(line, AIT_GET_STR(&av->cfg_attr), sizeof line); + strlcpy(line, AIT_GET_STRZ(&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) - strlcat(line, AIT_GET_STR(&av->cfg_val), sizeof line); + strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line); /* write */ if (!cfg_Write(f, "%s\n", line)) { @@ -306,7 +306,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 +314,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); @@ -362,6 +363,11 @@ cfgReadLines(FILE *f, const char *delim, const char *e struct tagCfg *d, *av = NULL; char *psAttr, *psVal = NULL; + if (!cfg) + return -1; + if (!delim) + delim = ATR_LINES_DELIM; + while (!feof(f)) { memset(line, 0, sizeof line); fgets(line, sizeof line - 1, f); @@ -420,3 +426,56 @@ cfgReadLines(FILE *f, const char *delim, const char *e return 0; } +/* + * cfgWriteLines() - Write custom lines and export data to variable + * + * @f = File resource + * @delim = Custom delimiter, if =NULL default is '=' + * @eol = End of line string, if =NULL default is "\n" + * @section = Export only section, if =NULL default is all + * @cfg = Config root + * return: =NULL error or !=NULL exported data, must be free after use with io_freeVar() + */ +ait_val_t * +cfgWriteLines(FILE *f, const char *delim, const char *eol, const char *section, cfg_root_t * __restrict cfg) +{ + ait_val_t *v = NULL; + struct tagCfg *av; + + if (!cfg) + return NULL; + if (!delim) + delim = ATR_LINES_DELIM; + if (!eol) + eol = EOL_LINES_DELIM; + if (!(v = io_allocVar())) { + cfg_SetErr(io_GetErrno(), "%s", io_GetError()); + return NULL; + } else + AIT_INIT_VAL2(v, string); + + SLIST_FOREACH(av, cfg, cfg_next) { + if (AIT_ISEMPTY(&av->cfg_attr)) + continue; + if (section) { + if (!AIT_ISEMPTY(&av->cfg_sec) && *section) + continue; + if (strcmp(section, AIT_GET_STR(&av->cfg_sec))) + continue; + } + + if (!AIT_ISEMPTY(&av->cfg_sec)) { + AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_sec)); + AIT_SET_STRCAT(v, SEC_LINES_DELIM); + } + AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_attr)); + AIT_SET_STRCAT(v, delim); + if (!AIT_ISEMPTY(&av->cfg_val)) + AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val)); + AIT_SET_STRCAT(v, eol); + } + + if (f) + fputs(AIT_GET_STR(v), f); + return v; +}