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