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

version 1.13.2.1, 2014/01/30 08:13:09 version 1.23, 2026/08/04 18:59:27
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 - 2014Copyright 2004 - 2026
         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 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
   
   
 /*  /*
static inline void * cfg_ReadConfig() - Read file and add new item at config root
_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 
  *   *
  * @f = File resource   * @f = File resource
  * @cfg = Config root   * @cfg = Config root
    * @lvl = Level of include recursion
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
 int  int
cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)cfg_ReadConfig(FILE *f, cfg_root_t * __restrict cfg, int lvl)
 {  {
        char line[BUFSIZ];        char line[BUFSIZ], origin[BUFSIZ], chkattr[STRSIZ];
         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 };
           FILE *ff;
   
         if (!f || !cfg) {          if (!f || !cfg) {
                 cfg_SetErr(EINVAL, "Invalid parameter(s)");                  cfg_SetErr(EINVAL, "Invalid parameter(s)");
Line 83  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 70  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
   
         while (!feof(f)) {          while (!feof(f)) {
                 memset(line, 0, sizeof line);                  memset(line, 0, sizeof line);
                fgets(line, sizeof line - 1, f);                if (!fgets(line, sizeof(line) - 1, f))
                         break;
 #ifdef SUPPORT_USER_EOF  #ifdef SUPPORT_USER_EOF
                 /* check for user end-of-file */                  /* check for user end-of-file */
                 if (line[0] == '.' && line[1] == '\n')                  if (line[0] == '.' && line[1] == '\n')
                         break;                          break;
 #endif  #endif
                 if (!(psAttr = strpbrk(line, "\r\n"))) {                  if (!(psAttr = strpbrk(line, "\r\n"))) {
                        /* skip line, too long */                        if (feof(f) && strlen(line) > 0) {
                        continue;                                /* last line without end of line */
                                 strlcpy(origin, line, sizeof origin);
                                 str_Trim(line);
                         } else {
                                 /* skip line, too long */
                                 continue;
                         }
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
                           strlcpy(origin, line, sizeof origin);
                         str_Trim(line);                          str_Trim(line);
                 }                  }
   
Line 110  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 105  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))
                                str_Unquot((char*) AIT_GET_STR(&av->cfg_val));                                av->cfg_quoted += str_Unquot((char*) AIT_GET_STR(&av->cfg_val));
 
                         if (lvl > 0) {
                                 /* read include file */
                                 if (!flg && AIT_ADDR(&av->cfg_val) && 
                                                 *AIT_GET_STR(&av->cfg_attr) == '%' && 
                                                 !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {
                                         ff = fopen(AIT_GET_STR(&av->cfg_val), "r");
                                         if (ff) {
                                                 cfg_ReadConfig(ff, cfg, lvl - 1);
                                                 fclose(ff);
                                         } else
                                                 EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file", 
                                                                 AIT_GET_STR(&av->cfg_val));
                                 }
                         }
                         continue;                          continue;
                 }                  }
   
                   /* check for duplicated element */
                   if (*line != '#' && *line != ';' && *line != '/' && *line != '%' && 
                                   (psAttr = strchr(line, '='))) {
                           strncpy(chkattr, line, psAttr - line);
                           chkattr[psAttr - line] = 0;
                           str_RTrim(chkattr);
                           if (cfg_findAttribute(cfg, szSection, chkattr))
                                   cfg_unsetAttribute(cfg, szSection, chkattr);
                   }
   
                 /* *NEW PAIR* alloc new pair element */                  /* *NEW PAIR* alloc new pair element */
                 av = e_malloc(sizeof(struct tagCfg));                  av = e_malloc(sizeof(struct tagCfg));
                 if (!av) {                  if (!av) {
Line 126  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 146  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         CFG_RC_UNLOCK(cfg);                          CFG_RC_UNLOCK(cfg);
                 }                  }
   
                   /* check for comment or empty line */
                   if (!*line || *line == '#' || *line == ';') {
                           AIT_SET_STR(&av->cfg_val, line);
                           continue;
                   }
   
                 /* check for continues line */                  /* check for continues line */
                 psAttr = line + (*line ? strlen(line) : 1) - 1;                  psAttr = line + (*line ? strlen(line) : 1) - 1;
                 if (*psAttr == '\\') {                  if (*psAttr == '\\') {
Line 133  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 159  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         flg = 1;                          flg = 1;
                 }                  }
   
                 /* check for comment or empty line */  
                 if (!*line || *line == '#' || *line == ';') {  
                         AIT_SET_STR(&av->cfg_val, line);  
                         continue;  
                 }  
                 /* section */                  /* section */
                 if (*line == '[') {                  if (*line == '[') {
                         psAttr = line + strlen(line) - 1;                          psAttr = line + strlen(line) - 1;
Line 147  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 168  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                                 strlcpy(szSection, line + 1, sizeof szSection);                                  strlcpy(szSection, line + 1, sizeof szSection);
                                 AIT_SET_STR(&av->cfg_sec, line);                                  AIT_SET_STR(&av->cfg_sec, line);
                         } else                          } else
                                EDEBUG(7, "Ignore section '%s' ... not found ']'", line);                                EDEBUG(ELWIX_DEBUG_LOG, "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(ELWIX_DEBUG_LOG, "Ignore a/v '%s' ... not found '='", line);
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
Line 171  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 192  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 str_RTrim(psAttr);                  str_RTrim(psAttr);
                 str_LTrim(psVal);                  str_LTrim(psVal);
                 if (!flg)                  if (!flg)
                        str_Unquot(psVal);                        av->cfg_quoted += 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*), 
