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