Skip to content

Commit

Permalink
Indefinite arrays encoding and memory fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
PJK committed Apr 26, 2015
1 parent 4f16880 commit cc3e4c9
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/cbor.c
Original file line number Diff line number Diff line change
Expand Up @@ -1239,7 +1239,7 @@ cbor_item_t *cbor_new_indefinite_array()
cbor_item_t *cbor_array_push(cbor_item_t *array, cbor_item_t *pushee)
{
assert(cbor_isa_array(array));
//TODO cbor_incref(pushee);
cbor_incref(pushee);
struct _cbor_array_metadata *metadata = (struct _cbor_array_metadata *) &array->metadata;
cbor_item_t **data = (cbor_item_t **) array->data;
if (cbor_array_is_definite(array)) {
Expand Down
19 changes: 17 additions & 2 deletions src/cbor_serializers.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,25 @@ size_t cbor_serialize_array(const cbor_item_t *item, unsigned char *buffer, size
if (written == 0)
return 0;

size_t item_written;
for (size_t i = 0; i < size; i++) {
written += cbor_serialize(*(handle++), buffer + written, buffer_size - written);
item_written = cbor_serialize(*(handle++), buffer + written, buffer_size - written);
if (item_written == 0)
return 0;
else
written += item_written;
}

if (cbor_array_is_definite(item)) {
return written;
} else {
assert(cbor_array_is_indefinite(item));
item_written = cbor_encode_break(buffer + written, buffer_size - written);
if (item_written == 0)
return 0;
else
return written + 1;
}
return written;
}

size_t cbor_serialize_map(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size)
Expand Down
17 changes: 16 additions & 1 deletion test/cbor_serialize_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,20 @@ static void test_serialize_definite_array(void **state)
assert_int_equal(3, cbor_serialize(item, buffer, 512));
assert_memory_equal(buffer, ((unsigned char[]) {0x82, 0x01, 0x02}), 3);
cbor_decref(&item);
}

static void test_serialize_indefinite_array(void **state)
{
cbor_item_t *item = cbor_new_indefinite_array();
cbor_item_t *one = cbor_build_uint8(1);
cbor_item_t *two = cbor_build_uint8(2);

cbor_array_push(item, one);
cbor_array_push(item, two);

assert_int_equal(4, cbor_serialize(item, buffer, 512));
assert_memory_equal(buffer, ((unsigned char[]) {0x9F, 0x01, 0x02, 0xFF}), 4);
cbor_decref(&item);
cbor_decref(&one);
cbor_decref(&two);
}
Expand All @@ -180,7 +194,8 @@ int main(void)
unit_test(test_serialize_indefinite_bytestring),
unit_test(test_serialize_definite_string),
unit_test(test_serialize_indefinite_string),
unit_test(test_serialize_definite_array)
unit_test(test_serialize_definite_array),
unit_test(test_serialize_indefinite_array)
};
return run_tests(tests);
}

0 comments on commit cc3e4c9

Please sign in to comment.