-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.c
More file actions
46 lines (35 loc) · 1.05 KB
/
array.c
File metadata and controls
46 lines (35 loc) · 1.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "array.h"
#include <string.h>
#define array_header(array) \
((array) ? ((struct array_header *)(array) - 1) : NULL)
static size_t array_capacity(void *array) {
return ((array) ? array_header(array)->capacity : 0);
}
size_t array_length(void *array) {
return ((array) ? array_header(array)->length : 0);
}
void *array_grow_if_needed(void *array, size_t element_size,
size_t min_capacity) {
size_t capacity = array_capacity(array);
if (capacity >= min_capacity) {
return array;
}
if (min_capacity < 4) {
min_capacity = 4;
}
if (min_capacity < capacity * 2) {
min_capacity = capacity * 2;
}
size_t length = array_length(array);
struct array_header *new_array =
malloc(sizeof(*new_array) + min_capacity * element_size);
*new_array = (struct array_header){
.capacity = min_capacity,
.length = length,
};
if (array) {
memcpy(new_array->contents, array, length * element_size);
array_free(array);
}
return new_array->contents;
}