ucx/properties.c

changeset 109
75cb6590358b
parent 108
d2b1e67b2b48
child 110
1cf71e56f01e
     1.1 --- a/ucx/properties.c	Fri Jul 12 20:50:18 2013 +0200
     1.2 +++ b/ucx/properties.c	Sun Jul 14 17:11:34 2013 +0200
     1.3 @@ -45,6 +45,7 @@
     1.4      parser->tmp = NULL;
     1.5      parser->tmplen = 0;
     1.6      parser->tmpcap = 0;
     1.7 +    parser->error = 0;
     1.8      parser->delimiter = '=';
     1.9      parser->comment1 = '#';
    1.10      parser->comment2 = 0;
    1.11 @@ -106,7 +107,7 @@
    1.12              parser->pos = newlen;
    1.13              
    1.14              /*
    1.15 -             * if ret == 0 the tmp buffer contained just space or comment
    1.16 +             * if ret == 0 the tmp buffer contained just space or a comment
    1.17               * we parse again with the original buffer to get a name/value
    1.18               * or a new tmp buffer
    1.19               */
    1.20 @@ -126,10 +127,7 @@
    1.21      char delimiter = parser->delimiter;
    1.22      
    1.23      // get one line and parse it
    1.24 -    while(1) {
    1.25 -        if(parser->pos >= parser->buflen) {
    1.26 -            return 0;
    1.27 -        }
    1.28 +    while(parser->pos < parser->buflen) {
    1.29          char *buf = parser->buffer + parser->pos;
    1.30          size_t len = parser->buflen - parser->pos;
    1.31          
    1.32 @@ -160,7 +158,7 @@
    1.33          }
    1.34  
    1.35          if(c != '\n') {
    1.36 -            // we have not enough data for a line
    1.37 +            // we don't have enough data for a line
    1.38              // store remaining bytes in temporary buffer for next round
    1.39              parser->tmpcap = len + 128;
    1.40              parser->tmp = (char*)malloc(parser->tmpcap);
    1.41 @@ -174,31 +172,96 @@
    1.42          if(delimiter_index == 0) {
    1.43              line = sstrtrim(line);
    1.44              if(line.length != 0) {
    1.45 -                // syntax error
    1.46 -                // TODO
    1.47 +                parser->error = 1;
    1.48              }
    1.49 -            parser->pos += i + 1;
    1.50 -            continue;
    1.51 +        } else {
    1.52 +            sstr_t n = sstrn(buf, delimiter_index);
    1.53 +            sstr_t v = sstrn(buf+delimiter_index+1, i-delimiter_index-1); 
    1.54 +            n = sstrtrim(n);
    1.55 +            v = sstrtrim(v);
    1.56 +            if(n.length != 0 || v.length != 0) {
    1.57 +                *name = n;
    1.58 +                *value = v;
    1.59 +                parser->pos += i + 1;
    1.60 +                return 1;
    1.61 +            } else {
    1.62 +                parser->error = 1;
    1.63 +            }
    1.64          }
    1.65          
    1.66 -        sstr_t n = sstrn(buf, delimiter_index);
    1.67 -        sstr_t v = sstrn(buf + delimiter_index + 1, i - delimiter_index - 1); 
    1.68 -        n = sstrtrim(n);
    1.69 -        v = sstrtrim(v);      
    1.70 -        if(n.length == 0 || v.length == 0) {
    1.71 -            // syntax error
    1.72 -            // TODO
    1.73 -            parser->pos += i + 1;
    1.74 -            continue;
    1.75 -        }
    1.76 -        
    1.77 -        *name = n;
    1.78 -        *value = v;
    1.79 -        
    1.80          parser->pos += i + 1;
    1.81 -        break;
    1.82      }
    1.83      
    1.84 -    return 1;
    1.85 +    return 0;
    1.86  }
    1.87  
    1.88 +int ucx_prop_parse2map(UcxPropParser *parser, UcxMap *map) {
    1.89 +    sstr_t name;
    1.90 +    sstr_t value;
    1.91 +    while(ucx_prop_parse(parser, &name, &value)) {
    1.92 +        name = sstrdup_alloc(map->allocator, name);
    1.93 +        if(!name.ptr) {
    1.94 +            return 1;
    1.95 +        }
    1.96 +        value = sstrdup_alloc(map->allocator, value);
    1.97 +        if(!value.ptr) {
    1.98 +            map->allocator->free(map->allocator->pool, value.ptr);
    1.99 +            return 1;
   1.100 +        }
   1.101 +        if(ucx_map_sstr_put(map, name, value.ptr)) {
   1.102 +            map->allocator->free(map->allocator->pool, name.ptr);
   1.103 +            map->allocator->free(map->allocator->pool, value.ptr);
   1.104 +            return 1;
   1.105 +        }
   1.106 +    }
   1.107 +    if(parser->error) {
   1.108 +        return 1;
   1.109 +    } else {
   1.110 +        return 0;
   1.111 +    }
   1.112 +}
   1.113 +
   1.114 +int ucx_properties_load(UcxMap *map, FILE *file) {
   1.115 +    UcxPropParser *parser = ucx_prop_new();
   1.116 +    if(!parser || !map || !file) {
   1.117 +        return 1;
   1.118 +    }
   1.119 +    
   1.120 +    int error = 0;
   1.121 +    size_t r;
   1.122 +    char buf[1024];
   1.123 +    while((r = fread(buf, 1, 1024, file)) != 0) {
   1.124 +        ucx_prop_fill(parser, buf, r);
   1.125 +        if(ucx_prop_parse2map(parser, map)) {
   1.126 +            error = 1;
   1.127 +            break;
   1.128 +        }
   1.129 +    }
   1.130 +    
   1.131 +    ucx_prop_free(parser);
   1.132 +    return error;
   1.133 +}
   1.134 +
   1.135 +int ucx_properties_store(UcxMap *map, FILE *file) {
   1.136 +    UcxMapIterator iter = ucx_map_iterator(map);
   1.137 +    char *k, *v;
   1.138 +    sstr_t key, value;
   1.139 +    size_t written;
   1.140 +
   1.141 +    UCX_MAP_FOREACH(v, iter) {
   1.142 +        k = (char*) iter.cur->key.data;
   1.143 +        key = sstrn(k, iter.cur->key.len);
   1.144 +        value = sstr(v);
   1.145 +
   1.146 +        written = 0;
   1.147 +        written += fwrite(key.ptr, 1, key.length, file);
   1.148 +        written += fwrite(" = ", 1, 3, file);
   1.149 +        written += fwrite(value.ptr, 1, value.length, file);
   1.150 +        written += fwrite("\n", 1, 1, file);
   1.151 +
   1.152 +        if (written != key.length + value.length + 4) return 1;
   1.153 +    }
   1.154 +
   1.155 +    return 0;
   1.156 +}
   1.157 +

mercurial