=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/primitive.c,v retrieving revision 1.4 retrieving revision 1.6 diff -u -p -r1.4 -r1.6 --- OpenXM/src/kan96xx/Kan/primitive.c 2001/05/04 01:06:25 1.4 +++ OpenXM/src/kan96xx/Kan/primitive.c 2003/08/23 02:28:39 1.6 @@ -1,8 +1,9 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.3 2000/02/24 12:33:47 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.5 2002/11/04 10:53:56 takayama Exp $ */ /* primitive.c */ /* The functions in this module were in stackmachine.c */ #include +#include #include "datatype.h" #include "stackm.h" #include "extern.h" @@ -120,6 +121,7 @@ static char *operatorType(type) #define Ssupmsg2 98 #define Scclass 99 #define Scoeff2 100 +#define Stlimit 101 /***********************************************/ void printObject(ob,nl,fp) struct object ob; @@ -372,6 +374,7 @@ void KdefinePrimitiveFunctions() { putPrimitiveFunction("system",Ssystem); putPrimitiveFunction("system_variable",Ssystem_variable); putPrimitiveFunction("test",Stest); + putPrimitiveFunction("tlimit",Stlimit); putPrimitiveFunction("map",Smap); putPrimitiveFunction("to_records",Sto_records); putPrimitiveFunction("Usage",Susage); @@ -1357,8 +1360,17 @@ int executePrimitive(ob) if (ob2.tag != Sarray) { Kpush(Khead(ob2)); }else{ - ob1 = Kpop(); - Kpush(oInitW(ob1,ob2)); + if (getoaSize(ob2) > 0) { + if (getoa(ob2,getoaSize(ob2)-1).tag == Spoly) { + Kpush(oInitW(ob2,newObjectArray(0))); + }else{ + ob1 = Kpop(); + Kpush(oInitW(ob1,ob2)); + } + }else{ + ob1 = Kpop(); + Kpush(oInitW(ob1,ob2)); + } } break; @@ -1671,6 +1683,48 @@ int executePrimitive(ob) } */ break; + + case Stlimit: + /* { } time tlimit */ + ob2 = Kpop(); + ob1 = Kpop(); + switch(ob2.tag) { + case Sinteger: break; + default: errorStackmachine("Usage:tlimit"); break; + } + switch(ob1.tag) { + case SexecutableArray: break; + default: + errorStackmachine("Usage:tlimit"); + break; + } + tokenArray = ob1.lc.tokenArray; + size = ob1.rc.ival; + n = ob2.lc.ival; + i = 0; + if (n > 0) { + signal(SIGALRM,ctrlC); alarm((unsigned int) n); + for (i=0; i