Diff for /libaitcfg/src/parse.c between versions 1.10.2.4 and 1.13.2.1

version 1.10.2.4, 2012/09/17 14:17:12 version 1.13.2.1, 2014/01/30 08:13:09
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012Copyright 2004 - 2014
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
 SUCH DAMAGE.  SUCH DAMAGE.
 */  */
 #include "global.h"  #include "global.h"
 #include "aitcfg.h"  
   
   
static inline int/*
cfg_Write(FILE *f, char *fmt, ...) 
{ 
        int ret = 0; 
        va_list lst; 
 
        va_start(lst, fmt); 
        ret = vfprintf(f, fmt, lst); 
        va_end(lst); 
 
        return ret; 
} 
 
 static inline void  static inline void
 _invertQueue(cfg_root_t * __restrict cfg)  _invertQueue(cfg_root_t * __restrict cfg)
 {  {
Line 71  _invertQueue(cfg_root_t * __restrict cfg) Line 58  _invertQueue(cfg_root_t * __restrict cfg)
         }          }
         cfg->slh_first = prev;          cfg->slh_first = prev;
 }  }
   */
   
   
 /*  /*
Line 88  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 76  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
         int flg = 0;          int flg = 0;
         char *psAttr, *psVal, szSection[STRSIZ] = { 0 };          char *psAttr, *psVal, szSection[STRSIZ] = { 0 };
   
           if (!f || !cfg) {
                   cfg_SetErr(EINVAL, "Invalid parameter(s)");
                   return -1;
           }
   
         while (!feof(f)) {          while (!feof(f)) {
                 memset(line, 0, sizeof line);                  memset(line, 0, sizeof line);
                 fgets(line, sizeof line - 1, f);                  fgets(line, sizeof line - 1, f);
Line 101  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 94  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
                        io_TrimStr(line);                        str_Trim(line);
                 }                  }
   
                 if (flg) {                  if (flg) {
Line 117  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 110  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         /* concat line to value */                          /* concat line to value */
                         AIT_SET_STRCAT(&av->cfg_val, line);                          AIT_SET_STRCAT(&av->cfg_val, line);
                         if (!flg && AIT_ADDR(&av->cfg_val))                          if (!flg && AIT_ADDR(&av->cfg_val))
                                io_UnquotStr((char*) AIT_GET_STR(&av->cfg_val));                                str_Unquot((char*) AIT_GET_STR(&av->cfg_val));
                         continue;                          continue;
                 }                  }
   
                 /* *NEW PAIR* alloc new pair element */                  /* *NEW PAIR* alloc new pair element */
                av = io_malloc(sizeof(struct tagCfg));                av = e_malloc(sizeof(struct tagCfg));
                 if (!av) {                  if (!av) {
                        LOGERR;                        cfg_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
                         return -1;                          return -1;
                 } else {                  } else {
                         memset(av, 0, sizeof(struct tagCfg));                          memset(av, 0, sizeof(struct tagCfg));
                         CFG_RC_LOCK(cfg);                          CFG_RC_LOCK(cfg);
                        SLIST_INSERT_HEAD(cfg, av, cfg_next);                        TAILQ_INSERT_TAIL(cfg, av, cfg_next);
                         CFG_RC_UNLOCK(cfg);                          CFG_RC_UNLOCK(cfg);
                 }                  }
   
Line 147  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 140  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 }                  }
                 /* section */                  /* section */
                 if (*line == '[') {                  if (*line == '[') {
                         AIT_SET_STR(&av->cfg_val, line);  
                         psAttr = line + strlen(line) - 1;                          psAttr = line + strlen(line) - 1;
                         if (*psAttr == ']') {                          if (*psAttr == ']') {
                                 *psAttr = 0;                                   *psAttr = 0; 
                                 flg = 0;                                  flg = 0;
                                 strlcpy(szSection, line + 1, sizeof szSection);                                  strlcpy(szSection, line + 1, sizeof szSection);
                                   AIT_SET_STR(&av->cfg_sec, line);
                         } else                          } else
                                ioDEBUG(7, "Ignore section '%s' ... not found ']'", line);                                EDEBUG(7, "Ignore section '%s' ... not found ']'", line);
                         continue;                          continue;
                 }                  }
                 /* parse pair */                  /* parse pair */
                 if (!(psAttr = strchr(line, '='))) {                  if (!(psAttr = strchr(line, '='))) {
                         AIT_SET_STR(&av->cfg_val, line);                          AIT_SET_STR(&av->cfg_val, line);
                        ioDEBUG(7, "Ignore a/v '%s' ... not found '='", line);                        EDEBUG(7, "Ignore a/v '%s' ... not found '='", line);
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
Line 172  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 165  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 if (*szSection) {                  if (*szSection) {
                         AIT_SET_STR(&av->cfg_sec, szSection);                          AIT_SET_STR(&av->cfg_sec, szSection);
                         AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*),                           AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*), 
                                        io_align(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);                                        E_ALIGN(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);
                 }                  }
   
                io_RTrimStr(psAttr);                str_RTrim(psAttr);
                io_LTrimStr(psVal);                str_LTrim(psVal);
                 if (!flg)                  if (!flg)
                        io_UnquotStr(psVal);                        str_Unquot(psVal);
                 AIT_SET_STR(&av->cfg_val, psVal);                  AIT_SET_STR(&av->cfg_val, psVal);
                 AIT_SET_STR(&av->cfg_attr, psAttr);                  AIT_SET_STR(&av->cfg_attr, psAttr);
                 AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*),                   AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*), 
                                io_align(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);                                E_ALIGN(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);
   
                 CFG_RC_LOCK(cfg);                  CFG_RC_LOCK(cfg);
                 RB_INSERT(tagRC, cfg, av);                  RB_INSERT(tagRC, cfg, av);
