ucx/map.c

changeset 112
6384016df2a3
parent 111
c8c59d7f4536
child 116
234920008754
equal deleted inserted replaced
111:c8c59d7f4536 112:6384016df2a3
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 }

mercurial