initial version
This commit is contained in:
62
eval.c
Normal file
62
eval.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user