diff options
| -rw-r--r-- | src/lib/array.c | 59 | ||||
| -rw-r--r-- | src/lib/array.h | 19 |
2 files changed, 78 insertions, 0 deletions
diff --git a/src/lib/array.c b/src/lib/array.c new file mode 100644 index 0000000..f431d7c --- /dev/null +++ b/src/lib/array.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include <stdlib.h> +#include "array.h" + +Array array_init(size_t capacity) { + return (Array) { + .items = calloc(capacity, sizeof(int)), + .capacity = capacity, + .length = 0 + }; +} + +int array_push(Array *a, int value) { + if (a->length == a->capacity) { + array_resize(a, a->capacity * 1.5); + } + a->items[a->length++] = value; + return 0; +} + +int array_pop(Array *a) { + if (a->length > 0) { + int item = a->items[a->length-1]; + size_t capacity = a->capacity - (a->capacity - a->length); + if (array_resize(a, capacity) == EXIT_SUCCESS) + a->length--; + return item; + } + return 1; +} + +int array_resize(Array *a, size_t capacity) { + a->items = realloc(a->items, capacity * sizeof(int)); + if (a->items == NULL) { + fprintf(stderr, "Memory reallocation failed\n"); + return EXIT_FAILURE; + } + a->capacity = capacity; + return EXIT_SUCCESS; +} + +void array_free(Array *a) { + free(a->items); + a->items = NULL; + a->length = a->capacity = 0; +} + +void array_print(Array *a) { + printf("Capacity: %zu\t length: %zu\n", + a->capacity, a->length); + puts("Array items:"); + for (int i = 0; i < a->capacity; ++i) { + if (i > a->length) { + printf("%i: unused\n", i); + } else { + printf("%i: %i\n", i, a->items[i]); + } + } +} diff --git a/src/lib/array.h b/src/lib/array.h new file mode 100644 index 0000000..83a09e5 --- /dev/null +++ b/src/lib/array.h @@ -0,0 +1,19 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include <stdlib.h> + +typedef struct { + int *items; + size_t capacity; + size_t length; +} Array; + +Array array_init(size_t capacity); +int array_push(Array *a, int value); +int array_pop(Array *a); +int array_resize(Array *a, size_t capacity); +void array_free(Array *a); +void array_print(Array *a); + +#endif |
