/* This software is licensed by the MIT License, see LICENSE file */ /* Copyright © 2022 Gregory Lirent */ #include "include.h" #include "../__internal/assert.h" #include "../__internal/vnode.h" ssize_t libcdsb_array_insert(arr_t* x, vtype_variable var) { ssize_t i; vnode_t n; i = x->size; n = vnode_tcreate(x->type, var.pointer, var.type); x->mem = realloc(x->mem, ++x->size * vtype_size(x->type)); if (var.type < VTYPE_STRING) { n = vnode_tcreate(x->type, var.pointer, var.type); memcpy(array_internal_at(x, i), vnode_peek(&n, x->type), vtype_size(x->type)); if (vtype_size(x->type) > sizeof(vnode_t)) vnode_free(&n, x->type); } else { type_assert(x->type, var.type); copy_init(array_internal_at(x, i), var.pointer, var.type); } return i; } ssize_t libcdsb_array_attach(arr_t* x, vtype_variable var) { ssize_t i; vnode_t n; i = x->size; x->mem = realloc(x->mem, ++x->size * vtype_size(x->type)); if (var.type < VTYPE_STRING) { n = vnode_tcreate(x->type, var.pointer, var.type); memcpy(array_internal_at(x, i), vnode_peek(&n, x->type), vtype_size(x->type)); if (vtype_size(x->type) > sizeof(vnode_t)) vnode_free(&n, x->type); } else { type_assert(x->type, var.type); memcpy(array_internal_at(x, i), var.pointer, vtype_size(var.type)); } return i; }