#include <assert.h>
#include <errno.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
static int array_realloc(struct array *array, size_t new_total)
{
- void *tmp = realloc(array->array, sizeof(void *) * new_total);
+ void *tmp;
+
+ if (SIZE_MAX / sizeof(void *) < new_total)
+ return -ENOMEM;
+ tmp = realloc(array->array, sizeof(void *) * new_total);
if (tmp == NULL)
return -ENOMEM;
array->array = tmp;
size_t idx;
if (array->count + 1 >= array->total) {
- int r = array_realloc(array, array->total + array->step);
+ int r;
+
+ if (SIZE_MAX - array->total < array->step)
+ return -ENOMEM;
+ r = array_realloc(array, array->total + array->step);
if (r < 0)
return r;
}
}
void array_pop(struct array *array) {
+ if (array->count == 0)
+ return;
array->count--;
if (array->count + array->step < array->total) {
int r = array_realloc(array, array->total - array->step);
void array_free_array(struct array *array) {
free(array->array);
+ array->array = NULL;
array->count = 0;
array->total = 0;
}
assert_return(array.count == 2, EXIT_FAILURE);
assert_return(array.array[0] == c1, EXIT_FAILURE);
assert_return(array.array[1] == c2, EXIT_FAILURE);
+ assert_return(array.total == 4, EXIT_FAILURE);
array_remove_at(&array, 0);
assert_return(array.count == 1, EXIT_FAILURE);
assert_return(array.array[0] == c2, EXIT_FAILURE);
+ assert_return(array.total == 2, EXIT_FAILURE);
array_remove_at(&array, 0);
assert_return(array.count == 0, EXIT_FAILURE);
+ assert_return(array.total == 2, EXIT_FAILURE);
array_append(&array, c1);
array_append(&array, c2);
assert_return(array.count == 2, EXIT_FAILURE);
assert_return(array.array[0] == c1, EXIT_FAILURE);
assert_return(array.array[1] == c3, EXIT_FAILURE);
+ assert_return(array.total == 4, EXIT_FAILURE);
array_free_array(&array);
assert_return(array.count == 0, EXIT_FAILURE);
+ array_pop(&array);
+
+ assert_return(array.count == 0, EXIT_FAILURE);
+
array_free_array(&array);
return 0;