ucx/map.c

changeset 46
48ca036d7d9c
parent 45
dd03226c1a6b
child 48
621a4430c404
equal deleted inserted replaced
45:dd03226c1a6b 46:48ca036d7d9c
205 } 205 }
206 206
207 return 1; 207 return 1;
208 } 208 }
209 209
210 int ucx_map_load(UcxMap *map, FILE *f) { 210 int ucx_map_load_enc(UcxMap *map, FILE *f, copy_func decoder, void* decdata) {
211 211
212 int c; int r, n; 212 int c; int r, n;
213 213
214 char *key, *value; 214 char *key, *value;
215 215
265 value[r] = c; 265 value[r] = c;
266 r++; 266 r++;
267 } while ((c = fgetc(f)) > 0); 267 } while ((c = fgetc(f)) > 0);
268 value[r] = 0; 268 value[r] = 0;
269 while (value[--r] < 33) value[r] = 0; 269 while (value[--r] < 33) value[r] = 0;
270 value = realloc(value, r+2); 270
271 if (decoder == NULL) {
272 value = realloc(value, r+2);
273 } else {
274 void *decoded = decoder(value, decdata);
275 free(value);
276 value = decoded;
277 }
271 278
272 ucx_map_cstr_put(map, key, value); 279 ucx_map_cstr_put(map, key, value);
273 free(key); 280 free(key);
274 } 281 }
275 282
276 return 0; 283 return 0;
277 } 284 }
278 285
279 int ucx_map_store(UcxMap *map, FILE *f) { 286 int ucx_map_store_enc(UcxMap *map, FILE *f, copy_func encoder, void *encdata) {
280 UcxMapIterator iter = ucx_map_iterator(map); 287 UcxMapIterator iter = ucx_map_iterator(map);
281 char *k, *v; 288 char *k, *v;
282 sstr_t key, value; 289 sstr_t key, value;
283 int written; 290 int written;
284 291
285 UCX_MAP_FOREACH(v, iter) { 292 UCX_MAP_FOREACH(v, iter) {
286 k = (char*) iter.cur->key.data; 293 k = (char*) iter.cur->key.data;
287 key = sstr(k); value = sstr(v); 294 key = sstr(k);
295 if (encoder == NULL) {
296 value = sstr(v);
297 } else {
298 value = sstr(encoder(v, encdata));
299 }
288 300
289 written = 0; 301 written = 0;
290 written += fwrite(key.ptr, 1, key.length, f); 302 written += fwrite(key.ptr, 1, key.length, f);
291 written += fwrite(" = ", 1, 3, f); 303 written += fwrite(" = ", 1, 3, f);
292 written += fwrite(value.ptr, 1, value.length, f); 304 written += fwrite(value.ptr, 1, value.length, f);
293 written += fwrite("\n", 1, 1, f); 305 written += fwrite("\n", 1, 1, f);
294 306
307 if (encoder != NULL) {
308 free(value.ptr);
309 }
310
295 if (written != key.length + value.length + 4) return 1; 311 if (written != key.length + value.length + 4) return 1;
296 } 312 }
297 313
298 return 0; 314 return 0;
299 } 315 }

mercurial