#include "global.h" #include "aitcfg.h" #include "tools.h" // cfgDbg() Debug/Log operation static inline int cfgDbg(FILE *f, char *fmt, ...) { int ret = 0; va_list lst; va_start(lst, fmt); ret = vfprintf(f, fmt, lst); va_end(lst); return ret; } // ----------------------------------------- /* * ReadConfig() Read from file and add new item to config list * @f = file resource * @cfg = Head list element * return: 0 ok; -1 error:: can`t allocate memory */ int ReadConfig(FILE *f, sl_config * __restrict cfg) { u_char szLine[MAX_STR + 1]; u_char szSection[MAX_STR + 1], *psAttr, *psVal; int pos; struct tagPair *av; memset(szSection, 0, MAX_STR + 1); while (!feof(f)) { memset(szLine, 0, MAX_STR + 1); fgets((char*) szLine, MAX_STR, f); trim(szLine); #ifdef __DEBUG cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine); #endif // End of config if (*szLine == '.') break; // Comment if (*szLine == '#' || *szLine == ';' || !*szLine) continue; #ifdef __DEBUG cfgDbg(stdout, "DEBUG:: Clean |%s|\n", szLine); #endif // Section if (*szLine == '[') { pos = strlen((char*) szLine) - 1; if (szLine[pos] != ']') { cfgDbg(stdout, "WARNING:: Ignore section %s ... not closed breket\n", szLine); } else { szLine[pos] = 0; strncpy((char*) szSection, (char*) szLine + 1, MAX_STR); #ifdef __DEBUG cfgDbg(stdout, "DEBUG:: Section %s\n", szSection); #endif } continue; } // Devide pairs pos = strchr((char*) szLine, '=') ? strchr((char*) szLine, '=') - (char*) szLine : 0; if (!pos) { cfgDbg(stdout, "WARNING:: Ignore a/v %s ... format error!\n", szLine); continue; } else { av = malloc(sizeof(struct tagPair)); if (!av) { LOGERR; return -1; } else { // added new element av->sle_next = cfg->slh_first; cfg->slh_first = av; } // added section name to element if (*szSection) { av->psSection = malloc(strlen((char*) szSection) + 1); if (!av->psSection) { LOGERR; free(av); return -1; } else strcpy((char*) av->psSection, (char*) szSection); } else av->psSection = NULL; psAttr = szLine; psVal = (szLine + pos + 1); szLine[pos] = 0; rtrim(psAttr); ltrim(psVal); #ifdef __DEBUG cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n", psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal)); #endif // added attribute to element av->psAttribute = malloc(strlen((char*) psAttr) + 1); if (!av->psAttribute) { LOGERR; free(av->psSection); free(av); return -1; } else strcpy((char*) av->psAttribute, (char*) psAttr); // added value to element av->psValue = malloc(strlen((char*) psVal) + 1); if (!av->psValue) { LOGERR; free(av->psAttribute); free(av->psSection); free(av); return -1; } else strcpy((char*) av->psValue, (char*) psVal); } } return 0; } /* * WriteConfig() Write to file from items in config list * @f = file resource * @cfg = Head list element * return: 0 ok; -1 error:: can`t write to file */ 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]; 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; }