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; } }
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; }
bool cbor_array_is_indefinite(const cbor_item_t *item) { assert(cbor_isa_array(item)); return item->metadata.array_metadata.type == _CBOR_METADATA_INDEFINITE; }
size_t cbor_array_allocated(const cbor_item_t * item) { assert(cbor_isa_array(item)); return item->metadata.array_metadata.allocated; }
size_t cbor_array_size(const cbor_item_t *item) { assert(cbor_isa_array(item)); return item->metadata.array_metadata.end_ptr; }