--- libaitcfg/src/queue.c 2012/04/02 14:39:03 1.6.4.1 +++ libaitcfg/src/queue.c 2012/04/02 15:12:15 1.6.4.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: queue.c,v 1.6.4.1 2012/04/02 14:39:03 misho Exp $ +* $Id: queue.c,v 1.6.4.2 2012/04/02 15:12:15 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -50,7 +50,6 @@ static inline struct tagCfg * _selectAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr) { struct tagCfg fav; - struct tagCfg *av; if (!cfg) return NULL; @@ -65,6 +64,8 @@ _selectAttribute(cfg_root_t * __restrict cfg, const ch io_align(strlen(csAttr), 1) / 2); /* + struct tagCfg *av; + RB_FOREACH(av, tagRC, cfg) { printf("sec=%s(%d) attr=%s(%d) val=%s\n", AIT_GET_LIKE(&av->cfg_sec, char*), AIT_KEY(&av->cfg_sec), AIT_GET_LIKE(&av->cfg_attr, char*), AIT_KEY(&av->cfg_attr), AIT_GET_STR(&av->cfg_val)); @@ -98,7 +99,7 @@ _destroyAttribute(struct tagCfg *av) * @cfg = Config root * @csSec = Config section //[{csSec}] * @csAttr = Config attribute //{csAttr} = ... - * return: 0 not found item; -1 error: null parameters; >0 position in list + * return: 0 not found item, -1 error or >0 position in list */ inline int cfg_findAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr) @@ -166,113 +167,79 @@ int cfg_UnsetAttribute(sl_config * __restrict cfg, con DestroyAttribute(av); return cx; } +#endif /* - * cfg_SetAttribute() Set item in config list or add new item if not exists - * @cfg = Head list element + * cfg_setAttribute() - Set item in config or adding new item if not exists + * + * @cfg = Config root * @csSec = Config section //[{csSec}], if NULL set in *default* section - * @csAttr = Config attribute //{csAttr} = ..., if NULL set as *any* attribute + * @csAttr = Config attribute //{csAttr} = ... * @csVal = Config value //... = {csVal} to setup - * return: 0 nothing changed, -1 error: not enough memory; 1 find and update item; 2 added new item -*/ -int cfg_SetAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr, const u_char *csVal) + * return: 0 nothing changed, -1 error, 1 found and updated item or 2 added new item + */ +int +cfg_setAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr, const char *csVal) { - struct tagPair *av, *section; - int len; + struct tagCfg *av, *section; - if (!cfg || !csAttr) + if (!cfg || !csAttr || !csVal) return -1; - av = SelectAttribute(cfg, csSec, csAttr); + av = _selectAttribute(cfg, csSec, csAttr); if (!av) { - section = SelectAttribute(cfg, csSec, NULL); + /* adding new element */ + section = _selectAttribute(cfg, csSec, NULL); - av = malloc(sizeof(struct tagPair)); + av = malloc(sizeof(struct tagCfg)); if (!av) { LOGERR; return -1; } else { - memset(av, 0, sizeof(struct tagPair)); + memset(av, 0, sizeof(struct tagCfg)); - if (!section) { - // add new element - av->sle_next = cfg->slh_first; - cfg->slh_first = av; - } else { - // add new element in existing section - av->sle_next = section->sle_next; - section->sle_next = av; - } + CFG_RC_LOCK(cfg); + if (!section) + SLIST_INSERT_HEAD(cfg, av, cfg_next); + else + SLIST_INSERT_AFTER(section, av, cfg_next); + CFG_RC_UNLOCK(cfg); } - // added section name to element - if (csSec && *csSec) { - len = strlen((char*) csSec) + 1; - av->psSection = malloc(len); - if (!av->psSection) { - LOGERR; - free(av); - return -1; - } else { - strlcpy((char*) av->psSection, (char*) csSec, len); - } - } else - av->psSection = NULL; - // added attribute to element - len = strlen((char*) csAttr) + 1; - av->psAttribute = malloc(len); - if (!av->psAttribute) { - LOGERR; - free(av->psSection); - free(av); - return -1; - } else { - strlcpy((char*) av->psAttribute, (char*) csAttr, len); + if (csSec && *csSec) { + AIT_SET_STR(&av->cfg_sec, csSec); + AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*), + io_align(AIT_LEN(&av->cfg_sec) - 1, 1) / 2); } - // added value to element - if (csVal && *csVal) { - len = strlen((char*) csVal) + 1; - av->psValue = malloc(len); - if (!av->psValue) { - LOGERR; - free(av->psAttribute); - free(av->psSection); - free(av); - return -1; - } else { - strlcpy((char*) av->psValue, (char*) csVal, len); - } - } else { - av->psValue = malloc(1); - *av->psValue = 0; - } + AIT_SET_STR(&av->cfg_val, csVal); + AIT_SET_STR(&av->cfg_attr, csAttr); + AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*), + io_align(AIT_LEN(&av->cfg_attr) - 1, 1) / 2); - // Added new element + CFG_RC_LOCK(cfg); + RB_INSERT(tagRC, cfg, av); + CFG_RC_UNLOCK(cfg); return 2; } - if (strcmp((char*) csVal, (char*) av->psValue)) { - len = strlen((char*) csVal) + 1; - av->psValue = realloc(av->psValue, len); - strlcpy((char*) av->psValue, (char*) csVal, len); - - // Update element + if (strcmp((char*) csVal, (char*) AIT_GET_STR(&av->cfg_val))) { + /* Update element */ + AIT_FREE_VAL(&av->cfg_val); + AIT_SET_STR(&av->cfg_val, csVal); return 1; } - // Nothing happens ... finded & values is equal! + /* Nothing happens ... found & values is equal! */ return 0; } -#endif - /* * cfg_getAttribute() - Get item from config and return value from it * * @cfg = Config root * @csSec = Config section //[{csSec}], if NULL unset in *default* section * @csAttr = Config attribute //{csAttr} = ..., if NULL unset as *any* attribute - * return: NULL item not found or null parameters; !=NULL value const string + * return: NULL item not found or null parameters, !=NULL value const string */ inline const char * cfg_getAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr)