Diff for /libaitcfg/src/parse.c between versions 1.12 and 1.17

version 1.12, 2013/05/30 09:12:27 version 1.17, 2017/06/30 08:44:44
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, 2012, 2013Copyright 2004 - 2017
         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 46  SUCH DAMAGE. Line 46  SUCH DAMAGE.
 #include "global.h"  #include "global.h"
   
   
 static inline void  
 _invertQueue(cfg_root_t * __restrict cfg)  
 {  
         struct tagCfg *item, *next, *prev = NULL;  
   
         SLIST_FOREACH_SAFE(item, cfg, cfg_next, next) {  
                 item->cfg_next.sle_next = prev;  
                 prev = item;  
         }  
         cfg->slh_first = prev;  
 }  
   
   
 /*  /*
  * cfgReadConfig() - Read file and add new item at config root   * cfgReadConfig() - Read file and add new item at config root
  *   *
Line 69  _invertQueue(cfg_root_t * __restrict cfg) Line 56  _invertQueue(cfg_root_t * __restrict cfg)
 int  int
 cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
 {  {
        char line[BUFSIZ];        char line[BUFSIZ], origin[BUFSIZ];
         struct tagCfg *av = NULL;          struct tagCfg *av = NULL;
         int flg = 0;          int flg = 0;
         char *psAttr, *psVal, szSection[STRSIZ] = { 0 };          char *psAttr, *psVal, szSection[STRSIZ] = { 0 };
Line 92  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 79  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
                           strlcpy(origin, line, sizeof origin);
                         str_Trim(line);                          str_Trim(line);
                 }                  }
   
Line 120  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 108  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 } 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 138  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 126  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
                                 EDEBUG(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, origin);
                         EDEBUG(7, "Ignore a/v '%s' ... not found '='", line);                          EDEBUG(7, "Ignore a/v '%s' ... not found '='", line);
                         continue;                          continue;
                 } else {                  } else {
Line 195  int Line 183  int
 cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, int whitespace)  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, int whitespace)
 {  {
         struct tagCfg *av;          struct tagCfg *av;
        time_t tim;        char line[BUFSIZ] = { 0 }, szSection[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
        char line[BUFSIZ] = { 0 }, szSection[STRSIZ] = { 0 }; 
   
         if (!f || !cfg) {          if (!f || !cfg) {
                 cfg_SetErr(EINVAL, "Invalid parameter(s)");                  cfg_SetErr(EINVAL, "Invalid parameter(s)");
Line 204  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 191  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
         }          }
   
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
        _invertQueue(cfg);        RB_FOREACH(av, tagRC, cfg) {
        SLIST_FOREACH(av, cfg, cfg_next) {                /* empty lines or comment */
                /* add +1 line for section [] */                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_STRZ(&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, "\n[%s]\n", AIT_GET_STR(&av->cfg_sec))) {
                                 LOGERR;                                  LOGERR;
                                 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[]\n")) {
                                 LOGERR;                                  LOGERR;
Line 236  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 229  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);  
         CFG_RC_UNLOCK(cfg);          CFG_RC_UNLOCK(cfg);
   
         if (whitespace) {  
                 time(&tim);  
                 memset(line, 0, sizeof line);  
                 strftime(line, sizeof line, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));  
                 cfg_Write(f, "\n## Config was saved at :: %s ##\n", line);  
         }  
   
         return 0;          return 0;
 }  }
   
Line 276  cfgConcatConfig(cfg_root_t * __restrict cfg, cfg_root_ Line 260  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);
   
        add_cfg->slh_first = NULL;        TAILQ_INIT(add_cfg);
        add_cfg->rbh_root = NULL;        RB_INIT(add_cfg);
         CFG_RC_UNLOCK(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 313  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 295  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 329  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 311  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);
   
        add_cfg->slh_first = NULL;        TAILQ_INIT(add_cfg);
        add_cfg->rbh_root = NULL;        RB_INIT(add_cfg);
         CFG_RC_UNLOCK(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 415  cfgReadLines(FILE *f, const char *delim, const char *e Line 397  cfgReadLines(FILE *f, const char *delim, const char *e
                 /* 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);
Line 423  cfgReadLines(FILE *f, const char *delim, const char *e Line 405  cfgReadLines(FILE *f, const char *delim, const char *e
                         e_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 459  cfgWriteLines(FILE *f, const char *delim, const char * Line 441  cfgWriteLines(FILE *f, const char *delim, const char *
         } 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)) 
                        continue; 
                 if (section) {                  if (section) {
                         if (!AIT_ISEMPTY(&av->cfg_sec) && *section)                          if (!AIT_ISEMPTY(&av->cfg_sec) && *section)
                                 continue;                                  continue;
                        if (strcmp(section, AIT_GET_STR(&av->cfg_sec)))                        if (strcmp(section, AIT_GET_STRZ(&av->cfg_sec)))
                                 continue;                                  continue;
                 }                  }
   
Line 473  cfgWriteLines(FILE *f, const char *delim, const char * Line 453  cfgWriteLines(FILE *f, const char *delim, const char *
                         AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_sec));                          AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_sec));
                         AIT_SET_STRCAT(v, SEC_LINES_DELIM);                          AIT_SET_STRCAT(v, SEC_LINES_DELIM);
                 }                  }
                AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_attr));                if (!AIT_ISEMPTY(&av->cfg_attr)) {
                AIT_SET_STRCAT(v, delim);                        AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_attr));
                         AIT_SET_STRCAT(v, delim);
                 }
                 if (!AIT_ISEMPTY(&av->cfg_val))                  if (!AIT_ISEMPTY(&av->cfg_val))
                         AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));                          AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));
                 AIT_SET_STRCAT(v, eol);                  AIT_SET_STRCAT(v, eol);

Removed from v.1.12  
changed lines
  Added in v.1.17


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