ucx/map.c

changeset 48
621a4430c404
parent 46
48ca036d7d9c
child 51
1c78cd19fb6b
equal deleted inserted replaced
46:48ca036d7d9c 48:621a4430c404
205 } 205 }
206 206
207 return 1; 207 return 1;
208 } 208 }
209 209
210 int ucx_map_load_enc(UcxMap *map, FILE *f, copy_func decoder, void* decdata) { 210 int ucx_map_load_enc(UcxMap *map, FILE *f, UcxAllocator allocator,
211 ucx_map_coder decoder, void* decdata) {
211 212
212 int c; int r, n; 213 int c; int r, n;
213 214
214 char *key, *value; 215 char *key, *value;
215 216
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 }

mercurial