1.1 --- a/ucx/map.c Thu Oct 04 14:08:31 2012 +0200 1.2 +++ b/ucx/map.c Thu Oct 04 16:03:18 2012 +0200 1.3 @@ -189,3 +189,83 @@ 1.4 1.5 return 1; 1.6 } 1.7 + 1.8 +int ucx_map_load(UcxMap *map, FILE *f) { 1.9 + 1.10 + char c; int r, n; 1.11 + 1.12 + char *key, *value; 1.13 + 1.14 + while ((c = (char) fgetc(f)) > 0) { 1.15 + /* Discard leading spaces and comments */ 1.16 + if (c == ' ') continue; 1.17 + if (c == '#' || c == '!') { 1.18 + while ((c = (char) fgetc(f)) > 0) { 1.19 + if (c == '\n') break; 1.20 + } 1.21 + continue; 1.22 + } 1.23 + 1.24 + /* read into key buffer */ 1.25 + n = 16; 1.26 + key = malloc(n); 1.27 + r = 0; 1.28 + do { 1.29 + if (c == '=') break; 1.30 + if (r > n - 2) { 1.31 + n *= 2; 1.32 + key = realloc(key, n); 1.33 + } 1.34 + key[r] = c; 1.35 + r++; 1.36 + } while ((c = (char) fgetc(f)) > 0); 1.37 + if (c == 0) { 1.38 + free(key); 1.39 + return 1; 1.40 + } 1.41 + key[r] = 0; 1.42 + 1.43 + /* read into value buffer */ 1.44 + n = 64; 1.45 + value = malloc(n); 1.46 + r = 0; 1.47 + while ((c = (char) fgetc(f)) > 0) { 1.48 + if (c == '\n') break; 1.49 + if (r > n - 1) { 1.50 + n *= 2; 1.51 + value = realloc(value, n); 1.52 + } 1.53 + value[r] = c; 1.54 + r++; 1.55 + } 1.56 + value = realloc(value, r+1); 1.57 + value[r] = 0; 1.58 + 1.59 + ucx_map_cstr_put(map, key, value); 1.60 + free(key); 1.61 + } 1.62 + 1.63 + return 0; 1.64 +} 1.65 + 1.66 +int ucx_map_store(UcxMap *map, FILE *f) { 1.67 + UcxMapIterator iter = ucx_map_iterator(map); 1.68 + char *k, *v; 1.69 + sstr_t key, value; 1.70 + int written; 1.71 + 1.72 + UCX_MAP_FOREACH(v, iter) { 1.73 + k = (char*) iter.cur->key.data; 1.74 + key = sstr(k); value = sstr(v); 1.75 + 1.76 + written = 0; 1.77 + written += fwrite(key.ptr, 1, key.length, f); 1.78 + written += fwrite(" = ", 1, 3, f); 1.79 + written += fwrite(value.ptr, 1, value.length, f); 1.80 + written += fwrite("\n", 1, 1, f); 1.81 + 1.82 + if (written != key.length + value.length + 4) return 1; 1.83 + } 1.84 + 1.85 + return 0; 1.86 +}