Diff for /libaitcfg/src/parse.c between versions 1.2 and 1.3

version 1.2, 2009/09/09 09:07:31 version 1.3, 2009/10/19 15:00:10
Line 24  static inline int cfgDbg(FILE *f, char *fmt, ...) Line 24  static inline int cfgDbg(FILE *f, char *fmt, ...)
         return ret;          return ret;
 }  }
   
// -----------------------------------------/*
  * InvertQueue() InvertQueue order //{cfg} list of elements for revert
  * @cfg = Head list element for revert 
 */
 static inline void InvertQueue(sl_config * __restrict cfg)
 {
         struct tagPair *item, *next, *prev = NULL;
   
           for (item = cfg->slh_first; item; item = next) {
                   next = item->sle_next;
                   item->sle_next = prev;
                   prev = item;
           }
           cfg->slh_first = prev;
   }
   
   // cfgWrite() Write to file from config list
   static inline int cfgWrite(FILE *f, sl_config * __restrict cfg, int whitespace)
   {
           struct tagPair *av;
           time_t tim;
           char szTime[MAX_STR + 1];
           u_char szSection[MAX_STR + 1];
   
           bzero(szSection, MAX_STR + 1);
   
           bzero(szTime, MAX_STR + 1);
           time(&tim);
           strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
           if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) {
                   LOGERR;
                   return -1;
           }
   
           InvertQueue(cfg);
           for (av = cfg->slh_first; av; av = av->sle_next) {
                   if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) {
                           strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1);
                           if (!cfgDbg(f, "\n[%s]\n", av->psSection)) {
                                   LOGERR;
                                   return -1;
                           }
                   }
                   if (!av->psSection && *szSection) {
                           bzero(szSection, MAX_STR + 1);
                           if (!cfgDbg(f, "\n[]\n")) {
                                   LOGERR;
                                   return -1;
                           }
                   }
   
                   if (whitespace) {
                           if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) {
                                   LOGERR;
                                   return -1;
                           }
                   } else {
                           if (!cfgDbg(f, "%s=%s\n", av->psAttribute, av->psValue)) {
                                   LOGERR;
                                   return -1;
                           }
                   }
           }
           InvertQueue(cfg);
   
           bzero(szTime, MAX_STR + 1);
           time(&tim);
           strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
           if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) {
                   LOGERR;
                   return -1;
           }
   
           return 0;
   }
   
   // ---------------------------------------------------
   
 /*  /*
  * ReadConfig() Read from file and add new item to config list   * ReadConfig() Read from file and add new item to config list
  * @f = file resource   * @f = file resource
Line 148  int ReadConfig(FILE *f, sl_config * __restrict cfg) Line 224  int ReadConfig(FILE *f, sl_config * __restrict cfg)
 */  */
 int WriteConfig(FILE *f, sl_config * __restrict cfg)  int WriteConfig(FILE *f, sl_config * __restrict cfg)
 {  {
        struct tagPair *av;        return cfgWrite(f, cfg, 1);
        time_t tim;}
        char szTime[MAX_STR + 1]; 
        u_char szSection[MAX_STR + 1]; 
   
        bzero(szSection, MAX_STR + 1);/*
  * 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);
 }
   
        bzero(szTime, MAX_STR + 1);/*
        time(&tim); * ConcatConfig() Concat two list in one
        strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); * @cfg = Head list element of main list
        if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) { * @add_cfg = Head list element of added list
                LOGERR; * 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)
                 return -1;                  return -1;
         }  
   
        for (av = cfg->slh_first; av; av = av->sle_next) {        for (item = cfg->slh_first; item->sle_next; item = item->sle_next);
                if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) {        item->sle_next = add_cfg->slh_first;
                        strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1);
                        if (!cfgDbg(f, "\n[%s]\n", av->psSection)) {        add_cfg->slh_first = NULL;
                                LOGERR;
                                return -1;        return ret;
 }
 
 /*
  * MergeConfig() 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!)
  * return: 0 ok; -1 error:: can`t merge lists
 */
 int MergeConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg)
 {
         struct tagPair *item, *merge, *add_next, *next = NULL;
         int flg;
 
         if (!cfg || !add_cfg)
                 return -1;
 
         item = add_cfg->slh_first;
         while (item) {
                 add_next = item->sle_next;
 
                 for (flg = 0, merge = cfg->slh_first, next = merge->sle_next; next; 
                                 merge = merge->sle_next, next = merge->sle_next) {
                         if (!merge->psSection && !item->psSection) {
                                 flg = 1;
                                 merge->sle_next = item;
                                 item->sle_next = next;
                                 break;
                         }                          }
                }                        if (merge->psSection && item->psSection && 
                if (!av->psSection && *szSection) {                                        !strcmp((char*) merge->psSection, (char*) item->psSection)) {
                        bzero(szSection, MAX_STR + 1);                                flg = 1;
                        if (!cfgDbg(f, "\n[]\n")) {                                merge->sle_next = item;
                                LOGERR;                                item->sle_next = next;
                                return -1;                                break;
                         }                          }
                 }                  }
   
                if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) {                if (!flg) {
                        LOGERR;                        if (!merge->sle_next) {
                        return -1;                                merge->sle_next = item;
                                 item->sle_next = NULL;
                         } else
                                 return -1;
                 }                  }
         }  
   
        bzero(szTime, MAX_STR + 1);                item = add_next;
        time(&tim); 
        strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); 
        if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) { 
                LOGERR; 
                return -1; 
         }          }
   
           add_cfg->slh_first = NULL;
   
         return 0;          return 0;
 }  }

Removed from v.1.2  
changed lines
  Added in v.1.3


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