Beispiel #1
0
cbor_item_t *cbor_new_definite_array(size_t size)
{
	cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t));
	if (item == NULL)
		return NULL;

	cbor_item_t ** data = _CBOR_MALLOC(sizeof(cbor_item_t *) * size);
	if (data == NULL) {
		_CBOR_FREE(item);
		return NULL;
	}

	for (size_t i = 0; i < size; i++)
		data[i] = NULL;

	*item = (cbor_item_t) {
		.refcount = 1,
		.type = CBOR_TYPE_ARRAY,
		.metadata = {
			.array_metadata = {
				.type = _CBOR_METADATA_DEFINITE,
				.allocated = size,
				.end_ptr = 0
			}
		},
		.data = (unsigned char *)data
	};

	return item;
}
Beispiel #2
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;
}
Beispiel #3
0
cbor_item_t *cbor_new_indefinite_map()
{
	cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t));
	if (item == NULL)
		return NULL;
	*item = (cbor_item_t) {
		.refcount = 1,
		.type = CBOR_TYPE_MAP,
		.metadata = {.map_metadata = {
			.allocated = 0,
			.type = _CBOR_METADATA_INDEFINITE,
			.end_ptr = 0
		}},
		.data = NULL
	};
Beispiel #4
0
cbor_item_t *cbor_new_indefinite_array()
{
	cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t));
	if (item == NULL)
		return NULL;

	*item = (cbor_item_t) {
		.refcount = 1,
		.type = CBOR_TYPE_ARRAY,
		.metadata = {
			.array_metadata = {
				.type = _CBOR_METADATA_INDEFINITE,
				.allocated = 0,
				.end_ptr = 0
			}
		},
		.data = NULL /* Can be safely realloc-ed */
	};
Beispiel #5
0
cbor_item_t *cbor_new_definite_map(size_t size)
{
	cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t));
	if (item == NULL) {
		return NULL;
	}
	*item = (cbor_item_t) {
		.refcount = 1,
		.type = CBOR_TYPE_MAP,
		.metadata = {.map_metadata = {
			.allocated = size,
			.type = _CBOR_METADATA_DEFINITE,
			.end_ptr = 0
		}},
		.data = _cbor_alloc_multiple(sizeof(struct cbor_pair), size)
	};
	if (item->data == NULL) {
		_CBOR_FREE(item);
		return NULL;
	}
	return item;
}