1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2024, Linaro Limited 4 */ 5 6 #include <assert.h> 7 #include <stdint.h> 8 #include <string.h> 9 #include <string_ext.h> 10 11 void *ins_array_elem(void *base, size_t elem_count, size_t elem_size, 12 size_t pos, const void *elem) 13 { 14 uint8_t *b = base; 15 void *e = b + pos * elem_size; 16 17 assert(pos < elem_count); 18 19 memmove(b + (pos + 1) * elem_size, e, 20 (elem_count - pos - 1) * elem_size); 21 22 if (elem) 23 memcpy(e, elem, elem_size); 24 25 return e; 26 } 27 28 void *ins_array_elem_zero_init(void *base, size_t elem_count, size_t elem_size, 29 size_t pos) 30 { 31 return memset(ins_array_elem(base, elem_count, elem_size, pos, NULL), 32 0, elem_size); 33 } 34 35 void rem_array_elem(void *base, size_t elem_count, size_t elem_size, 36 size_t pos) 37 { 38 uint8_t *b = base; 39 40 assert(pos < elem_count); 41 42 memmove(b + pos * elem_size, b + (pos + 1) * elem_size, 43 (elem_count - pos - 1) * elem_size); 44 } 45 46 void rem_array_elem_zero_pad(void *base, size_t elem_count, size_t elem_size, 47 size_t pos) 48 { 49 rem_array_elem(base, elem_count, elem_size, pos); 50 memset((uint8_t *)base + (elem_count - 1) * elem_size, 0, elem_size); 51 } 52