Annotation of libaitcfg/src/parse.c, revision 1.2
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 $
! 6: * $Id: parse.c,v 1.1.1.1.2.4 2009/05/25 07:43:51 misho Exp $
! 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:
27: // -----------------------------------------
28:
29: /*
30: * ReadConfig() Read from file and add new item to config list
31: * @f = file resource
32: * @cfg = Head list element
33: * return: 0 ok; -1 error:: can`t allocate memory
34: */
35: int ReadConfig(FILE *f, sl_config * __restrict cfg)
36: {
37: u_char szLine[MAX_STR + 1];
38: u_char szSection[MAX_STR + 1], *psAttr, *psVal;
39: int pos;
40: struct tagPair *av;
41:
42: memset(szSection, 0, MAX_STR + 1);
43: while (!feof(f)) {
44: memset(szLine, 0, MAX_STR + 1);
45: fgets((char*) szLine, MAX_STR, f);
46: trim(szLine);
47: #ifdef __DEBUG
48: cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine);
49: #endif
50:
51: // End of config
52: if (*szLine == '.')
53: break;
54: // Comment
55: if (*szLine == '#' || *szLine == ';' || !*szLine)
56: continue;
57:
58: #ifdef __DEBUG
59: cfgDbg(stdout, "DEBUG:: Clean |%s|\n", szLine);
60: #endif
61:
62: // Section
63: if (*szLine == '[') {
64: pos = strlen((char*) szLine) - 1;
65: if (szLine[pos] != ']') {
1.2 ! misho 66: #ifdef __DEBUG
1.1 misho 67: cfgDbg(stdout, "WARNING:: Ignore section %s ... not closed breket\n", szLine);
1.2 ! misho 68: #endif
1.1 misho 69: } else {
70: szLine[pos] = 0;
71: strncpy((char*) szSection, (char*) szLine + 1, MAX_STR);
72: #ifdef __DEBUG
73: cfgDbg(stdout, "DEBUG:: Section %s\n", szSection);
74: #endif
75: }
76: continue;
77: }
78:
79: // Devide pairs
80: pos = strchr((char*) szLine, '=') ? strchr((char*) szLine, '=') - (char*) szLine : 0;
81: if (!pos) {
1.2 ! misho 82: #ifdef __DEBUG
1.1 misho 83: cfgDbg(stdout, "WARNING:: Ignore a/v %s ... format error!\n", szLine);
1.2 ! misho 84: #endif
1.1 misho 85: continue;
86: } else {
87: av = malloc(sizeof(struct tagPair));
88: if (!av) {
89: LOGERR;
90: return -1;
91: } else {
1.2 ! misho 92: memset(av, 0, sizeof(struct tagPair));
1.1 misho 93: // added new element
94: av->sle_next = cfg->slh_first;
95: cfg->slh_first = av;
96: }
97: // added section name to element
98: if (*szSection) {
99: av->psSection = malloc(strlen((char*) szSection) + 1);
100: if (!av->psSection) {
101: LOGERR;
102: free(av);
103: return -1;
104: } else
1.2 ! misho 105: strlcpy((char*) av->psSection, (char*) szSection, strlen((char*) szSection) + 1);
1.1 misho 106: } else
107: av->psSection = NULL;
108:
109: psAttr = szLine;
110: psVal = (szLine + pos + 1);
111: szLine[pos] = 0;
112: rtrim(psAttr);
113: ltrim(psVal);
114: #ifdef __DEBUG
115: cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n",
116: psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal));
117: #endif
118: // added attribute to element
119: av->psAttribute = malloc(strlen((char*) psAttr) + 1);
120: if (!av->psAttribute) {
121: LOGERR;
122: free(av->psSection);
123: free(av);
124: return -1;
125: } else
1.2 ! misho 126: strlcpy((char*) av->psAttribute, (char*) psAttr, strlen((char*) psAttr) + 1);
1.1 misho 127: // added value to element
128: av->psValue = malloc(strlen((char*) psVal) + 1);
129: if (!av->psValue) {
130: LOGERR;
131: free(av->psAttribute);
132: free(av->psSection);
133: free(av);
134: return -1;
135: } else
1.2 ! misho 136: strlcpy((char*) av->psValue, (char*) psVal, strlen((char*) psVal) + 1);
1.1 misho 137: }
138: }
139:
140: return 0;
141: }
142:
143: /*
144: * WriteConfig() Write to file from items in config list
145: * @f = file resource
146: * @cfg = Head list element
147: * return: 0 ok; -1 error:: can`t write to file
148: */
149: int WriteConfig(FILE *f, sl_config * __restrict cfg)
150: {
151: struct tagPair *av;
152: time_t tim;
153: char szTime[MAX_STR + 1];
154: u_char szSection[MAX_STR + 1];
155:
156: bzero(szSection, MAX_STR + 1);
157:
158: bzero(szTime, MAX_STR + 1);
159: time(&tim);
160: strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
161: if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) {
162: LOGERR;
163: return -1;
164: }
165:
166: for (av = cfg->slh_first; av; av = av->sle_next) {
167: if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) {
1.2 ! misho 168: strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1);
1.1 misho 169: if (!cfgDbg(f, "\n[%s]\n", av->psSection)) {
170: LOGERR;
171: return -1;
172: }
173: }
174: if (!av->psSection && *szSection) {
175: bzero(szSection, MAX_STR + 1);
176: if (!cfgDbg(f, "\n[]\n")) {
177: LOGERR;
178: return -1;
179: }
180: }
181:
182: if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) {
183: LOGERR;
184: return -1;
185: }
186: }
187:
188: bzero(szTime, MAX_STR + 1);
189: time(&tim);
190: strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
191: if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) {
192: LOGERR;
193: return -1;
194: }
195:
196: return 0;
197: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>