Annotation of libaitcfg/src/parse.c, revision 1.2.2.1
1.2 misho 1: /*************************************************************************
2: * (C) 2008 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
3: * by Michael Pounov <misho@openbsd-bg.org>
4: *
5: * $Author: misho $
1.2.2.1 ! misho 6: * $Id: parse.c,v 1.2 2009/09/09 09:07:31 misho Exp $
1.2 misho 7: *
8: *************************************************************************/
1.1 misho 9: #include "global.h"
10: #include "aitcfg.h"
11: #include "tools.h"
12:
13:
14: // cfgDbg() Debug/Log operation
15: static inline int cfgDbg(FILE *f, char *fmt, ...)
16: {
17: int ret = 0;
18: va_list lst;
19:
20: va_start(lst, fmt);
21: ret = vfprintf(f, fmt, lst);
22: va_end(lst);
23:
24: return ret;
25: }
26:
1.2.2.1 ! misho 27: // cfgWrite() Write to file from config list
! 28: static inline int cfgWrite(FILE *f, sl_config * __restrict cfg, int whitespace)
! 29: {
! 30: struct tagPair *av;
! 31: time_t tim;
! 32: char szTime[MAX_STR + 1];
! 33: u_char szSection[MAX_STR + 1];
! 34:
! 35: bzero(szSection, MAX_STR + 1);
! 36:
! 37: bzero(szTime, MAX_STR + 1);
! 38: time(&tim);
! 39: strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
! 40: if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) {
! 41: LOGERR;
! 42: return -1;
! 43: }
! 44:
! 45: for (av = cfg->slh_first; av; av = av->sle_next) {
! 46: if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) {
! 47: strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1);
! 48: if (!cfgDbg(f, "\n[%s]\n", av->psSection)) {
! 49: LOGERR;
! 50: return -1;
! 51: }
! 52: }
! 53: if (!av->psSection && *szSection) {
! 54: bzero(szSection, MAX_STR + 1);
! 55: if (!cfgDbg(f, "\n[]\n")) {
! 56: LOGERR;
! 57: return -1;
! 58: }
! 59: }
! 60:
! 61: if (whitespace) {
! 62: if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) {
! 63: LOGERR;
! 64: return -1;
! 65: }
! 66: } else {
! 67: if (!cfgDbg(f, "%s=%s\n", av->psAttribute, av->psValue)) {
! 68: LOGERR;
! 69: return -1;
! 70: }
! 71: }
! 72: }
! 73:
! 74: bzero(szTime, MAX_STR + 1);
! 75: time(&tim);
! 76: strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
! 77: if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) {
! 78: LOGERR;
! 79: return -1;
! 80: }
! 81:
! 82: return 0;
! 83: }
! 84:
1.1 misho 85: // -----------------------------------------
86:
87: /*
88: * ReadConfig() Read from file and add new item to config list
89: * @f = file resource
90: * @cfg = Head list element
91: * return: 0 ok; -1 error:: can`t allocate memory
92: */
93: int ReadConfig(FILE *f, sl_config * __restrict cfg)
94: {
95: u_char szLine[MAX_STR + 1];
96: u_char szSection[MAX_STR + 1], *psAttr, *psVal;
97: int pos;
98: struct tagPair *av;
99:
100: memset(szSection, 0, MAX_STR + 1);
101: while (!feof(f)) {
102: memset(szLine, 0, MAX_STR + 1);
103: fgets((char*) szLine, MAX_STR, f);
104: trim(szLine);
105: #ifdef __DEBUG
106: cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine);
107: #endif
108:
109: // End of config
110: if (*szLine == '.')
111: break;
112: // Comment
113: if (*szLine == '#' || *szLine == ';' || !*szLine)
114: continue;
115:
116: #ifdef __DEBUG
117: cfgDbg(stdout, "DEBUG:: Clean |%s|\n", szLine);
118: #endif
119:
120: // Section
121: if (*szLine == '[') {
122: pos = strlen((char*) szLine) - 1;
123: if (szLine[pos] != ']') {
1.2 misho 124: #ifdef __DEBUG
1.1 misho 125: cfgDbg(stdout, "WARNING:: Ignore section %s ... not closed breket\n", szLine);
1.2 misho 126: #endif
1.1 misho 127: } else {
128: szLine[pos] = 0;
129: strncpy((char*) szSection, (char*) szLine + 1, MAX_STR);
130: #ifdef __DEBUG
131: cfgDbg(stdout, "DEBUG:: Section %s\n", szSection);
132: #endif
133: }
134: continue;
135: }
136:
137: // Devide pairs
138: pos = strchr((char*) szLine, '=') ? strchr((char*) szLine, '=') - (char*) szLine : 0;
139: if (!pos) {
1.2 misho 140: #ifdef __DEBUG
1.1 misho 141: cfgDbg(stdout, "WARNING:: Ignore a/v %s ... format error!\n", szLine);
1.2 misho 142: #endif
1.1 misho 143: continue;
144: } else {
145: av = malloc(sizeof(struct tagPair));
146: if (!av) {
147: LOGERR;
148: return -1;
149: } else {
1.2 misho 150: memset(av, 0, sizeof(struct tagPair));
1.1 misho 151: // added new element
152: av->sle_next = cfg->slh_first;
153: cfg->slh_first = av;
154: }
155: // added section name to element
156: if (*szSection) {
157: av->psSection = malloc(strlen((char*) szSection) + 1);
158: if (!av->psSection) {
159: LOGERR;
160: free(av);
161: return -1;
162: } else
1.2 misho 163: strlcpy((char*) av->psSection, (char*) szSection, strlen((char*) szSection) + 1);
1.1 misho 164: } else
165: av->psSection = NULL;
166:
167: psAttr = szLine;
168: psVal = (szLine + pos + 1);
169: szLine[pos] = 0;
170: rtrim(psAttr);
171: ltrim(psVal);
172: #ifdef __DEBUG
173: cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n",
174: psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal));
175: #endif
176: // added attribute to element
177: av->psAttribute = malloc(strlen((char*) psAttr) + 1);
178: if (!av->psAttribute) {
179: LOGERR;
180: free(av->psSection);
181: free(av);
182: return -1;
183: } else
1.2 misho 184: strlcpy((char*) av->psAttribute, (char*) psAttr, strlen((char*) psAttr) + 1);
1.1 misho 185: // added value to element
186: av->psValue = malloc(strlen((char*) psVal) + 1);
187: if (!av->psValue) {
188: LOGERR;
189: free(av->psAttribute);
190: free(av->psSection);
191: free(av);
192: return -1;
193: } else
1.2 misho 194: strlcpy((char*) av->psValue, (char*) psVal, strlen((char*) psVal) + 1);
1.1 misho 195: }
196: }
197:
198: return 0;
199: }
200:
201: /*
202: * WriteConfig() Write to file from items in config list
203: * @f = file resource
204: * @cfg = Head list element
205: * return: 0 ok; -1 error:: can`t write to file
206: */
207: int WriteConfig(FILE *f, sl_config * __restrict cfg)
208: {
1.2.2.1 ! misho 209: return cfgWrite(f, cfg, 1);
! 210: }
1.1 misho 211:
1.2.2.1 ! misho 212: /*
! 213: * cfg_WriteConfig() Write to file from items in config list without whitespaces!
! 214: * @f = file resource
! 215: * @cfg = Head list element
! 216: * return: 0 ok; -1 error:: can`t write to file
! 217: */
! 218: int cfg_WriteConfig(FILE *f, sl_config * __restrict cfg)
! 219: {
! 220: return cfgWrite(f, cfg, 0);
1.1 misho 221: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>