--- libaitcfg/src/parse.c 2008/08/28 13:17:41 1.1 +++ libaitcfg/src/parse.c 2009/09/09 09:29:37 1.2.2.1 @@ -1,3 +1,11 @@ +/************************************************************************* +* (C) 2008 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $Author: misho $ +* $Id: parse.c,v 1.2.2.1 2009/09/09 09:29:37 misho Exp $ +* +*************************************************************************/ #include "global.h" #include "aitcfg.h" #include "tools.h" @@ -16,6 +24,64 @@ static inline int cfgDbg(FILE *f, char *fmt, ...) return ret; } +// cfgWrite() Write to file from config list +static inline int cfgWrite(FILE *f, sl_config * __restrict cfg, int whitespace) +{ + struct tagPair *av; + time_t tim; + char szTime[MAX_STR + 1]; + u_char szSection[MAX_STR + 1]; + + bzero(szSection, MAX_STR + 1); + + bzero(szTime, MAX_STR + 1); + time(&tim); + strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); + if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) { + LOGERR; + return -1; + } + + for (av = cfg->slh_first; av; av = av->sle_next) { + if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) { + strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1); + if (!cfgDbg(f, "\n[%s]\n", av->psSection)) { + LOGERR; + return -1; + } + } + if (!av->psSection && *szSection) { + bzero(szSection, MAX_STR + 1); + if (!cfgDbg(f, "\n[]\n")) { + LOGERR; + return -1; + } + } + + if (whitespace) { + if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) { + LOGERR; + return -1; + } + } else { + if (!cfgDbg(f, "%s=%s\n", av->psAttribute, av->psValue)) { + LOGERR; + return -1; + } + } + } + + bzero(szTime, MAX_STR + 1); + time(&tim); + strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); + if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) { + LOGERR; + return -1; + } + + return 0; +} + // ----------------------------------------- /* @@ -55,7 +121,9 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) if (*szLine == '[') { pos = strlen((char*) szLine) - 1; if (szLine[pos] != ']') { +#ifdef __DEBUG cfgDbg(stdout, "WARNING:: Ignore section %s ... not closed breket\n", szLine); +#endif } else { szLine[pos] = 0; strncpy((char*) szSection, (char*) szLine + 1, MAX_STR); @@ -69,7 +137,9 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) // Devide pairs pos = strchr((char*) szLine, '=') ? strchr((char*) szLine, '=') - (char*) szLine : 0; if (!pos) { +#ifdef __DEBUG cfgDbg(stdout, "WARNING:: Ignore a/v %s ... format error!\n", szLine); +#endif continue; } else { av = malloc(sizeof(struct tagPair)); @@ -77,6 +147,7 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) LOGERR; return -1; } else { + memset(av, 0, sizeof(struct tagPair)); // added new element av->sle_next = cfg->slh_first; cfg->slh_first = av; @@ -89,7 +160,7 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) free(av); return -1; } else - strcpy((char*) av->psSection, (char*) szSection); + strlcpy((char*) av->psSection, (char*) szSection, strlen((char*) szSection) + 1); } else av->psSection = NULL; @@ -110,7 +181,7 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) free(av); return -1; } else - strcpy((char*) av->psAttribute, (char*) psAttr); + strlcpy((char*) av->psAttribute, (char*) psAttr, strlen((char*) psAttr) + 1); // added value to element av->psValue = malloc(strlen((char*) psVal) + 1); if (!av->psValue) { @@ -120,7 +191,7 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) free(av); return -1; } else - strcpy((char*) av->psValue, (char*) psVal); + strlcpy((char*) av->psValue, (char*) psVal, strlen((char*) psVal) + 1); } } @@ -135,51 +206,16 @@ int ReadConfig(FILE *f, sl_config * __restrict cfg) */ int WriteConfig(FILE *f, sl_config * __restrict cfg) { - struct tagPair *av; - time_t tim; - char szTime[MAX_STR + 1]; - u_char szSection[MAX_STR + 1]; + return cfgWrite(f, cfg, 1); +} - bzero(szSection, MAX_STR + 1); - - bzero(szTime, MAX_STR + 1); - time(&tim); - strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); - if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) { - LOGERR; - return -1; - } - - for (av = cfg->slh_first; av; av = av->sle_next) { - if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) { - bzero(szSection, MAX_STR + 1); - strcpy((char*) szSection, (char*) av->psSection); - if (!cfgDbg(f, "\n[%s]\n", av->psSection)) { - LOGERR; - return -1; - } - } - if (!av->psSection && *szSection) { - bzero(szSection, MAX_STR + 1); - if (!cfgDbg(f, "\n[]\n")) { - LOGERR; - return -1; - } - } - - if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) { - LOGERR; - return -1; - } - } - - bzero(szTime, MAX_STR + 1); - time(&tim); - strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); - if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) { - LOGERR; - return -1; - } - - return 0; +/* + * cfg_WriteConfig() Write to file from items in config list without whitespaces! + * @f = file resource + * @cfg = Head list element + * return: 0 ok; -1 error:: can`t write to file +*/ +int cfg_WriteConfig(FILE *f, sl_config * __restrict cfg) +{ + return cfgWrite(f, cfg, 0); }