Line 180  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 201  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 CFG_RC_LOCK(cfg);                  CFG_RC_LOCK(cfg);
                 RB_INSERT(tagRC, cfg, av);                  RB_INSERT(tagRC, cfg, av);
                 CFG_RC_UNLOCK(cfg);                  CFG_RC_UNLOCK(cfg);
   
                   if (lvl > 0) {
                           /* read include file */
                           if (!flg && *AIT_GET_STR(&av->cfg_attr) == '%' && 
                                           !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {
                                   ff = fopen(AIT_GET_STR(&av->cfg_val), "r");
                                   if (ff) {
                                           cfg_ReadConfig(ff, cfg, lvl - 1);
                                           fclose(ff);
                                   } else
                                           EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file", 
                                                           AIT_GET_STR(&av->cfg_val));
                           }
                   }
         }          }
   
         return 0;          return 0;
Line 197  int Line 232  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 ... STRSIZ - 1] = 0 };
   
         if (!f || !cfg) {          if (!f || !cfg) {
Line 206  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 240  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
         }          }
   
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
//      _invertQueue(cfg);        RB_FOREACH(av, tagRC, cfg) {
        TAILQ_FOREACH(av, cfg, cfg_next) { 
                 /* empty lines or comment */                  /* empty lines or comment */
                 if (AIT_ISEMPTY(&av->cfg_attr)) {                  if (AIT_ISEMPTY(&av->cfg_attr)) {
                         if (AIT_ISEMPTY(&av->cfg_val))                          if (AIT_ISEMPTY(&av->cfg_val))
Line 218  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 251  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
   
                 /* section [] */                  /* 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, "[%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;
                         }                          }
Line 230  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 262  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                         memset(szSection, 0, sizeof szSection);                          memset(szSection, 0, sizeof szSection);
                         if (!cfg_Write(f, "[]\n")) {                          if (!cfg_Write(f, "[]\n")) {
                                 LOGERR;                                  LOGERR;
 //                              _invertQueue(cfg);  
                                 CFG_RC_UNLOCK(cfg);                                  CFG_RC_UNLOCK(cfg);
                                 return -1;                                  return -1;
                         }                          }
Line 245  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 276  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                         else                          else
                                 strlcat(line, "=", sizeof line);                                  strlcat(line, "=", sizeof line);
                 }                  }
                if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string)                if (!AIT_ISEMPTY(&av->cfg_val) && AIT_TYPE(&av->cfg_val) == string) {
                         if (av->cfg_quoted)
                                 strlcat(line, "\"", sizeof line);
                         strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line);                          strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line);
                           if (av->cfg_quoted)
                                   strlcat(line, "\"", sizeof line);
                   }
 skip_sec:  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) {        return 0;
                time(&tim);}
 
 /*
  * cfgWriteConfigRaw() - Write config from memory by list
  *
  * @f = File handle
  * @cfg = Config root
  * @whitespace = Additional whitespace characters to file
  * return: -1 error or 0 ok
  */
 int
 cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg, int whitespace)
 {
         struct tagCfg *av, *nxt;
         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);
         TAILQ_FOREACH_SAFE(av, cfg, cfg_next, nxt) {
                 /* 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) && 
                                 strcmp(AIT_GET_STRZ(&av->cfg_sec), szSection)) {
                         strlcpy(szSection, AIT_GET_STR(&av->cfg_sec), sizeof szSection);
                         if (!cfg_Write(f, "[%s]\n", AIT_GET_STR(&av->cfg_sec))) {
                                 LOGERR;
                                 CFG_RC_UNLOCK(cfg);
                                 return -1;
                         }
                 } else if (AIT_ISEMPTY(&av->cfg_sec) && *szSection) {
                         memset(szSection, 0, sizeof szSection);
                         if (!cfg_Write(f, "[]\n")) {
                                 LOGERR;
                                 CFG_RC_UNLOCK(cfg);
                                 return -1;
                         }
                 }
 
                 /* build line */
                 memset(line, 0, sizeof line);                  memset(line, 0, sizeof line);
                strftime(line, sizeof line, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));                if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string) {
                cfg_Write(f, "\n## Config was saved at :: %s ##\n", line);                        strlcpy(line, AIT_GET_STRZ(&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) {
                         if (av->cfg_quoted)
                                 strlcat(line, "\"", sizeof line);
                         strlcat(line, AIT_GET_STRZ(&av->cfg_val), sizeof line);
                         if (av->cfg_quoted)
                                 strlcat(line, "\"", sizeof line);
                 }
 skip_sec:
                 /* write */
                 if (!cfg_Write(f, "%s\n", line)) {
                         LOGERR;
                         CFG_RC_UNLOCK(cfg);
                         return -1;
                 }
         }          }
           CFG_RC_UNLOCK(cfg);
   
         return 0;          return 0;
 }  }
   
 /*  /*
  * cfgConcatConfig() - Concat two configs into one   * cfgConcatConfig() - Concat two configs into one
  *   *
Line 332  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 434  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t
                         if (!AIT_ISEMPTY(&merge->cfg_sec) && !AIT_ISEMPTY(&item->cfg_sec) &&                           if (!AIT_ISEMPTY(&merge->cfg_sec) && !AIT_ISEMPTY(&item->cfg_sec) && 
                                         AIT_ADDR(&merge->cfg_sec) && AIT_ADDR(&item->cfg_sec) &&                                          AIT_ADDR(&merge->cfg_sec) && AIT_ADDR(&item->cfg_sec) &&
                                         !strcmp(AIT_GET_STR(&merge->cfg_sec), AIT_GET_STR(&item->cfg_sec))) {                                          !strcmp(AIT_GET_STR(&merge->cfg_sec), AIT_GET_STR(&item->cfg_sec))) {
                                flg = 1;                                flg = -1;
                                 break;                                  break;
                         }                          }
                 }                  }
   
                if (!flg)                switch (flg) {
                        TAILQ_INSERT_TAIL(cfg, item, cfg_next);                        case -1:
                else                                continue;       /* skip duplicated element */
                        TAILQ_INSERT_AFTER(cfg, merge, item, cfg_next);                        case 1:
                                 TAILQ_INSERT_AFTER(cfg, merge, item, cfg_next);
                                 break;
                         case 0:
                                 TAILQ_INSERT_TAIL(cfg, item, cfg_next);
                                 break;
                 }
                 RB_INSERT(tagRC, cfg, item);                  RB_INSERT(tagRC, cfg, item);
         }          }
   
