aboutsummaryrefslogtreecommitdiffstats
path: root/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'stack.c')
-rw-r--r--stack.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/stack.c b/stack.c
new file mode 100644
index 0000000..d970bc2
--- /dev/null
+++ b/stack.c
@@ -0,0 +1,46 @@
+#include "stack.h"
+
+void ipush(interpreter *it, void *v)
+{
+ it->stack[it->stidx++] = v;
+}
+
+void *ipop(interpreter *it)
+{
+ return it->stack[--it->stidx];
+}
+
+void ipopm(interpreter *it, uint32_t count)
+{
+ it->stidx -= count;
+}
+
+variable *igetarg(interpreter *interp, uint32_t index)
+{
+ return interp->stack[interp->stidx - index - 1];
+}
+
+char *igetarg_string(interpreter *interp, uint32_t index)
+{
+ if (index >= interp->stidx)
+ return 0;
+ variable *v = igetarg(interp, index);
+ return v->svalue;
+}
+
+int igetarg_integer(interpreter *interp, uint32_t index)
+{
+ if (index >= interp->stidx)
+ return 0;
+ variable *v = igetarg(interp, index);
+ return INT(itoint(v));
+}
+
+float igetarg_float(interpreter *interp, uint32_t index)
+{
+ if (index >= interp->stidx)
+ return 0;
+ variable *v = igetarg(interp, index);
+ return FLOAT(itofloat(v));
+}
+