=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/primitive.c,v retrieving revision 1.7 retrieving revision 1.23 diff -u -p -r1.7 -r1.23 --- OpenXM/src/kan96xx/Kan/primitive.c 2003/08/24 05:19:43 1.7 +++ OpenXM/src/kan96xx/Kan/primitive.c 2016/03/31 03:22:54 1.23 @@ -1,19 +1,24 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.6 2003/08/23 02:28:39 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.22 2013/11/06 06:44:48 takayama Exp $ */ /* primitive.c */ /* The functions in this module were in stackmachine.c */ #include +#include +#include #include #include "datatype.h" #include "stackm.h" #include "extern.h" +#include "extern2.h" #include "gradedset.h" #include "kclass.h" #include #include +#include "../plugin/mysig.h" int PrintDollar = 1; /* flag for printObject() */ int PrintComma = 1; /* flag for printObject() */ +int InSendmsg2 = 0; #define OB_ARRAY_MAX (AGLIMIT+100) extern int GotoP; @@ -24,6 +29,7 @@ extern int ClassTypes[]; /* kclass.c */ extern struct context *PrimitiveContextp; extern struct context *CurrentContextp; extern struct dictionary *SystemDictionary; +extern int QuoteMode; static char *operatorType(int i); @@ -38,6 +44,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 @@ -122,6 +131,7 @@ static char *operatorType(type) #define Scclass 99 #define Scoeff2 100 #define Stlimit 101 +#define Soxshell 102 /***********************************************/ void printObject(ob,nl,fp) struct object ob; @@ -194,6 +204,9 @@ void printObject(ob,nl,fp) case Sdouble: fprintf(fp," "); break; + case SbyteArray: + fprintf(fp," "); + break; default: fprintf(fp,"",ob.tag); break; @@ -288,6 +301,9 @@ void printObject(ob,nl,fp) case Sdouble: fprintf(fp,"%f",KopDouble(ob)); break; + case SbyteArray: + printObject(byteArrayToArray(ob),nl,fp); /* Todo: I should save memory.*/ + break; default: fprintf(fp,"[Unknown object tag.]"); break; @@ -375,6 +391,7 @@ void KdefinePrimitiveFunctions() { putPrimitiveFunction("system_variable",Ssystem_variable); putPrimitiveFunction("test",Stest); putPrimitiveFunction("tlimit",Stlimit); + putPrimitiveFunction("oxshell",Soxshell); putPrimitiveFunction("map",Smap); putPrimitiveFunction("to_records",Sto_records); putPrimitiveFunction("Usage",Susage); @@ -409,27 +426,29 @@ void KdefinePrimitiveFunctions() { int executePrimitive(ob) struct object ob; { - struct object ob1; - struct object ob2; - struct object ob3; - struct object ob4; - struct object ob5; - struct object rob; + struct object ob1 = OINIT; + struct object ob2 = OINIT; + struct object ob3 = OINIT; + struct object ob4 = OINIT; + struct object ob5 = OINIT; + struct object rob = OINIT; struct object obArray[OB_ARRAY_MAX]; struct object obArray2[OB_ARRAY_MAX]; int size; int i,j,k,n; int status; + int infixOn; + struct tokens infixToken; struct tokens *tokenArray; struct tokens token; FILE *fp; char *fname; int rank; - struct object oMat; + struct object oMat = OINIT; static int timerStart = 1; static struct tms before, after; static time_t before_real, after_real; - struct object oInput; + struct object oInput = OINIT; char *str; int ccflag = 0; extern int KeepInput; @@ -437,11 +456,26 @@ int executePrimitive(ob) extern struct ring *CurrentRingp; extern TimerOn; extern SecureMode; + extern int RestrictedMode; + infixOn = 0; + if (DebugStack >= 2) { fprintf(Fstack,"In execute %d\n",ob.lc.ival); printOperandStack(); } + if (RestrictedMode) { + switch(ob.lc.ival) { + case SleftBrace: + case SrightBrace: + case Sexec: + break; + default: + fprintf(stderr,"primitive No = %d : ", ob.lc.ival); + errorStackmachine("You cannot use this primitive in the RestrictedMode.\n"); + } + } + if (GotoP) return(0); switch (ob.lc.ival) { /* Postscript primitives :stack */ @@ -490,6 +524,11 @@ int executePrimitive(ob) } Kpush(ob3); break; + case SbyteArray: + n = getByteArraySize(ob2); + ob3 = newByteArray(n,ob2); + Kpush(ob3); + break; default: Kpush(ob2); break; @@ -532,31 +571,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; @@ -592,21 +636,7 @@ int executePrimitive(ob) /* ob2 ob1 get */ ob1 = Kpop(); ob2 = Kpop(); - switch(ob2.tag) { - case Sarray: break; - default: errorStackmachine("Usage:get"); - } - switch(ob1.tag) { - case Sinteger: break; - default: errorStackmachine("Usage:get"); - } - i =ob1.lc.ival; - size = getoaSize(ob2); - if ((0 <= i) && (i= size) { - i=0; - } - status = executeToken(token); - if (status || GotoP) break; + 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. */ } @@ -799,25 +837,17 @@ int executePrimitive(ob) */ for ( ; i<=lim; i += inc) { Kpush(KpoInteger(i)); - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - for (j=0; j i) errorStackmachine("The initial value must not be less than limit value (for).\n"); */ for ( ; i>=lim; i += inc) { Kpush(KpoInteger(i)); - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - for (j=0; jcontextName)); + } + putoa(qattr,0,qattr2); + putoa(qob,1,qattr); + putoa(qob,2,ob4); /* Argument */ + qob = KpoTree(qob); + Kpush(qob); + } else if (status & STATUS_BREAK) break; + } if (ccflag) { contextControl(CCPOP); ccflag = 0; @@ -1578,14 +1632,7 @@ int executePrimitive(ob) contextControl(CCPUSH); ccflag = 1; CurrentContextp = PrimitiveContextp; /* normal exec. */ - tokenArray = ob1.lc.tokenArray; - size = ob1.rc.ival; - for (i=0; i 0) { - signal(SIGALRM,ctrlC); alarm((unsigned int) n); - for (i=0; i