ucx/map.c

changeset 42
ff3dd1ee7dee
parent 38
35f67a8ef875
child 43
02f38adea013
     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 +}

mercurial