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

version 1.14, 2014/01/30 08:30:47 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 - 2014Copyright 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 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];        char line[BUFSIZ], origin[BUFSIZ];
         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 79  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 81  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                         continue;                          continue;
                 } else {                  } else {
                         *psAttr = 0;                          *psAttr = 0;
                           strlcpy(origin, line, sizeof origin);
                         str_Trim(line);                          str_Trim(line);
                 }                  }
   
Line 96  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 111  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 118  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 137  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg) Line 154  cfgReadConfig(FILE *f, cfg_root_t * __restrict cfg)
                 }                  }
                 /* 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(7, "Ignore a/v '%s' ... not found '='", line);
                         continue;                          continue;
                 } else {                  } else {
Line 165  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 182  int Line 211  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 190  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i Line 218  cfgWriteConfig(FILE *f, cfg_root_t * __restrict cfg, i
                 return -1;                  return -1;
         }          }
   
         if (whitespace) {  
                 time(&tim);  
                 memset(line, 0, sizeof line);  
                 strftime(line, sizeof line, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));  
                 cfg_Write(f, "## Config auto-generated at :: %s ##\n", line);  
         }  
   
         CFG_RC_LOCK(cfg);          CFG_RC_LOCK(cfg);
         RB_FOREACH(av, tagRC, cfg) {          RB_FOREACH(av, tagRC, cfg) {
                 /* empty lines or comment */                  /* empty lines or comment */
Line 246  skip_sec: Line 267  skip_sec:
         }          }
         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, "\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);                  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)
                         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;          return 0;
 }  }
   
 /*  /*
  * cfgConcatConfig() - Concat two configs into one   * cfgConcatConfig() - Concat two configs into one
  *   *
Line 364  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;
Line 456  cfgWriteLines(FILE *f, const char *delim, const char * Line 541  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;
Line 469  cfgWriteLines(FILE *f, const char *delim, const char * Line 552  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));
                         AIT_SET_STRCAT(v, delim);
                 }
                 if (!AIT_ISEMPTY(&av->cfg_val))                  if (!AIT_ISEMPTY(&av->cfg_val))
                         AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));                          AIT_SET_STRCAT(v, AIT_GET_STR(&av->cfg_val));
                 AIT_SET_STRCAT(v, eol);                  AIT_SET_STRCAT(v, eol);

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


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