#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; }