aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/array.c59
-rw-r--r--src/lib/array.h19
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