69 UcxMapElement *elem = map->map[n]; |
69 UcxMapElement *elem = map->map[n]; |
70 if (elem != NULL) { |
70 if (elem != NULL) { |
71 do { |
71 do { |
72 UcxMapElement *next = elem->next; |
72 UcxMapElement *next = elem->next; |
73 map->allocator->free(map->allocator->pool, elem->key.data); |
73 map->allocator->free(map->allocator->pool, elem->key.data); |
74 free(elem); |
74 map->allocator->free(map->allocator->pool, elem); |
75 elem = next; |
75 elem = next; |
76 } while (elem != NULL); |
76 } while (elem != NULL); |
77 } |
77 } |
78 } |
78 } |
79 map->allocator->free(map->allocator->pool, map->map); |
79 map->allocator->free(map->allocator->pool, map->map); |
311 } |
311 } |
312 |
312 |
313 return 1; |
313 return 1; |
314 } |
314 } |
315 |
315 |
316 int ucx_map_load_enc(UcxMap *map, FILE *f, UcxAllocator allocator, |
|
317 ucx_map_coder decoder, void* decdata) { |
|
318 |
|
319 int c; int r, n; |
|
320 |
|
321 char *key, *value; |
|
322 |
|
323 while ((c = fgetc(f)) > 0) { |
|
324 /* Discard leading spaces and comments */ |
|
325 if (c < 33) continue; |
|
326 if (c == '#' || c == '!') { |
|
327 while ((c = (char) fgetc(f)) > 0) { |
|
328 if (c == '\n') break; |
|
329 } |
|
330 continue; |
|
331 } |
|
332 |
|
333 /* read into key buffer */ |
|
334 n = 16; |
|
335 key = (char*) malloc(n); |
|
336 r = 0; |
|
337 do { |
|
338 if (c == '=') break; |
|
339 if (r > n - 2) { |
|
340 n *= 2; |
|
341 key = (char*) realloc(key, n); |
|
342 } |
|
343 key[r] = c; |
|
344 r++; |
|
345 } while ((c = fgetc(f)) > 0); |
|
346 if (c <= 0) { |
|
347 free(key); |
|
348 return 1; |
|
349 } |
|
350 key[r] = 0; |
|
351 while (key[--r] == ' ') key[r] = 0; |
|
352 |
|
353 /* skip whitespaces */ |
|
354 while ((c = fgetc(f)) > 0) { |
|
355 if (c > 32) break; |
|
356 } |
|
357 if (c <= 0) { |
|
358 free(key); |
|
359 return 1; |
|
360 } |
|
361 |
|
362 /* read into value buffer */ |
|
363 n = 64; |
|
364 value = (char*) malloc(n); |
|
365 r = 0; |
|
366 do { |
|
367 if (c == '\n') break; |
|
368 if (r > n - 2) { |
|
369 n *= 2; |
|
370 value = (char*) realloc(value, n); |
|
371 } |
|
372 value[r] = c; |
|
373 r++; |
|
374 } while ((c = fgetc(f)) > 0); |
|
375 value[r] = 0; |
|
376 while (value[--r] < 33) value[r] = 0; |
|
377 |
|
378 if (decoder) { |
|
379 size_t decodedSize; |
|
380 void *decoded = decoder(value, decdata, &decodedSize); |
|
381 free(value); |
|
382 value = (char*) decoded; |
|
383 r = decodedSize; |
|
384 } else { |
|
385 r += 2; |
|
386 value = (char*) realloc(value, r); |
|
387 } |
|
388 |
|
389 if (allocator.pool) { |
|
390 void *pooledValue = allocator.malloc(allocator.pool, r); |
|
391 memcpy(pooledValue, value, r); |
|
392 free(value); |
|
393 value = (char*) pooledValue; |
|
394 } |
|
395 |
|
396 ucx_map_cstr_put(map, key, value); |
|
397 free(key); |
|
398 } |
|
399 |
|
400 return 0; |
|
401 } |
|
402 |
|
403 int ucx_map_store_enc(UcxMap *map, FILE *f, |
|
404 ucx_map_coder encoder, void *encdata) { |
|
405 UcxMapIterator iter = ucx_map_iterator(map); |
|
406 char *v; |
|
407 sstr_t key, value; |
|
408 size_t written; |
|
409 |
|
410 UCX_MAP_FOREACH(k, v, iter) { |
|
411 key = sstrn(k.data, k.len); |
|
412 if (encoder) { |
|
413 size_t encodedSize; |
|
414 void *encoded = encoder(v, encdata, &encodedSize); |
|
415 value = sstrn((char*) encoded,encodedSize - 1); |
|
416 } else { |
|
417 value = sstr(v); |
|
418 } |
|
419 |
|
420 written = 0; |
|
421 written += fwrite(key.ptr, 1, key.length, f); |
|
422 written += fwrite(" = ", 1, 3, f); |
|
423 written += fwrite(value.ptr, 1, value.length, f); |
|
424 written += fwrite("\n", 1, 1, f); |
|
425 |
|
426 if (encoder) { |
|
427 free(value.ptr); |
|
428 } |
|
429 |
|
430 if (written != key.length + value.length + 4) return 1; |
|
431 } |
|
432 |
|
433 return 0; |
|
434 } |
|