266 r++; |
267 r++; |
267 } while ((c = fgetc(f)) > 0); |
268 } while ((c = fgetc(f)) > 0); |
268 value[r] = 0; |
269 value[r] = 0; |
269 while (value[--r] < 33) value[r] = 0; |
270 while (value[--r] < 33) value[r] = 0; |
270 |
271 |
271 if (decoder == NULL) { |
272 if (decoder) { |
272 value = realloc(value, r+2); |
273 size_t decodedSize; |
273 } else { |
274 void *decoded = decoder(value, decdata, &decodedSize); |
274 void *decoded = decoder(value, decdata); |
|
275 free(value); |
275 free(value); |
276 value = decoded; |
276 value = decoded; |
|
277 r = decodedSize; |
|
278 } else { |
|
279 r += 2; |
|
280 value = realloc(value, r); |
|
281 } |
|
282 |
|
283 if (allocator.pool) { |
|
284 void *pooledValue = allocator.malloc(allocator.pool, r); |
|
285 memcpy(pooledValue, value, r); |
|
286 free(value); |
|
287 value = pooledValue; |
277 } |
288 } |
278 |
289 |
279 ucx_map_cstr_put(map, key, value); |
290 ucx_map_cstr_put(map, key, value); |
280 free(key); |
291 free(key); |
281 } |
292 } |
282 |
293 |
283 return 0; |
294 return 0; |
284 } |
295 } |
285 |
296 |
286 int ucx_map_store_enc(UcxMap *map, FILE *f, copy_func encoder, void *encdata) { |
297 int ucx_map_store_enc(UcxMap *map, FILE *f, |
|
298 ucx_map_coder encoder, void *encdata) { |
287 UcxMapIterator iter = ucx_map_iterator(map); |
299 UcxMapIterator iter = ucx_map_iterator(map); |
288 char *k, *v; |
300 char *k, *v; |
289 sstr_t key, value; |
301 sstr_t key, value; |
290 int written; |
302 int written; |
291 |
303 |
292 UCX_MAP_FOREACH(v, iter) { |
304 UCX_MAP_FOREACH(v, iter) { |
293 k = (char*) iter.cur->key.data; |
305 k = (char*) iter.cur->key.data; |
294 key = sstr(k); |
306 key = sstr(k); |
295 if (encoder == NULL) { |
307 if (encoder) { |
|
308 size_t encodedSize; |
|
309 void *encoded = encoder(v, encdata, &encodedSize); |
|
310 value = sstrn(encoded,encodedSize - 1); |
|
311 } else { |
296 value = sstr(v); |
312 value = sstr(v); |
297 } else { |
|
298 value = sstr(encoder(v, encdata)); |
|
299 } |
313 } |
300 |
314 |
301 written = 0; |
315 written = 0; |
302 written += fwrite(key.ptr, 1, key.length, f); |
316 written += fwrite(key.ptr, 1, key.length, f); |
303 written += fwrite(" = ", 1, 3, f); |
317 written += fwrite(" = ", 1, 3, f); |
304 written += fwrite(value.ptr, 1, value.length, f); |
318 written += fwrite(value.ptr, 1, value.length, f); |
305 written += fwrite("\n", 1, 1, f); |
319 written += fwrite("\n", 1, 1, f); |
306 |
320 |
307 if (encoder != NULL) { |
321 if (encoder) { |
308 free(value.ptr); |
322 free(value.ptr); |
309 } |
323 } |
310 |
324 |
311 if (written != key.length + value.length + 4) return 1; |
325 if (written != key.length + value.length + 4) return 1; |
312 } |
326 } |