18455734fSStefan Bühler #include "first.h"
28455734fSStefan Bühler
38455734fSStefan Bühler #include "vector.h"
404d76e7aSGlenn Strauss
504d76e7aSGlenn Strauss #include <stdlib.h>
604d76e7aSGlenn Strauss #include <string.h>
704d76e7aSGlenn Strauss
vector_align_size(size_t s)85fe8322eSGlenn Strauss static inline size_t vector_align_size(size_t s) {
95fe8322eSGlenn Strauss size_t a = (s + 15) & ~(size_t)15uL;
105fe8322eSGlenn Strauss return (a < s) ? s : a;
115fe8322eSGlenn Strauss }
125fe8322eSGlenn Strauss
vector_free(void * data)1304d76e7aSGlenn Strauss void vector_free(void *data) { free(data); }
1404d76e7aSGlenn Strauss
vector_resize(void * data,size_t elem_size,size_t * size,size_t used,size_t x)155fe8322eSGlenn Strauss void *vector_resize(void *data, size_t elem_size, size_t *size, size_t used, size_t x) {
165fe8322eSGlenn Strauss ck_assert(used < SIZE_MAX - p);
175fe8322eSGlenn Strauss *size = vector_align_size(used + p);
185fe8322eSGlenn Strauss ck_assert(*size <= SIZE_MAX / elem_size);
195fe8322eSGlenn Strauss const size_t total_size = elem_size * *size;
208455734fSStefan Bühler const size_t used_size = elem_size * used;
21*c3ad18c4SGlenn Strauss void *odata = data; /*(save ptr to avoid static analyzer realloc warn)*/
22*c3ad18c4SGlenn Strauss data = realloc(odata, total_size);
2369920910SGlenn Strauss ck_assert(NULL != data);
248455734fSStefan Bühler
258455734fSStefan Bühler /* clear new memory */
268455734fSStefan Bühler memset(((char*)data) + used_size, 0, total_size - used_size);
278455734fSStefan Bühler
288455734fSStefan Bühler return data;
298455734fSStefan Bühler }
30