diff --git a/include/arraylist.h b/include/arraylist.h index a22f97e..7f0af97 100644 --- a/include/arraylist.h +++ b/include/arraylist.h @@ -22,7 +22,7 @@ typedef enum { ARRLIST_INVALID_SLICE, } ArrayListErr; -ArrayList *arraylist_init(size_t capacity, size_t elem_size); +ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size); ArrayListErr arraylist_destroy(ArrayList **arr); ArrayListErr arraylist_clear(ArrayList *arr); ArrayList *arraylist_clone(const ArrayList *arr); diff --git a/src/arraylist.c b/src/arraylist.c index bbbaa65..e38808d 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -26,34 +26,40 @@ struct ArraySlice { static ArrayListErr arraylist_grow(ArrayList *arr); static ArrayListErr arraylist_shrink(ArrayList *arr); -ArrayList *arraylist_init(size_t capacity, size_t elem_size) { +ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size) { + if (arr == NULL || *arr == NULL) { + return ARRLIST_NULL_ARG; + } + if (capacity == 0) { - return NULL; + return ARRLIST_INVALID_CAPACITY; } if (elem_size == 0) { - return NULL; + return ARRLIST_INVALID_ELEM_SIZE; } if (capacity > SIZE_MAX / elem_size) { - return NULL; + return ARRLIST_INVALID_CAPACITY; } - ArrayList *arr = malloc(sizeof(ArrayList)); + ArrayList *new_arr = malloc(sizeof(ArrayList)); if (arr == NULL) { - return NULL; + return ARRLIST_BAD_ALLOC; } - arr->capacity = capacity; - arr->elem_size = elem_size; - arr->len = 0; - arr->borrows = 0; - arr->buffer = malloc(capacity * elem_size); - if (arr->buffer == NULL) { + + new_arr->capacity = capacity; + new_arr->elem_size = elem_size; + new_arr->len = 0; + new_arr->borrows = 0; + new_arr->buffer = malloc(capacity * elem_size); + if (new_arr->buffer == NULL) { free(arr); return NULL; } - return arr; + *arr = new_arr; + return ARRLIST_OK; } ArrayListErr arraylist_destroy(ArrayList **arr) {