187 } |
187 } |
188 } |
188 } |
189 |
189 |
190 return 1; |
190 return 1; |
191 } |
191 } |
|
192 |
|
193 int ucx_map_load(UcxMap *map, FILE *f) { |
|
194 |
|
195 char c; int r, n; |
|
196 |
|
197 char *key, *value; |
|
198 |
|
199 while ((c = (char) fgetc(f)) > 0) { |
|
200 /* Discard leading spaces and comments */ |
|
201 if (c == ' ') continue; |
|
202 if (c == '#' || c == '!') { |
|
203 while ((c = (char) fgetc(f)) > 0) { |
|
204 if (c == '\n') break; |
|
205 } |
|
206 continue; |
|
207 } |
|
208 |
|
209 /* read into key buffer */ |
|
210 n = 16; |
|
211 key = malloc(n); |
|
212 r = 0; |
|
213 do { |
|
214 if (c == '=') break; |
|
215 if (r > n - 2) { |
|
216 n *= 2; |
|
217 key = realloc(key, n); |
|
218 } |
|
219 key[r] = c; |
|
220 r++; |
|
221 } while ((c = (char) fgetc(f)) > 0); |
|
222 if (c == 0) { |
|
223 free(key); |
|
224 return 1; |
|
225 } |
|
226 key[r] = 0; |
|
227 |
|
228 /* read into value buffer */ |
|
229 n = 64; |
|
230 value = malloc(n); |
|
231 r = 0; |
|
232 while ((c = (char) fgetc(f)) > 0) { |
|
233 if (c == '\n') break; |
|
234 if (r > n - 1) { |
|
235 n *= 2; |
|
236 value = realloc(value, n); |
|
237 } |
|
238 value[r] = c; |
|
239 r++; |
|
240 } |
|
241 value = realloc(value, r+1); |
|
242 value[r] = 0; |
|
243 |
|
244 ucx_map_cstr_put(map, key, value); |
|
245 free(key); |
|
246 } |
|
247 |
|
248 return 0; |
|
249 } |
|
250 |
|
251 int ucx_map_store(UcxMap *map, FILE *f) { |
|
252 UcxMapIterator iter = ucx_map_iterator(map); |
|
253 char *k, *v; |
|
254 sstr_t key, value; |
|
255 int written; |
|
256 |
|
257 UCX_MAP_FOREACH(v, iter) { |
|
258 k = (char*) iter.cur->key.data; |
|
259 key = sstr(k); value = sstr(v); |
|
260 |
|
261 written = 0; |
|
262 written += fwrite(key.ptr, 1, key.length, f); |
|
263 written += fwrite(" = ", 1, 3, f); |
|
264 written += fwrite(value.ptr, 1, value.length, f); |
|
265 written += fwrite("\n", 1, 1, f); |
|
266 |
|
267 if (written != key.length + value.length + 4) return 1; |
|
268 } |
|
269 |
|
270 return 0; |
|
271 } |