ucx/map.c

changeset 42
ff3dd1ee7dee
parent 38
35f67a8ef875
child 43
02f38adea013
equal deleted inserted replaced
41:7f90a03e186e 42:ff3dd1ee7dee
187 } 187 }
188 } 188 }
189 189
190 return 1; 190 return 1;
191 } 191 }
192
193 int ucx_map_load(UcxMap *map, FILE *f) {
194
195 char c; int r, n;
196
197 char *key, *value;
198
199 while ((c = (char) fgetc(f)) > 0) {
200 /* Discard leading spaces and comments */
201 if (c == ' ') continue;
202 if (c == '#' || c == '!') {
203 while ((c = (char) fgetc(f)) > 0) {
204 if (c == '\n') break;
205 }
206 continue;
207 }
208
209 /* read into key buffer */
210 n = 16;
211 key = malloc(n);
212 r = 0;
213 do {
214 if (c == '=') break;
215 if (r > n - 2) {
216 n *= 2;
217 key = realloc(key, n);
218 }
219 key[r] = c;
220 r++;
221 } while ((c = (char) fgetc(f)) > 0);
222 if (c == 0) {
223 free(key);
224 return 1;
225 }
226 key[r] = 0;
227
228 /* read into value buffer */
229 n = 64;
230 value = malloc(n);
231 r = 0;
232 while ((c = (char) fgetc(f)) > 0) {
233 if (c == '\n') break;
234 if (r > n - 1) {
235 n *= 2;
236 value = realloc(value, n);
237 }
238 value[r] = c;
239 r++;
240 }
241 value = realloc(value, r+1);
242 value[r] = 0;
243
244 ucx_map_cstr_put(map, key, value);
245 free(key);
246 }
247
248 return 0;
249 }
250
251 int ucx_map_store(UcxMap *map, FILE *f) {
252 UcxMapIterator iter = ucx_map_iterator(map);
253 char *k, *v;
254 sstr_t key, value;
255 int written;
256
257 UCX_MAP_FOREACH(v, iter) {
258 k = (char*) iter.cur->key.data;
259 key = sstr(k); value = sstr(v);
260
261 written = 0;
262 written += fwrite(key.ptr, 1, key.length, f);
263 written += fwrite(" = ", 1, 3, f);
264 written += fwrite(value.ptr, 1, value.length, f);
265 written += fwrite("\n", 1, 1, f);
266
267 if (written != key.length + value.length + 4) return 1;
268 }
269
270 return 0;
271 }

mercurial