diff --git a/src/hashmap.c b/src/hashmap.c index 837b21a..4d35ae3 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -341,6 +341,10 @@ apfl_hashmap_copy(apfl_hashmap src) struct bucket *dstbucket = &dst->buckets[i]; size_t len = srcbucket->len; + if (len == 0) { + continue; + } + dstbucket->keys = malloc(keysize * len); dstbucket->values = malloc(valsize * len); if (dstbucket->keys == NULL || dstbucket->values == NULL) { @@ -354,23 +358,25 @@ apfl_hashmap_copy(apfl_hashmap src) dstbucket->cap = len; - for (; dstbucket->len < len; dstbucket->len++) { - void *keyaddr = KVADDR(dstbucket->keys, keysize, dstbucket->len); - + for (size_t j = 0; j < len; j++) { copy_key( dst, - keyaddr, - KVADDR(srcbucket->keys, keysize, srcbucket->len) + KVADDR(dstbucket->keys, keysize, j), + KVADDR(srcbucket->keys, keysize, j) ); copy_value( dst, - KVADDR(dstbucket->values, valsize, dstbucket->len), - KVADDR(srcbucket->values, valsize, srcbucket->len) + KVADDR(dstbucket->values, valsize, j), + KVADDR(srcbucket->values, valsize, j) ); + + dstbucket->len++; } } + return dst; + fail: apfl_hashmap_destroy(dst); return NULL;