libvieter/src/dynarray/vieter_dynarray.c

59 lines
1.4 KiB
C

#include "vieter_dynarray.h"
vieter_dynarray *vieter_dynarray_init(size_t initial_capacity) {
vieter_dynarray *da = malloc(sizeof(vieter_dynarray));
da->size = 0;
da->capacity = initial_capacity;
return da;
}
void vieter_dynarray_add(vieter_dynarray *da, const char *s) {
// An empty vieter_dynarray does not have an allocated internal array
// yet
if (da->size == 0) {
da->array = malloc(sizeof(char *) * da->capacity);
// Initialise all char*'s to 0 so array[i] == NULL can be used to see if
// field is empty
memset(da->array, 0, sizeof(char *) * da->capacity);
}
// Double array size if it's full
else if (da->size == da->capacity) {
// if the realloc fails, access to memory in da->array is lost
da->array = realloc(da->array, sizeof(char *) * da->capacity * 2);
da->capacity *= 2;
// Same as the previous memset, but only for newly allocated pointers
memset(da->array + da->size, 0, sizeof(char *) * da->capacity / 2);
}
da->array[da->size] = strdup(s);
da->size++;
}
void vieter_dynarray_free(vieter_dynarray *da) {
if (da == NULL) {
return;
}
if (da->array != NULL) {
for (size_t i = 0; i < da->size; i++) {
free(da->array[i]);
}
free(da->array);
}
free(da);
}
char **vieter_dynarray_convert(vieter_dynarray *da) {
char **array = da->array;
da->array = NULL;
vieter_dynarray_free(da);
return array;
}