=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/primitive.c,v retrieving revision 1.13 retrieving revision 1.16 diff -u -p -r1.13 -r1.16 --- OpenXM/src/kan96xx/Kan/primitive.c 2004/09/12 02:37:57 1.13 +++ OpenXM/src/kan96xx/Kan/primitive.c 2004/09/12 10:58:28 1.16 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.12 2004/09/11 01:00:42 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.15 2004/09/12 10:22:50 takayama Exp $ */ /* primitive.c */ /* The functions in this module were in stackmachine.c */ @@ -40,6 +40,9 @@ static char *operatorType(type) return("Unknown operator"); } +#define evalEA(ob1) if (ob1.tag == SexecutableArray) {\ + executeExecutableArray(ob1,(char *)NULL,0); ob1 = Kpop();} + /****** primitive functions ***************************************** the values must be greater than 1. 0 is used for special purposes.*/ #define Sadd 1 @@ -540,31 +543,36 @@ int executePrimitive(ob) /* Postscript primitives :arithmetic */ case Sadd: - ob1 = Kpop(); + ob1 = Kpop(); ob2 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooAdd(ob1,ob2); Kpush(rob); break; case Ssub: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooSub(ob1,ob2); Kpush(rob); break; case Smult: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooMult(ob1,ob2); Kpush(rob); break; case Sidiv: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooDiv(ob1,ob2); Kpush(rob); break; case Sdiv: ob2 = Kpop(); ob1 = Kpop(); + evalEA(ob1); evalEA(ob2); rob = KooDiv2(ob1,ob2); Kpush(rob); break; @@ -744,29 +752,11 @@ int executePrimitive(ob) errorStackmachine("Usage:loop"); break; } - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - i = 0; while (1) { - token = tokenArray[i]; - /***printf("[token %d]%s\n",i,token.token);*/ - i++; - if (i >= size) { - i=0; - } - status = executeToken(token); + status = executeExecutableArray(ob1,(char *)NULL,1); if ((status & STATUS_BREAK) || GotoP) break; /* here, do not return 1. Do not propagate exit signal outside of the loop. */ - - if (status & STATUS_INFIX) { - infixOn = 1; infixToken = token; - infixToken.tflag |= NO_DELAY; continue; - }else if (infixOn) { - infixOn = 0; status = executeToken(infixToken); - if ((status & STATUS_BREAK) || GotoP) break; - } - } break; @@ -802,22 +792,8 @@ int executePrimitive(ob) */ for ( ; i<=lim; i += inc) { Kpush(KpoInteger(i)); - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - for (j=0; j=lim; i += inc) { Kpush(KpoInteger(i)); - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - for (j=0; j 0) { signal(SIGALRM,ctrlC); alarm((unsigned int) n); - for (i=0; i