diff -r d2b1e67b2b48 -r 75cb6590358b ucx/properties.c --- a/ucx/properties.c Fri Jul 12 20:50:18 2013 +0200 +++ b/ucx/properties.c Sun Jul 14 17:11:34 2013 +0200 @@ -45,6 +45,7 @@ parser->tmp = NULL; parser->tmplen = 0; parser->tmpcap = 0; + parser->error = 0; parser->delimiter = '='; parser->comment1 = '#'; parser->comment2 = 0; @@ -106,7 +107,7 @@ parser->pos = newlen; /* - * if ret == 0 the tmp buffer contained just space or comment + * if ret == 0 the tmp buffer contained just space or a comment * we parse again with the original buffer to get a name/value * or a new tmp buffer */ @@ -126,10 +127,7 @@ char delimiter = parser->delimiter; // get one line and parse it - while(1) { - if(parser->pos >= parser->buflen) { - return 0; - } + while(parser->pos < parser->buflen) { char *buf = parser->buffer + parser->pos; size_t len = parser->buflen - parser->pos; @@ -160,7 +158,7 @@ } if(c != '\n') { - // we have not enough data for a line + // we don't have enough data for a line // store remaining bytes in temporary buffer for next round parser->tmpcap = len + 128; parser->tmp = (char*)malloc(parser->tmpcap); @@ -174,31 +172,96 @@ if(delimiter_index == 0) { line = sstrtrim(line); if(line.length != 0) { - // syntax error - // TODO + parser->error = 1; } - parser->pos += i + 1; - continue; + } else { + sstr_t n = sstrn(buf, delimiter_index); + sstr_t v = sstrn(buf+delimiter_index+1, i-delimiter_index-1); + n = sstrtrim(n); + v = sstrtrim(v); + if(n.length != 0 || v.length != 0) { + *name = n; + *value = v; + parser->pos += i + 1; + return 1; + } else { + parser->error = 1; + } } - sstr_t n = sstrn(buf, delimiter_index); - sstr_t v = sstrn(buf + delimiter_index + 1, i - delimiter_index - 1); - n = sstrtrim(n); - v = sstrtrim(v); - if(n.length == 0 || v.length == 0) { - // syntax error - // TODO - parser->pos += i + 1; - continue; - } - - *name = n; - *value = v; - parser->pos += i + 1; - break; } - return 1; + return 0; } +int ucx_prop_parse2map(UcxPropParser *parser, UcxMap *map) { + sstr_t name; + sstr_t value; + while(ucx_prop_parse(parser, &name, &value)) { + name = sstrdup_alloc(map->allocator, name); + if(!name.ptr) { + return 1; + } + value = sstrdup_alloc(map->allocator, value); + if(!value.ptr) { + map->allocator->free(map->allocator->pool, value.ptr); + return 1; + } + if(ucx_map_sstr_put(map, name, value.ptr)) { + map->allocator->free(map->allocator->pool, name.ptr); + map->allocator->free(map->allocator->pool, value.ptr); + return 1; + } + } + if(parser->error) { + return 1; + } else { + return 0; + } +} + +int ucx_properties_load(UcxMap *map, FILE *file) { + UcxPropParser *parser = ucx_prop_new(); + if(!parser || !map || !file) { + return 1; + } + + int error = 0; + size_t r; + char buf[1024]; + while((r = fread(buf, 1, 1024, file)) != 0) { + ucx_prop_fill(parser, buf, r); + if(ucx_prop_parse2map(parser, map)) { + error = 1; + break; + } + } + + ucx_prop_free(parser); + return error; +} + +int ucx_properties_store(UcxMap *map, FILE *file) { + UcxMapIterator iter = ucx_map_iterator(map); + char *k, *v; + sstr_t key, value; + size_t written; + + UCX_MAP_FOREACH(v, iter) { + k = (char*) iter.cur->key.data; + key = sstrn(k, iter.cur->key.len); + value = sstr(v); + + written = 0; + written += fwrite(key.ptr, 1, key.length, file); + written += fwrite(" = ", 1, 3, file); + written += fwrite(value.ptr, 1, value.length, file); + written += fwrite("\n", 1, 1, file); + + if (written != key.length + value.length + 4) return 1; + } + + return 0; +} +