Line 205  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 198  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
 {  {
         struct tagCfg *av;          struct tagCfg *av;
         time_t tim;          time_t tim;
        char line[BUFSIZ] = { 0 }, szSection[STRSIZ] = { 0 };        char line[BUFSIZ] = { 0 }, szSection[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
   
           if (!f || !cfg) {
                   cfg_SetErr(EINVAL, "Invalid parameter(s)");
                   return -1;
           }
   
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
        _invertQueue(cfg);//        _invertQueue(cfg);
        SLIST_FOREACH(av, cfg, cfg_next) {        TAILQ_FOREACH(av, cfg, cfg_next) {
                /* add +1 line for section [] */                /* empty lines or comment */
                 if (AIT_ISEMPTY(&av->cfg_attr)) {
                         if (AIT_ISEMPTY(&av->cfg_val))
                                 continue;
                         strlcpy(line, AIT_GET_STR(&av->cfg_val), sizeof line);
                         goto skip_sec;
                 }
 
                 /* section [] */
                 if (!AIT_ISEMPTY(&av->cfg_sec) && AIT_ADDR(&av->cfg_sec) &&                   if (!AIT_ISEMPTY(&av->cfg_sec) && AIT_ADDR(&av->cfg_sec) && 
                                 strcmp(AIT_GET_STR(&av->cfg_sec), szSection)) {                                  strcmp(AIT_GET_STR(&av->cfg_sec), szSection)) {
                         strlcpy(szSection, AIT_GET_STR(&av->cfg_sec), sizeof szSection);                          strlcpy(szSection, AIT_GET_STR(&av->cfg_sec), sizeof szSection);
                        if (!cfg_Write(f, "\n[%s]\n", AIT_GET_STR(&av->cfg_sec))) {                        if (!cfg_Write(f, "[%s]\n", AIT_GET_STR(&av->cfg_sec))) {
                                 LOGERR;                                  LOGERR;
   //                              _invertQueue(cfg);
                                 CFG_RC_UNLOCK(cfg);                                  CFG_RC_UNLOCK(cfg);
                                 return -1;                                  return -1;
                         }                          }
                }                } else if (AIT_ISEMPTY(&av->cfg_sec) && *szSection) {
                if (AIT_ISEMPTY(&av->cfg_sec) && *szSection) { 
                         memset(szSection, 0, sizeof szSection);                          memset(szSection, 0, sizeof szSection);
                        if (!cfg_Write(f, "\n[]\n")) {                        if (!cfg_Write(f, "[]\n")) {
                                 LOGERR;                                  LOGERR;
   //                              _invertQueue(cfg);
                                 CFG_RC_UNLOCK(cfg);                                  CFG_RC_UNLOCK(cfg);
                                 return -1;                                  return -1;
                         }                          }
Line 240  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 247  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                 }                  }
                 if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string)                  if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string)
                         strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line);                          strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line);
skip_sec:
                 /* write */                  /* write */
                 if (!cfg_Write(f, "%s\n", line)) {                  if (!cfg_Write(f, "%s\n", line)) {
                         LOGERR;                          LOGERR;
   //                      _invertQueue(cfg);
                         CFG_RC_UNLOCK(cfg);                          CFG_RC_UNLOCK(cfg);
                         return -1;                          return -1;
                 }                  }
         }          }
        _invertQueue(cfg);//        _invertQueue(cfg);
         CFG_RC_UNLOCK(cfg);          CFG_RC_UNLOCK(cfg);
   
         if (whitespace) {          if (whitespace) {
Line 279  cfgConcatConfig(cfg_root_t * __restrict cfg, cfg_root_ Line 287  cfgConcatConfig(cfg_root_t * __restrict cfg, cfg_root_
         CFG_RC_LOCK(add_cfg);          CFG_RC_LOCK(add_cfg);
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
   
        /* concat lists */        /* concat lists & red-black trees */
        for (item = SLIST_FIRST(cfg); SLIST_NEXT(item, cfg_next); item = SLIST_NEXT(item, cfg_next));        TAILQ_FOREACH(item, add_cfg, cfg_next) {
        SLIST_NEXT(item, cfg_next) = SLIST_FIRST(add_cfg);                TAILQ_INSERT_TAIL(cfg, item, cfg_next);
 
        /* concat red-black trees */ 
        SLIST_FOREACH(item, add_cfg, cfg_next) 
                 RB_INSERT(tagRC, cfg, item);                  RB_INSERT(tagRC, cfg, item);
           }
   
         CFG_RC_UNLOCK(cfg);          CFG_RC_UNLOCK(cfg);
         CFG_RC_UNLOCK(add_cfg);  
   
        add_cfg->slh_first = NULL;        TAILQ_INIT(add_cfg);
        add_cfg->rbh_root = NULL;        RB_INIT(add_cfg);
         CFG_RC_UNLOCK(add_cfg);
         pthread_mutex_destroy(&add_cfg->rc_mtx);          pthread_mutex_destroy(&add_cfg->rc_mtx);
         return 0;          return 0;
 }  }
Line 316  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 322  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
   
         /* merge lists */          /* merge lists */
        SLIST_FOREACH_SAFE(item, add_cfg, cfg_next, add_next) {        TAILQ_FOREACH_SAFE(item, add_cfg, cfg_next, add_next) {
                 flg = 0;                  flg = 0;
                SLIST_FOREACH_SAFE(merge, cfg, cfg_next, next) {                TAILQ_FOREACH_SAFE(merge, cfg, cfg_next, next) {
                         if (AIT_ISEMPTY(&merge->cfg_sec) && AIT_ISEMPTY(&item->cfg_sec)) {                          if (AIT_ISEMPTY(&merge->cfg_sec) && AIT_ISEMPTY(&item->cfg_sec)) {
                                 flg = 1;                                  flg = 1;
                                 break;                                  break;
Line 332  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 338  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t
                 }                  }
   
                 if (!flg)                  if (!flg)
                        SLIST_INSERT_HEAD(cfg, item, cfg_next);                        TAILQ_INSERT_TAIL(cfg, item, cfg_next);
                 else                  else
                        SLIST_INSERT_AFTER(merge, item, cfg_next);                        TAILQ_INSERT_AFTER(cfg, merge, item, cfg_next);
                 RB_INSERT(tagRC, cfg, item);                  RB_INSERT(tagRC, cfg, item);
         }          }
   
         CFG_RC_UNLOCK(cfg);          CFG_RC_UNLOCK(cfg);
         CFG_RC_UNLOCK(add_cfg);  
   
        add_cfg->slh_first = NULL;        TAILQ_INIT(add_cfg);
        add_cfg->rbh_root = NULL;        RB_INIT(add_cfg);
         CFG_RC_UNLOCK(add_cfg);
         pthread_mutex_destroy(&add_cfg->rc_mtx);          pthread_mutex_destroy(&add_cfg->rc_mtx);
         return 0;          return 0;
 }  }
Line 381  cfgReadLines(FILE *f, const char *delim, const char *e Line 387  cfgReadLines(FILE *f, const char *delim, const char *e
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
                        io_TrimStr(line);                        str_Trim(line);
                         if (!*line)                          if (!*line)
                                 continue;                                  continue;
                 }                  }
   
                if (!io_MakeAV2(line, delim, &p, &psVal))                if (!av_MakeExt(line, delim, &p, &psVal))
                         continue;                          continue;
                 else {                  else {
                        io_RTrimStr(p);                        str_RTrim(p);
                        io_LTrimStr(psVal);                        str_LTrim(psVal);
                 }                  }
                if (!io_MakeAV2(p, SEC_LINES_DELIM, &psSec, &psAttr))                if (!av_MakeExt(p, SEC_LINES_DELIM, &psSec, &psAttr))
                         psAttr = p;                          psAttr = p;
   
                 /* *NEW PAIR* alloc new pair element */                  /* *NEW PAIR* alloc new pair element */
                av = io_malloc(sizeof(struct tagCfg));                av = e_malloc(sizeof(struct tagCfg));
                 if (!av) {                  if (!av) {
                         LOGERR;                          LOGERR;
                         return -1;                          return -1;
Line 406  cfgReadLines(FILE *f, const char *delim, const char *e Line 412  cfgReadLines(FILE *f, const char *delim, const char *e
                 if (psSec) {                  if (psSec) {
                         AIT_SET_STR(&av->cfg_sec, psSec);                          AIT_SET_STR(&av->cfg_sec, psSec);
                         AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*),                           AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*), 
                                        io_align(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);                                        E_ALIGN(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);
                 }                  }
                 if (psVal)                  if (psVal)
                         AIT_SET_STR(&av->cfg_val, psVal);                          AIT_SET_STR(&av->cfg_val, psVal);
                 AIT_SET_STR(&av->cfg_attr, psAttr);                  AIT_SET_STR(&av->cfg_attr, psAttr);
                 AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*),                   AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*), 
                                io_align(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);                                E_ALIGN(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);
   
                 CFG_RC_LOCK(cfg);                  CFG_RC_LOCK(cfg);
                 /* find & delete duplicates */                  /* find & delete duplicates */
                 if ((d = RB_FIND(tagRC, cfg, av))) {                  if ((d = RB_FIND(tagRC, cfg, av))) {
                         RB_REMOVE(tagRC, cfg, d);                          RB_REMOVE(tagRC, cfg, d);
                        SLIST_REMOVE(cfg, d, tagCfg, cfg_next);                        TAILQ_REMOVE(cfg, d, cfg_next);
   
                         AIT_FREE_VAL(&d->cfg_val);                          AIT_FREE_VAL(&d->cfg_val);
                         AIT_FREE_VAL(&d->cfg_attr);                          AIT_FREE_VAL(&d->cfg_attr);
                         AIT_FREE_VAL(&d->cfg_sec);                          AIT_FREE_VAL(&d->cfg_sec);
                        io_free(d);                        e_free(d);
                 }                  }
   
                SLIST_INSERT_HEAD(cfg, av, cfg_next);                TAILQ_INSERT_TAIL(cfg, av, cfg_next);
                 RB_INSERT(tagRC, cfg, av);                  RB_INSERT(tagRC, cfg, av);
                 CFG_RC_UNLOCK(cfg);                  CFG_RC_UNLOCK(cfg);
         }          }
