--- libaitcfg/src/parse.c 2012/07/30 11:23:09 1.8.4.3 +++ 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.3 2012/07/30 11:23:09 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,7 +359,7 @@ 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; while (!feof(f)) { @@ -391,12 +391,8 @@ cfgReadLines(FILE *f, const char *delim, const char *e 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); - } if (psVal) AIT_SET_STR(&av->cfg_val, psVal); @@ -405,6 +401,18 @@ cfgReadLines(FILE *f, const char *delim, const char *e 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); }