Diff for /libaitcfg/src/parse.c between versions 1.17 and 1.20

version 1.17, 2017/06/30 08:44:44 version 1.20, 2022/12/05 22:31:12
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 - 2017Copyright 2004 - 2021
         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 60  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 60  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
         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 68  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')
Line 97  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 99  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         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));                                  str_Unquot((char*) AIT_GET_STR(&av->cfg_val));
   
                           /* 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) {
                                           cfgReadConfig(ff, cfg);
                                           fclose(ff);
                                   } else
                                           EDEBUG(7, "Error:: Can't open %s file", 
                                                           AIT_GET_STR(&av->cfg_val));
                           }
                         continue;                          continue;
                 }                  }
   
Line 112  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 127  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 119  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 140  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 166  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 182  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);
   
                   /* 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) {
                                   cfgReadConfig(ff, cfg);
                                   fclose(ff);
                           } else
                                   EDEBUG(7, "Error:: Can't open %s file", 
                                                   AIT_GET_STR(&av->cfg_val));
                   }
         }          }
   
         return 0;          return 0;
Line 243  skip_sec: Line 271  skip_sec:
 }  }
   
 /*  /*
    * 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, "\n[%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[]\n")) {
                                   LOGERR;
                                   CFG_RC_UNLOCK(cfg);
                                   return -1;
                           }
                   }
   
                   /* build line */
                   memset(line, 0, sizeof line);
                   if (!AIT_ISEMPTY(&av->cfg_attr) && AIT_TYPE(&av->cfg_attr) == string) {
                           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)
                           strlcat(line, AIT_GET_STRZ(&av->cfg_val), 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;
   }
   /*
  * cfgConcatConfig() - Concat two configs into one   * cfgConcatConfig() - Concat two configs into one
  *   *
  * @cfg = Config root   * @cfg = Config root
Line 350  cfgReadLines(FILE *f, const char *delim, const char *e Line 448  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;

Removed from v.1.17  
changed lines
  Added in v.1.20


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