Line 377  cfgReadLines(FILE *f, const char *delim, const char *e Line 485  cfgReadLines(FILE *f, const char *delim, const char *e
         while (!feof(f)) {          while (!feof(f)) {
                 psSec = psAttr = psVal = NULL;                  psSec = psAttr = psVal = NULL;
                 memset(line, 0, sizeof line);                  memset(line, 0, sizeof line);
                fgets(line, sizeof line - 1, f);                if (!fgets(line, sizeof(line) - 1, f))
                         break;
                 /* check for user end-of-file */                  /* check for user end-of-file */
                 if (strspn(line, end))                  if (strspn(line, end))
                         break;                          break;
Line 401  cfgReadLines(FILE *f, const char *delim, const char *e Line 510  cfgReadLines(FILE *f, const char *delim, const char *e
                 if (!av_MakeExt(p, SEC_LINES_DELIM, &psSec, &psAttr))                  if (!av_MakeExt(p, SEC_LINES_DELIM, &psSec, &psAttr))
                         psAttr = p;                          psAttr = p;
   
                   /* check for duplicated element */
                   if (psAttr && cfg_findAttribute(cfg, psSec, psAttr))
                           cfg_unsetAttribute(cfg, psSec, psAttr);
   
                 /* *NEW PAIR* alloc new pair element */                  /* *NEW PAIR* alloc new pair element */
                 av = e_malloc(sizeof(struct tagCfg));                  av = e_malloc(sizeof(struct tagCfg));
                 if (!av) {                  if (!av) {
Line 414  cfgReadLines(FILE *f, const char *delim, const char *e Line 527  cfgReadLines(FILE *f, const char *delim, const char *e
                         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*), 
                                         E_ALIGN(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);                                          E_ALIGN(AIT_LEN(&av->cfg_sec) - 1, 2) / 2);
                 }                  }
                if (psVal)                if (psVal) {
                         av->cfg_quoted = 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*), 
                                 E_ALIGN(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);                                  E_ALIGN(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);
Line 469  cfgWriteLines(FILE *f, const char *delim, const char * Line 584  cfgWriteLines(FILE *f, const char *delim, const char *
                 AIT_INIT_VAL2(v, string);                  AIT_INIT_VAL2(v, string);
   
         TAILQ_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 482  cfgWriteLines(FILE *f, const char *delim, const char * Line 595  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));
                if (!AIT_ISEMPTY(&av->cfg_val))                        AIT_SET_STRCAT(v, delim);
                 }
                 if (!AIT_ISEMPTY(&av->cfg_val)) {
                         if (av->cfg_quoted)
                                 AIT_SET_STRCAT(v, "\"");
                         AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));                          AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));
                           if (av->cfg_quoted)
                                   AIT_SET_STRCAT(v, "\"");
                   }
                 AIT_SET_STRCAT(v, eol);                  AIT_SET_STRCAT(v, eol);
         }          }
   
        if (f)        if (f && AIT_GET_STR(v))
                 fputs(AIT_GET_STR(v), f);                  fputs(AIT_GET_STR(v), f);
         return v;          return v;
 }  }

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


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