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
|
#include <stdlib.h>
#include "common/grow.h"
bool sfdo_grow(void *data_ptr, size_t *cap, size_t len, size_t entry_size) {
return sfdo_grow_n(data_ptr, cap, len, entry_size, 1);
}
bool sfdo_grow_n(void *data_ptr, size_t *cap, size_t len, size_t entry_size, size_t n) {
size_t new_len = len + n;
if (new_len < len) {
// Overflow
return false;
} else if (new_len < *cap) {
return true;
}
size_t new_cap = *cap == 0 ? 256 : *cap;
while (new_cap < new_len) {
size_t double_cap = new_cap * 2;
if (double_cap < new_cap) {
// Overflow
return false;
}
new_cap = double_cap;
}
void **data = data_ptr;
void *new_data = realloc(*data, new_cap * entry_size);
if (new_data == NULL) {
return false;
}
*data = new_data;
*cap = new_cap;
return true;
}
|