63 lines
1.4 KiB
C
63 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include "lceb.h"
|
|
|
|
int eval_cell(pos)
|
|
STACKELT *pos;
|
|
{
|
|
STACKELT *prev=pos-1;
|
|
int curop=pos->curop, nop=pos->nop;
|
|
int val1, val2;
|
|
char op;
|
|
int res;
|
|
|
|
while (curop<nop) {
|
|
op=pos->op[curop];
|
|
val2=pos->val;
|
|
res=-1;
|
|
printf("eval_cell(%c, %d)\n", op, val2);
|
|
while ((val1=prev->val) == -1)
|
|
prev--;
|
|
switch (op) {
|
|
case Nop:
|
|
case End:
|
|
return val2;
|
|
break;
|
|
case Add:
|
|
res=val1+val2;
|
|
break;
|
|
case Mul:
|
|
res=val1*val2;
|
|
break;
|
|
case Sub:
|
|
if (val1 > val2)
|
|
res=val1-val2;
|
|
break;
|
|
case Div:
|
|
if (val1 > val2 && (val1 % val2 == 0))
|
|
res=val1/val2;
|
|
break;
|
|
}
|
|
curop++;
|
|
if (res==-1)
|
|
break;
|
|
pos->val=res;
|
|
printf("\t--> eval=%d\n", res);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
int eval_stack(stack)
|
|
STACK *stack;
|
|
{
|
|
int pos, last=stack->last, res;
|
|
STACKELT *pstack=stack->stack;
|
|
|
|
printf("+++++ eval_stack: addr=%p\n", pstack);
|
|
for (pos=1; pos<last; ++pos) {
|
|
//printf("eval_stack(%d/%d): addr=%p\n", pos, stack->last, pstack+pos);
|
|
res=eval_cell(stack->stack+pos);
|
|
//printf(" -> val(%d)=%d\n", pos, res);
|
|
}
|
|
return res;
|
|
}
|