aboutsummaryrefslogtreecommitdiffstats
path: root/stack.c
diff options
context:
space:
mode:
authordan <[email protected]>2023-05-25 11:00:58 -0400
committerdan <[email protected]>2023-05-25 11:00:58 -0400
commit40e23d550506659f7a33057bbbc23cb1cf0632f1 (patch)
treec7c7a53e78f7186b352c9e6a43113d6679257231 /stack.c
parent7463bbc06285690b5b644362d115aa9e82ac6cb4 (diff)
downloadforth-40e23d550506659f7a33057bbbc23cb1cf0632f1.tar.gz
forth-40e23d550506659f7a33057bbbc23cb1cf0632f1.tar.bz2
forth-40e23d550506659f7a33057bbbc23cb1cf0632f1.zip
refactor: split optable and stack into sep files
Diffstat (limited to 'stack.c')
-rw-r--r--stack.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/stack.c b/stack.c
new file mode 100644
index 0000000..80b8ed2
--- /dev/null
+++ b/stack.c
@@ -0,0 +1,40 @@
+#include "stack.h"
+
+stack* newstack() {
+ stack* s = (stack*)malloc(sizeof(stack));
+ s->size = 0;
+ s->maxsize = 1024;
+ s->start = (stackitem*)malloc(sizeof(stackitem) * s->maxsize);
+ return s;
+}
+
+stackitem pop(stack* s) {
+ if (s->size > 0) {
+ s->size = s->size - 1;
+ stackitem si = s->start[s->size];
+ return si;
+ } else {
+ // tried to pop empty stack
+ return 0;
+ }
+}
+
+stackitem peek(stack* s) {
+ if (s->size > 0) {
+ return s->start[s->size - 1];
+ } else {
+ // tried to pop empty stack
+ return 0;
+ }
+}
+
+void push(stack *s, stackitem si) {
+// fprintf(stderr, "pushing %d", si);
+ if (s->size >= s->maxsize) {
+ fprintf(stderr, "Error Stack Overflow");
+ exit(1);
+ } else {
+ s->start[s->size] = si;
+ s->size = s->size + 1;
+ }
+}