Ejemplo n.º 1
0
size_t cbor_serialize_alloc(const cbor_item_t * item,
							unsigned char ** buffer,
							size_t * buffer_size)
{
	size_t bfr_size = 32;
	unsigned char * bfr = _CBOR_MALLOC(bfr_size), * tmp_bfr;
	if (bfr == NULL) {
		return 0;
	}

	size_t written;

	/* This is waaay too optimistic - figure out something smarter (eventually) */
	while ((written = cbor_serialize(item, bfr, bfr_size)) == 0) {
		if (!_cbor_safe_to_multiply(CBOR_BUFFER_GROWTH, bfr_size)) {
			_CBOR_FREE(bfr);
			return 0;
		}

		tmp_bfr = _CBOR_REALLOC(bfr, bfr_size *= 2);

		if (tmp_bfr == NULL) {
			_CBOR_FREE(bfr);
			return 0;
		}
		bfr = tmp_bfr;
	}
	*buffer = bfr;
	*buffer_size = bfr_size;
	return written;
}
Ejemplo n.º 2
0
size_t cbor_serialize_array(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size)
{
	assert(cbor_isa_array(item));
	size_t size = cbor_array_size(item),
		written = 0;
	cbor_item_t **handle = cbor_array_handle(item);
	if (cbor_array_is_definite(item)) {
		written = cbor_encode_array_start(size, buffer, buffer_size);
	} else {
		assert(cbor_array_is_indefinite(item));
		written = cbor_encode_indef_array_start(buffer, buffer_size);
	}
	if (written == 0)
		return 0;

	size_t item_written;
	for (size_t i = 0; i < size; i++) {
		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;
	}
}
Ejemplo n.º 3
0
size_t cbor_serialize_map(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size)
{
	assert(cbor_isa_map(item));
	size_t size = cbor_map_size(item),
		written = 0;
	struct cbor_pair * handle = cbor_map_handle(item);

	if (cbor_map_is_definite(item)) {
		written = cbor_encode_map_start(size, buffer, buffer_size);
	} else {
		assert(cbor_map_is_indefinite(item));
		written = cbor_encode_indef_map_start(buffer, buffer_size);
	}
	if (written == 0)
		return 0;

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

	if (cbor_map_is_definite(item)) {
		return written;
	} else {
		assert(cbor_map_is_indefinite(item));
		item_written = cbor_encode_break(buffer + written, buffer_size - written);
		if (item_written == 0)
			return 0;
		else
			return written + 1;
	}
}
Ejemplo n.º 4
0
size_t cbor_serialize_tag(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size)
{
	assert(cbor_isa_tag(item));
	size_t written = cbor_encode_tag(cbor_tag_value(item), buffer, buffer_size);
	if (written == 0)
		return 0;

	size_t item_written = cbor_serialize(cbor_tag_item(item), buffer + written, buffer_size - written);
	if (item_written == 0)
		return 0;
	else
		return written + item_written;
}
Ejemplo n.º 5
0
static void test_serialize_uint8(void **state)
{
	cbor_item_t *item = cbor_new_int8();
	cbor_set_uint8(item, 0);
	assert_int_equal(1, cbor_serialize(item, buffer, 512));
	assert_memory_equal(buffer, (unsigned char[]) {0x00}, 1);