Branch data Line data Source code
1 : : #include "mem.h"
2 : :
3 : : /**
4 : : * @brief Return a writable pointer to one typed descriptor element
5 : : *
6 : : * The function validates that @p index is inside the descriptor's logical
7 : : * element range and then delegates descriptor integrity and element-size checks
8 : : * to @ref mem_data_writable. It returns `NULL` for invalid descriptors,
9 : : * mismatched element sizes, empty descriptors, and out-of-range indexes
10 : : *
11 : : * @param memory_structure Pointer to the descriptor that stores an array
12 : : * @param index Zero-based index of the requested element
13 : : * @param expected_single_element_size Expected element size in bytes, usually `sizeof(T)`
14 : : * @return Writable element pointer on success. `NULL` when the element cannot be addressed safely
15 : : */
16 : 5 : void *mem_array_item_writable(
17 : : memory *memory_structure,
18 : : size_t index,
19 : : size_t expected_single_element_size)
20 : : {
21 [ + + ]: 5 : if(memory_structure == NULL)
22 : : {
23 : 1 : report("Memory management; Descriptor is NULL");
24 : 1 : return(NULL);
25 : : }
26 : :
27 [ + + ]: 4 : if(index >= memory_structure->length)
28 : : {
29 : 2 : report("Memory management; Item index %zu is out of range for descriptor length %zu",index,memory_structure->length);
30 : 2 : return(NULL);
31 : : }
32 : :
33 : 2 : void *data = mem_data_writable(memory_structure,expected_single_element_size);
34 : :
35 [ + + ]: 2 : if(data == NULL)
36 : : {
37 : 1 : return(NULL);
38 : : }
39 : :
40 : 1 : unsigned char *item_data = data;
41 : :
42 : 1 : return(&item_data[index * expected_single_element_size]);
43 : : }
|