Diff for /libaitcfg/src/parse.c between versions 1.6.4.2 and 1.6.4.7

version 1.6.4.2, 2012/04/03 09:21:06 version 1.6.4.7, 2012/04/04 12:44:48
Line 205  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 205  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
         struct tagCfg *av;          struct tagCfg *av;
         time_t tim;          time_t tim;
         char szTime[STRSIZ] = { 0 }, szSection[STRSIZ] = { 0 };          char szTime[STRSIZ] = { 0 }, szSection[STRSIZ] = { 0 };
           char line[BUFSIZ];
   
         time(&tim);          time(&tim);
         strftime(szTime, sizeof szTime, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));          strftime(szTime, sizeof szTime, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
Line 216  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 217  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
         _invertQueue(cfg);          _invertQueue(cfg);
         SLIST_FOREACH(av, cfg, cfg_next) {          SLIST_FOREACH(av, cfg, cfg_next) {
                   /* add +1 line for section [] */
                 if (!AIT_ISEMPTY(&av->cfg_sec) &&                   if (!AIT_ISEMPTY(&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);
Line 234  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 236  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                         }                          }
                 }                  }
   
                if (!cfg_Write(f, ((whitespace) ? "%s = %s\n" : "%s=%s\n"),                 /* build line */
                                        AIT_GET_STR(&av->cfg_attr), AIT_GET_STR(&av->cfg_val))) {                memset(line, 0, sizeof line);
                 if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string) {
                         strlcpy(line, AIT_GET_STR(&av->cfg_attr), sizeof line);
                         if (whitespace)
                                 strlcat(line, " = ", sizeof line);
                         else
                                 strlcat(line, "=", sizeof line);
                 }
                 if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string)
                         strlcat(line, AIT_GET_STR(&av->cfg_val), sizeof line);
 
                 /* write */
                 if (!cfg_Write(f, "%s\n", line)) {
                         LOGERR;                          LOGERR;
                         CFG_RC_UNLOCK(cfg);                          CFG_RC_UNLOCK(cfg);
                         return -1;                          return -1;
Line 255  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 269  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
         return 0;          return 0;
 }  }
   
 #if 0  
 /*  /*
 * WriteConfig() Write to file from items in config list * cfgConcatConfig() - Concat two configs into one
 * @f = file resource *
 * @cfg = Head list element * @cfg = Config root
 * return: 0 ok; -1 error:: can`t write to file * @add_cfg = Concated config will be destroy after merge
*/ * return: -1 error or 0 ok
int WriteConfig(FILE *f, sl_config * __restrict cfg) */
 int
 cfgConcatConfig(cfg_root_t * __restrict cfg, cfg_root_t * __restrict add_cfg)
 {  {
        return cfgWrite(f, cfg, 1);        struct tagCfg *item;
} 
   
 /*  
  * cfg_WriteConfig() Write to file from items in config list without whitespaces!  
  * @f = file resource  
  * @cfg = Head list element  
  * return: 0 ok; -1 error:: can`t write to file  
 */  
 int cfg_WriteConfig(FILE *f, sl_config * __restrict cfg)  
 {  
         return cfgWrite(f, cfg, 0);  
 }  
   
 /*  
  * ConcatConfig() Concat two list in one  
  * @cfg = Head list element of main list  
  * @add_cfg = Head list element of added list  
  * return: 0 ok; -1 error:: can`t concat lists  
 */  
 int ConcatConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg)  
 {  
         struct tagPair *item;  
         int ret = 0;  
   
         if (!cfg || !add_cfg)          if (!cfg || !add_cfg)
                 return -1;                  return -1;
   
        for (item = cfg->slh_first; item->sle_next; item = item->sle_next);        CFG_RC_LOCK(add_cfg);
        item->sle_next = add_cfg->slh_first;        CFG_RC_LOCK(cfg);
   
        add_cfg->slh_first = NULL;        /* concat lists */
         for (item = SLIST_FIRST(cfg); SLIST_NEXT(item, cfg_next); item = SLIST_NEXT(item, cfg_next));
         SLIST_NEXT(item, cfg_next) = SLIST_FIRST(add_cfg);
   
        return ret;        /* concat red-black trees */
         SLIST_FOREACH(item, add_cfg, cfg_next)
                 RB_INSERT(tagRC, cfg, item);
 
         CFG_RC_UNLOCK(cfg);
         CFG_RC_UNLOCK(add_cfg);
 
         add_cfg->slh_first = NULL;
         add_cfg->rbh_root = NULL;
         pthread_mutex_destroy(&add_cfg->rc_mtx);
         return 0;
 }  }
   
 /*  /*
 * MergeConfig() Marge two list in one cfg and destroy add_cfg * cfgMergeConfig() - Marge two list in one cfg and destroy add_cfg
 * @cfg = Head list element of main list *
 * @add_cfg = Head list element of merged list (destroy after all!) * @cfg = Config root of main list
 * return: 0 ok; -1 error:: can`t merge lists * @add_cfg = Merged config will be destroy after merge
*/ * return: -1 error or 0 ok
int MergeConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg) */
 int
 cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t * __restrict add_cfg)
 {  {
        struct tagPair *item, *merge, *add_next, *next = NULL;        struct tagCfg *item, *merge, *add_next, *next = NULL;
         int flg;          int flg;
   
         if (!cfg || !add_cfg)          if (!cfg || !add_cfg)
                 return -1;                  return -1;
   
        item = add_cfg->slh_first;        CFG_RC_LOCK(add_cfg);
        while (item) {        CFG_RC_LOCK(cfg);
                add_next = item->sle_next;        SLIST_FOREACH_SAFE(item, add_cfg, cfg_next, add_next) {
                flg = 0;
                for (flg = 0, merge = cfg->slh_first, next = merge->sle_next; next;                 SLIST_FOREACH_SAFE(merge, cfg, cfg_next, next) {
                                merge = merge->sle_next, next = merge->sle_next) {                        if (AIT_ISEMPTY(&merge->cfg_sec) && AIT_ISEMPTY(&item->cfg_sec)) {
                        if (!merge->psSection && !item->psSection) {                                SLIST_INSERT_AFTER(merge, item, cfg_next);
                                 RB_INSERT(tagRC, cfg, item);
                                 flg = 1;                                  flg = 1;
                                 merge->sle_next = item;  
                                 item->sle_next = next;  
                                 break;                                  break;
                         }                          }
                        if (merge->psSection && item->psSection &&                         if (!AIT_ISEMPTY(&merge->cfg_sec) && !AIT_ISEMPTY(&item->cfg_sec) && 
                                        !strcmp((char*) merge->psSection, (char*) item->psSection)) {                                        !strcmp(AIT_GET_STR(&merge->cfg_sec), AIT_GET_STR(&item->cfg_sec))) {
                                 SLIST_INSERT_AFTER(merge, item, cfg_next);
                                 RB_INSERT(tagRC, cfg, item);
                                 flg = 1;                                  flg = 1;
                                 merge->sle_next = item;  
                                 item->sle_next = next;  
                                 break;                                  break;
                         }                          }
                 }                  }
   
                 if (!flg) {                  if (!flg) {
                        if (!merge->sle_next) {                        SLIST_INSERT_AFTER(merge, item, cfg_next);
                                merge->sle_next = item;                        RB_INSERT(tagRC, cfg, item);
                                item->sle_next = NULL; 
                        } else 
                                return -1; 
                 }                  }
   
                 item = add_next;  
         }          }
           CFG_RC_UNLOCK(cfg);
           CFG_RC_UNLOCK(add_cfg);
   
         add_cfg->slh_first = NULL;          add_cfg->slh_first = NULL;
        add_cfg->rbh_root = NULL;
         pthread_mutex_destroy(&add_cfg->rc_mtx);
         return 0;          return 0;
 }  }
 #endif  

Removed from v.1.6.4.2  
changed lines
  Added in v.1.6.4.7


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