Line 442  cfgReadLines(FILE *f, const char *delim, const char *e Line 448  cfgReadLines(FILE *f, const char *delim, const char *e
  * @eol = End of line string, if =NULL default is "\n"   * @eol = End of line string, if =NULL default is "\n"
  * @section = Export only section, if =NULL default is all   * @section = Export only section, if =NULL default is all
  * @cfg = Config root   * @cfg = Config root
 * return: =NULL error or !=NULL exported data, must be free after use with io_freeVar() * return: =NULL error or !=NULL exported data, must be free after use with ait_freeVar()
  */   */
 ait_val_t *  ait_val_t *
 cfgWriteLines(FILE *f, const char *delim, const char *eol, const char *section, cfg_root_t * __restrict cfg)  cfgWriteLines(FILE *f, const char *delim, const char *eol, const char *section, cfg_root_t * __restrict cfg)
Line 456  cfgWriteLines(FILE *f, const char *delim, const char * Line 462  cfgWriteLines(FILE *f, const char *delim, const char *
                 delim = ATR_LINES_DELIM;                  delim = ATR_LINES_DELIM;
         if (!eol)          if (!eol)
                 eol = EOL_LINES_DELIM;                  eol = EOL_LINES_DELIM;
        if (!(v = io_allocVar())) {        if (!(v = ait_allocVar())) {
                cfg_SetErr(io_GetErrno(), "%s", io_GetError());                cfg_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
                 return NULL;                  return NULL;
         } else          } else
                 AIT_INIT_VAL2(v, string);                  AIT_INIT_VAL2(v, string);
   
        SLIST_FOREACH(av, cfg, cfg_next) {        TAILQ_FOREACH(av, cfg, cfg_next) {
                 if (AIT_ISEMPTY(&av->cfg_attr))                  if (AIT_ISEMPTY(&av->cfg_attr))
                         continue;                          continue;
                 if (section) {                  if (section) {

Removed from v.1.10.2.4  
changed lines
  Added in v.1.13.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>