summaryrefslogtreecommitdiff
path: root/lib/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stack.c')
-rw-r--r--lib/stack.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/stack.c b/lib/stack.c
new file mode 100644
index 0000000..acffc1a
--- /dev/null
+++ b/lib/stack.c
@@ -0,0 +1,43 @@
+#include "stack.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void stack_init(struct Stack* stack, size_t size) {
+ stack->size = 0;
+ stack->capacity = size;
+ stack->data = malloc(size);
+}
+
+void stack_push(struct Stack* stack, void* data, size_t len) {
+ size_t new_size = stack->size + len;
+ if (new_size >= stack->capacity) {
+ stack->capacity = new_size * 2;
+ stack->data = realloc(stack->data, stack->capacity);
+ }
+ memcpy((uint8_t*)stack->data + stack->size, data, len);
+ stack->size += len;
+}
+
+void* stack_pop(struct Stack* stack, size_t len) {
+ if (stack->size < len) return NULL;
+ stack->size -= len;
+ return (uint8_t*)stack->data + stack->size;
+}
+
+void stack_free(struct Stack *stack) {
+ free(stack->data);
+}
+
+void stack_push_int(struct Stack *stack, int value) {
+ stack_push(stack, &value, sizeof(int));
+}
+
+bool stack_pop_int(struct Stack *stack, int* value) {
+ void* d = stack_pop(stack, sizeof(int));
+ if (d == NULL) return false;
+ *value = *(int*)(d);
+ return true;
+}