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