From b72c271d8731e1f67fdef29cd64726dfce893fe7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 29 May 2023 13:53:46 -0400 Subject: feat: add .s,roll,pick,and depth commands to c forth --- stack.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) (limited to 'stack.c') diff --git a/stack.c b/stack.c index 80b8ed2..617e621 100644 --- a/stack.c +++ b/stack.c @@ -1,6 +1,6 @@ #include "stack.h" -stack* newstack() { +stack* stack_new() { stack* s = (stack*)malloc(sizeof(stack)); s->size = 0; s->maxsize = 1024; @@ -8,7 +8,7 @@ stack* newstack() { return s; } -stackitem pop(stack* s) { +stackitem stack_pop(stack* s) { if (s->size > 0) { s->size = s->size - 1; stackitem si = s->start[s->size]; @@ -19,7 +19,7 @@ stackitem pop(stack* s) { } } -stackitem peek(stack* s) { +stackitem stack_peek(stack* s) { if (s->size > 0) { return s->start[s->size - 1]; } else { @@ -28,7 +28,7 @@ stackitem peek(stack* s) { } } -void push(stack *s, stackitem si) { +void stack_push(stack *s, stackitem si) { // fprintf(stderr, "pushing %d", si); if (s->size >= s->maxsize) { fprintf(stderr, "Error Stack Overflow"); @@ -38,3 +38,39 @@ void push(stack *s, stackitem si) { s->size = s->size + 1; } } + +int stack_depth(stack *s) { + return s->size; +} + +void stack_printall(stack *s) { + printf("<%d>", s->size); + for (int i = 0; i < s->size; i++) { + printf(" %d", s->start[i]); + } + printf("\n"); +} + +void stack_roll(stack *s) { + int posfromtop = stack_pop(s); // top is 0, bottom is s->size - 1 + const int maxindex = s->size - 1; + int i = maxindex - posfromtop; + if (i >= 0) { + int newtop = s->start[i]; + for (; i + 1 < s->size; i++) { + s->start[i] = s->start[i+1]; + } + s->start[i] = newtop; + } +} + +void stack_pick(stack *s) { + int posfromtop = stack_pop(s); // top is 0, bottom is s->size - 1 + const int maxindex = s->size - 1; + if (s->size > posfromtop) { + stack_push(s, s->start[maxindex - posfromtop]); + } else { + // no item found + stack_push(s, 0); + } +} -- cgit v1.2.3