#include "forth.h" #include "fh_runtime.h" #include "fh_stack.h" /** Pop from data stack */ enum fh_error ds_pop(struct fh_thread_s *fh, uint32_t *out) { if (fh->data_stack_top == 0) { LOG("DS pop UNDERFLOW"); return FH_ERR_DS_UNDERFLOW; } *out = fh->data_stack[--fh->data_stack_top]; LOG("DS pop %d", *out); return FH_OK; } /** Pop from return stack */ enum fh_error rs_pop(struct fh_thread_s *fh, uint32_t *out) { if (fh->return_stack_top == 0) { LOG("RS pop UNDERFLOW"); return FH_ERR_RS_UNDERFLOW; } *out = fh->return_stack[--fh->return_stack_top]; LOG("RS pop %d", *out); return FH_OK; } /** Pop from control stack */ enum fh_error cs_pop(struct fh_thread_s *fh, uint32_t *out) { if (fh->control_stack_top == 0) { LOG("CS pop UNDERFLOW"); return FH_ERR_CS_UNDERFLOW; } *out = fh->control_stack[--fh->control_stack_top]; LOG("CS pop %d", *out); return FH_OK; } #define UPDATE_HWM(hwm, top) \ do { \ if((hwm) < (top)) { \ (hwm) = (top); \ } \ } while(0) /** Push to data stack */ enum fh_error ds_push(struct fh_thread_s *fh, uint32_t in) { LOG("DS push %d", in); if (fh->data_stack_top == DATA_STACK_DEPTH) { return FH_ERR_DS_OVERFLOW; } fh->data_stack[fh->data_stack_top++] = in; UPDATE_HWM(fh->data_stack_hwm, fh->data_stack_top); return FH_OK; } /** Push to return stack */ enum fh_error rs_push(struct fh_thread_s *fh, uint32_t in) { LOG("RS push %d", in); if (fh->return_stack_top == RETURN_STACK_DEPTH) { return FH_ERR_RS_OVERFLOW; } fh->return_stack[fh->return_stack_top++] = in; UPDATE_HWM(fh->return_stack_hwm, fh->return_stack_top); return FH_OK; } /** Push to control stack */ enum fh_error cs_push(struct fh_thread_s *fh, uint32_t in) { LOG("CS push %d", in); if (fh->control_stack_top == CONTROL_STACK_DEPTH) { return FH_ERR_CS_OVERFLOW; } fh->control_stack[fh->control_stack_top++] = in; UPDATE_HWM(fh->control_stack_hwm, fh->control_stack_top); return FH_OK; }