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 +