forked from vieter-v/libvieter
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
#include "vieter_package_dynarray.h"
|
|
|
|
vieter_package_dynarray *vieter_package_dynarray_init(size_t initial_capacity) {
|
|
vieter_package_dynarray *da = malloc(sizeof(vieter_package_dynarray));
|
|
da->size = 0;
|
|
da->capacity = initial_capacity;
|
|
|
|
return da;
|
|
}
|
|
|
|
void vieter_package_dynarray_add(vieter_package_dynarray *da, const char *s) {
|
|
// An empty vieter_package_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_package_dynarray_free(vieter_package_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_package_dynarray_convert(vieter_package_dynarray *da) {
|
|
char **array = da->array;
|
|
|
|
da->array = NULL;
|
|
vieter_package_dynarray_free(da);
|
|
|
|
return array;
|
|
}
|