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
ins_array_elem(void * base,size_t elem_count,size_t elem_size,size_t pos,const void * elem)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
ins_array_elem_zero_init(void * base,size_t elem_count,size_t elem_size,size_t pos)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
rem_array_elem(void * base,size_t elem_count,size_t elem_size,size_t pos)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
rem_array_elem_zero_pad(void * base,size_t elem_count,size_t elem_size,size_t pos)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