Diff for /libaitcfg/src/parse.c between versions 1.19 and 1.22

version 1.19, 2021/11/26 01:15:03 version 1.22, 2025/08/19 11:43:53
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 - 2021Copyright 2004 - 2025
         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 56  SUCH DAMAGE. Line 56  SUCH DAMAGE.
 int  int
 cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
 {  {
        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 69  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 69  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);                          strlcpy(origin, line, sizeof origin);
Line 97  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 104  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));
   
                         /* read include file */                          /* read include file */
                         if (!flg && AIT_ADDR(&av->cfg_val) &&                           if (!flg && AIT_ADDR(&av->cfg_val) && 
Line 108  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 115  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                                         cfgReadConfig(ff, cfg);                                          cfgReadConfig(ff, cfg);
                                         fclose(ff);                                          fclose(ff);
                                 } else                                  } else
                                        EDEBUG(7, "Error:: Can't open %s file",                                         EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file", 
                                                         AIT_GET_STR(&av->cfg_val));                                                          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 148  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 165  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, origin);                          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 172  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 189  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 190  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 207  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                                 cfgReadConfig(ff, cfg);                                  cfgReadConfig(ff, cfg);
                                 fclose(ff);                                  fclose(ff);
                         } else                          } else
                                EDEBUG(7, "Error:: Can't open %s file",                                 EDEBUG(ELWIX_DEBUG_LOG, "Error:: Can't open %s file", 
                                                 AIT_GET_STR(&av->cfg_val));                                                  AIT_GET_STR(&av->cfg_val));
                 }                  }
         }          }
Line 231  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 248  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                 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_STRZ(&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, "[%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) {                  } else 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")) {
                                 LOGERR;                                  LOGERR;
                                 CFG_RC_UNLOCK(cfg);                                  CFG_RC_UNLOCK(cfg);
                                 return -1;                                  return -1;
Line 254  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 271  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)) {
Line 302  cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg Line 324  cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg
                 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_STRZ(&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, "[%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) {                  } else 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")) {
                                 LOGERR;                                  LOGERR;
                                 CFG_RC_UNLOCK(cfg);                                  CFG_RC_UNLOCK(cfg);
                                 return -1;                                  return -1;
Line 325  cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg Line 347  cfgWriteConfigRaw(FILE *f, cfg_root_t * __restrict cfg
                         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)) {
Line 402  cfgMergeConfig(cfg_root_t * __restrict cfg, cfg_root_t Line 429  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 447  cfgReadLines(FILE *f, const char *delim, const char *e Line 480  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 471  cfgReadLines(FILE *f, const char *delim, const char *e Line 505  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 484  cfgReadLines(FILE *f, const char *delim, const char *e Line 522  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 554  cfgWriteLines(FILE *f, const char *delim, const char * Line 594  cfgWriteLines(FILE *f, const char *delim, const char *
                         AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_attr));                          AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_attr));
                         AIT_SET_STRCAT(v, delim);                          AIT_SET_STRCAT(v, delim);
                 }                  }
                if (!AIT_ISEMPTY(&av->cfg_val))                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);
         }          }
   

Removed from v.1.19  
changed lines
  Added in v.1.22


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