aboutsummaryrefslogtreecommitdiff
path: root/src/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stack.c')
-rw-r--r--src/stack.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/stack.c b/src/stack.c
new file mode 100644
index 0000000..5c4d0ca
--- /dev/null
+++ b/src/stack.c
@@ -0,0 +1,38 @@
+#include "include/stack.h"
+
+stack_t* stack_init() {
+ stack_t* stack = emalloc(sizeof(stack_t));
+
+ stack->sp = 0;
+ for (int i = 0; i < STACK_MAXLEN; stack->val[i++] = 0);
+
+ return stack;
+}
+
+void stack_destroy(stack_t* stack) {
+ free(stack);
+}
+
+void stack_push(stack_t* stack, void* val) {
+ stack->val[stack->sp++] = val;
+}
+
+void* stack_pop(stack_t* stack) {
+ void* tmpval;
+
+ tmpval = stack->val[--stack->sp];
+ stack->val[stack->sp] = NULL;
+
+ return tmpval;
+}
+
+size_t stack_len(stack_t* stack) {
+ return stack->sp - 1;
+}
+
+void stack_print(stack_t* stack) {
+ log_inf("stack_print(): %p", stack);
+ for (int i = stack_len(stack) - 1; i >= 0; --i) {
+ log_inf("%d: %p", i, stack[i]);
+ }
+}