Beispiel #1
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;
	}
}
Beispiel #2
0
bool cbor_array_push(cbor_item_t *array, cbor_item_t *pushee)
{
	assert(cbor_isa_array(array));
	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)) {
		/* Do not reallocate definite arrays */
		if (metadata->end_ptr >= metadata->allocated)
			return false;
		data[metadata->end_ptr++] = pushee;
	} else {
		/* Exponential realloc */
		if (metadata->end_ptr >= metadata->allocated) {
			size_t new_allocation = (size_t)(CBOR_BUFFER_GROWTH * (metadata->allocated));
			new_allocation = new_allocation ? new_allocation : 1;
			unsigned char * new_data = _CBOR_REALLOC(array->data,
													 new_allocation * sizeof(cbor_item_t *));
			if (new_data == NULL)
				return false;
			array->data = new_data;
			metadata->allocated = new_allocation;
		}
		((cbor_item_t **)array->data)[metadata->end_ptr++] = pushee;
	}
	cbor_incref(pushee);
	return true;
}
Beispiel #3
0
bool cbor_array_is_indefinite(const cbor_item_t *item)
{
	assert(cbor_isa_array(item));
	return item->metadata.array_metadata.type == _CBOR_METADATA_INDEFINITE;
}
Beispiel #4
0
size_t cbor_array_allocated(const cbor_item_t * item)
{
	assert(cbor_isa_array(item));
	return item->metadata.array_metadata.allocated;
}
Beispiel #5
0
size_t cbor_array_size(const cbor_item_t *item)
{
	assert(cbor_isa_array(item));
	return item->metadata.array_metadata.end_ptr;
}