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; }
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; }
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 };
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 */ };
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; }