ucx/map.c

changeset 111
c8c59d7f4536
parent 108
d2b1e67b2b48
child 112
6384016df2a3
equal deleted inserted replaced
110:1cf71e56f01e 111:c8c59d7f4536
86 86
87 int ucx_map_copy(UcxMap *restrict from, UcxMap *restrict to, 87 int ucx_map_copy(UcxMap *restrict from, UcxMap *restrict to,
88 copy_func fnc, void *data) { 88 copy_func fnc, void *data) {
89 UcxMapIterator i = ucx_map_iterator(from); 89 UcxMapIterator i = ucx_map_iterator(from);
90 void *value; 90 void *value;
91 UCX_MAP_FOREACH(value, i) { 91 UCX_MAP_FOREACH(key, value, i) {
92 int ret = ucx_map_put(to, i.cur->key, fnc ? fnc(value, data) : value); 92 int ret = ucx_map_put(to, i.cur->key, fnc ? fnc(value, data) : value);
93 if(ret != 0) { 93 if(ret != 0) {
94 return 1; 94 return 1;
95 } 95 }
96 } 96 }
280 i.cur = NULL; 280 i.cur = NULL;
281 i.index = 0; 281 i.index = 0;
282 return i; 282 return i;
283 } 283 }
284 284
285 int ucx_map_iter_next(UcxMapIterator *i, void **elm) { 285 int ucx_map_iter_next(UcxMapIterator *i, UcxKey *key, void **elm) {
286 UcxMapElement *e = i->cur; 286 UcxMapElement *e = i->cur;
287 287
288 if(e == NULL) { 288 if(e == NULL) {
289 e = i->map->map[0]; 289 e = i->map->map[0];
290 } else { 290 } else {
294 while(i->index < i->map->size) { 294 while(i->index < i->map->size) {
295 if(e != NULL) { 295 if(e != NULL) {
296 if(e->data != NULL) { 296 if(e->data != NULL) {
297 i->cur = e; 297 i->cur = e;
298 *elm = e->data; 298 *elm = e->data;
299 *key = e->key;
299 return 0; 300 return 0;
300 } 301 }
301 302
302 e = e->next; 303 e = e->next;
303 } else { 304 } else {
400 } 401 }
401 402
402 int ucx_map_store_enc(UcxMap *map, FILE *f, 403 int ucx_map_store_enc(UcxMap *map, FILE *f,
403 ucx_map_coder encoder, void *encdata) { 404 ucx_map_coder encoder, void *encdata) {
404 UcxMapIterator iter = ucx_map_iterator(map); 405 UcxMapIterator iter = ucx_map_iterator(map);
405 char *k, *v; 406 char *v;
406 sstr_t key, value; 407 sstr_t key, value;
407 size_t written; 408 size_t written;
408 409
409 UCX_MAP_FOREACH(v, iter) { 410 UCX_MAP_FOREACH(k, v, iter) {
410 k = (char*) iter.cur->key.data; 411 key = sstrn(k.data, k.len);
411 key = sstrn(k, iter.cur->key.len);
412 if (encoder) { 412 if (encoder) {
413 size_t encodedSize; 413 size_t encodedSize;
414 void *encoded = encoder(v, encdata, &encodedSize); 414 void *encoded = encoder(v, encdata, &encodedSize);
415 value = sstrn((char*) encoded,encodedSize - 1); 415 value = sstrn((char*) encoded,encodedSize - 1);
416 } else { 416 } else {

mercurial