--- libaitcfg/src/parse.c 2012/07/30 10:45:16 1.8.4.2 +++ libaitcfg/src/parse.c 2012/07/30 11:44:35 1.8.4.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: parse.c,v 1.8.4.2 2012/07/30 10:45:16 misho Exp $ +* $Id: parse.c,v 1.8.4.4 2012/07/30 11:44:35 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -359,15 +359,14 @@ int cfgReadLines(FILE *f, const char *delim, const char *end, cfg_root_t * __restrict cfg) { char line[BUFSIZ]; - struct tagCfg *av = NULL; + struct tagCfg *d, *av = NULL; char *psAttr, *psVal = NULL; - int ret; while (!feof(f)) { memset(line, 0, sizeof line); fgets(line, sizeof line - 1, f); /* check for user end-of-file */ - if (!strspn(line, end)) + if (strspn(line, end)) break; if (!(psAttr = strpbrk(line, "\r\n"))) { @@ -380,28 +379,40 @@ cfgReadLines(FILE *f, const char *delim, const char *e continue; } - ret = io_MakeAV2((char**) &line, delim, psAttr, psVal); - io_LTrimStr(psVal); - io_RTrimStr(psAttr); + if (!io_MakeAV2(line, delim, &psAttr, &psVal)) + continue; + else { + io_LTrimStr(psVal); + io_RTrimStr(psAttr); + } /* *NEW PAIR* alloc new pair element */ av = io_malloc(sizeof(struct tagCfg)); if (!av) { LOGERR; return -1; - } else { + } else memset(av, 0, sizeof(struct tagCfg)); - CFG_RC_LOCK(cfg); - SLIST_INSERT_HEAD(cfg, av, cfg_next); - CFG_RC_UNLOCK(cfg); - } - AIT_SET_STR(&av->cfg_val, psVal ? psVal : ""); + if (psVal) + AIT_SET_STR(&av->cfg_val, psVal); AIT_SET_STR(&av->cfg_attr, psAttr); AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*), io_align(AIT_LEN(&av->cfg_attr) - 1, 1) / 2); CFG_RC_LOCK(cfg); + /* find & delete duplicates */ + if ((d = RB_FIND(tagRC, cfg, av))) { + RB_REMOVE(tagRC, cfg, d); + SLIST_REMOVE(cfg, d, tagCfg, cfg_next); + + AIT_FREE_VAL(&d->cfg_val); + AIT_FREE_VAL(&d->cfg_attr); + AIT_FREE_VAL(&d->cfg_sec); + io_free(d); + } + + SLIST_INSERT_HEAD(cfg, av, cfg_next); RB_INSERT(tagRC, cfg, av); CFG_RC_UNLOCK(cfg); }