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

version 1.20.2.1, 2023/01/23 21:03:50 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 - 2023Copyright 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.
   
   
 /*  /*
 * cfgReadConfig() - Read file and add new item at config root * cfg_ReadConfig() - 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], origin[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 };
Line 77  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 78  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         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);                          strlcpy(origin, line, sizeof origin);
Line 100  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 107  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         if (!flg && AIT_ADDR(&av->cfg_val))                          if (!flg && AIT_ADDR(&av->cfg_val))
                                 av->cfg_quoted += str_Unquot((char*) AIT_GET_STR(&av->cfg_val));                                  av->cfg_quoted += str_Unquot((char*) AIT_GET_STR(&av->cfg_val));
   
                        /* read include file */                        if (lvl > 0) {
                        if (!flg && AIT_ADDR(&av->cfg_val) &&                                 /* read include file */
                                        *AIT_GET_STR(&av->cfg_attr) == '%' &&                                 if (!flg && AIT_ADDR(&av->cfg_val) && 
                                        !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {                                                *AIT_GET_STR(&av->cfg_attr) == '%' && 
                                ff = fopen(AIT_GET_STR(&av->cfg_val), "r");                                                !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {
                                if (ff) {                                        ff = fopen(AIT_GET_STR(&av->cfg_val), "r");
                                        cfgReadConfig(ff, cfg);                                        if (ff) {
                                        fclose(ff);                                                cfg_ReadConfig(ff, cfg, lvl - 1);
                                } else                                                fclose(ff);
                                        EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file",                                         } else
                                                        AIT_GET_STR(&av->cfg_val));                                                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 183  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 202  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 RB_INSERT(tagRC, cfg, av);                  RB_INSERT(tagRC, cfg, av);
                 CFG_RC_UNLOCK(cfg);                  CFG_RC_UNLOCK(cfg);
   
                /* read include file */                if (lvl > 0) {
                if (!flg && *AIT_GET_STR(&av->cfg_attr) == '%' &&                         /* read include file */
                                !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {                        if (!flg && *AIT_GET_STR(&av->cfg_attr) == '%' && 
                        ff = fopen(AIT_GET_STR(&av->cfg_val), "r");                                        !strcmp(AIT_GET_STR(&av->cfg_attr), "%include")) {
                        if (ff) {                                ff = fopen(AIT_GET_STR(&av->cfg_val), "r");
                                cfgReadConfig(ff, cfg);                                if (ff) {
                                fclose(ff);                                        cfg_ReadConfig(ff, cfg, lvl - 1);
                        } else                                        fclose(ff);
                                EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file",                                 } else
                                                AIT_GET_STR(&av->cfg_val));                                        EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file", 
                                                         AIT_GET_STR(&av->cfg_val));
                         }
                 }                  }
         }          }
   
Line 413  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 483  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 578  cfgWriteLines(FILE *f, const char *delim, const char * Line 609  cfgWriteLines(FILE *f, const char *delim, const char *
                 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.20.2.1  
changed lines
  Added in v.1.23


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