| version 1.13, 2004/09/12 02:37:57 |
version 1.26, 2020/10/06 11:33:46 |
|
|
| /* $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.25 2018/09/07 00:15:44 takayama Exp $ */ |
| /* primitive.c */ |
/* primitive.c */ |
| /* The functions in this module were in stackmachine.c */ |
/* The functions in this module were in stackmachine.c */ |
| |
|
| #include <stdio.h> |
#include <stdio.h> |
| |
#include <stdlib.h> |
| |
#include <string.h> |
| #include <signal.h> |
#include <signal.h> |
| |
#include <time.h> |
| |
#include <unistd.h> |
| #include "datatype.h" |
#include "datatype.h" |
| #include "stackm.h" |
#include "stackm.h" |
| #include "extern.h" |
#include "extern.h" |
| |
#include "extern2.h" |
| #include "gradedset.h" |
#include "gradedset.h" |
| #include "kclass.h" |
#include "kclass.h" |
| #include <sys/types.h> |
#include <sys/types.h> |
| #include <sys/times.h> |
#include <sys/times.h> |
| |
#include "mysig.h" |
| |
|
| int PrintDollar = 1; /* flag for printObject() */ |
int PrintDollar = 1; /* flag for printObject() */ |
| int PrintComma = 1; /* flag for printObject() */ |
int PrintComma = 1; /* flag for printObject() */ |
| Line 40 static char *operatorType(type) |
|
| Line 46 static char *operatorType(type) |
|
| return("Unknown operator"); |
return("Unknown operator"); |
| } |
} |
| |
|
| |
#define evalEA(ob1) if (ob1.tag == SexecutableArray) {\ |
| |
executeExecutableArray(ob1,(char *)NULL,0); ob1 = Kpop();} |
| |
|
| /****** primitive functions ***************************************** |
/****** primitive functions ***************************************** |
| the values must be greater than 1. 0 is used for special purposes.*/ |
the values must be greater than 1. 0 is used for special purposes.*/ |
| #define Sadd 1 |
#define Sadd 1 |
| Line 197 void printObject(ob,nl,fp) |
|
| Line 206 void printObject(ob,nl,fp) |
|
| case Sdouble: |
case Sdouble: |
| fprintf(fp,"<double> "); |
fprintf(fp,"<double> "); |
| break; |
break; |
| |
case SbyteArray: |
| |
fprintf(fp,"<byteArray> "); |
| |
break; |
| default: |
default: |
| fprintf(fp,"<Unknown object tag. %d >",ob.tag); |
fprintf(fp,"<Unknown object tag. %d >",ob.tag); |
| break; |
break; |
| Line 271 void printObject(ob,nl,fp) |
|
| Line 283 void printObject(ob,nl,fp) |
|
| printObjectList(&ob); |
printObjectList(&ob); |
| break; |
break; |
| case Sfile: |
case Sfile: |
| fprintf(fp,"Name=%s, FILE *=%x ",ob.lc.str,(int) ob.rc.file); |
fprintf(fp,"Name=%s, FILE *=%p ",ob.lc.str,ob.rc.file); |
| break; |
break; |
| case Sring: |
case Sring: |
| fprintf(fp,"Ring."); KshowRing(KopRingp(ob)); |
fprintf(fp,"Ring."); KshowRing(KopRingp(ob)); |
| Line 291 void printObject(ob,nl,fp) |
|
| Line 303 void printObject(ob,nl,fp) |
|
| case Sdouble: |
case Sdouble: |
| fprintf(fp,"%f",KopDouble(ob)); |
fprintf(fp,"%f",KopDouble(ob)); |
| break; |
break; |
| |
case SbyteArray: |
| |
printObject(byteArrayToArray(ob),nl,fp); /* Todo: I should save memory.*/ |
| |
break; |
| default: |
default: |
| fprintf(fp,"[Unknown object tag.]"); |
fprintf(fp,"[Unknown object tag.]"); |
| break; |
break; |
| Line 413 void KdefinePrimitiveFunctions() { |
|
| Line 428 void KdefinePrimitiveFunctions() { |
|
| int executePrimitive(ob) |
int executePrimitive(ob) |
| struct object ob; |
struct object ob; |
| { |
{ |
| struct object ob1; |
struct object ob1 = OINIT; |
| struct object ob2; |
struct object ob2 = OINIT; |
| struct object ob3; |
struct object ob3 = OINIT; |
| struct object ob4; |
struct object ob4 = OINIT; |
| struct object ob5; |
struct object ob5 = OINIT; |
| struct object rob; |
struct object rob = OINIT; |
| struct object obArray[OB_ARRAY_MAX]; |
struct object obArray[OB_ARRAY_MAX]; |
| struct object obArray2[OB_ARRAY_MAX]; |
struct object obArray2[OB_ARRAY_MAX]; |
| int size; |
int size; |
| Line 431 int executePrimitive(ob) |
|
| Line 446 int executePrimitive(ob) |
|
| FILE *fp; |
FILE *fp; |
| char *fname; |
char *fname; |
| int rank; |
int rank; |
| struct object oMat; |
struct object oMat = OINIT; |
| static int timerStart = 1; |
static int timerStart = 1; |
| static struct tms before, after; |
static struct tms before, after; |
| static time_t before_real, after_real; |
static time_t before_real, after_real; |
| struct object oInput; |
struct object oInput = OINIT; |
| char *str; |
char *str; |
| int ccflag = 0; |
int ccflag = 0; |
| extern int KeepInput; |
extern int KeepInput; |
| extern int History; |
extern int History; |
| extern struct ring *CurrentRingp; |
extern struct ring *CurrentRingp; |
| extern TimerOn; |
extern int TimerOn; |
| extern SecureMode; |
extern int SecureMode; |
| |
extern int RestrictedMode; |
| |
|
| infixOn = 0; |
infixOn = 0; |
| |
|
| Line 450 int executePrimitive(ob) |
|
| Line 466 int executePrimitive(ob) |
|
| fprintf(Fstack,"In execute %d\n",ob.lc.ival); printOperandStack(); |
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); |
if (GotoP) return(0); |
| switch (ob.lc.ival) { |
switch (ob.lc.ival) { |
| /* Postscript primitives :stack */ |
/* Postscript primitives :stack */ |
| Line 498 int executePrimitive(ob) |
|
| Line 526 int executePrimitive(ob) |
|
| } |
} |
| Kpush(ob3); |
Kpush(ob3); |
| break; |
break; |
| |
case SbyteArray: |
| |
n = getByteArraySize(ob2); |
| |
ob3 = newByteArray(n,ob2); |
| |
Kpush(ob3); |
| |
break; |
| default: |
default: |
| Kpush(ob2); |
Kpush(ob2); |
| break; |
break; |
| Line 540 int executePrimitive(ob) |
|
| Line 573 int executePrimitive(ob) |
|
| |
|
| /* Postscript primitives :arithmetic */ |
/* Postscript primitives :arithmetic */ |
| case Sadd: |
case Sadd: |
| ob1 = Kpop(); |
ob1 = Kpop(); |
| ob2 = Kpop(); |
ob2 = Kpop(); |
| |
evalEA(ob1); evalEA(ob2); |
| rob = KooAdd(ob1,ob2); |
rob = KooAdd(ob1,ob2); |
| Kpush(rob); |
Kpush(rob); |
| break; |
break; |
| case Ssub: |
case Ssub: |
| ob2 = Kpop(); |
ob2 = Kpop(); |
| ob1 = Kpop(); |
ob1 = Kpop(); |
| |
evalEA(ob1); evalEA(ob2); |
| rob = KooSub(ob1,ob2); |
rob = KooSub(ob1,ob2); |
| Kpush(rob); |
Kpush(rob); |
| break; |
break; |
| case Smult: |
case Smult: |
| ob2 = Kpop(); |
ob2 = Kpop(); |
| ob1 = Kpop(); |
ob1 = Kpop(); |
| |
evalEA(ob1); evalEA(ob2); |
| rob = KooMult(ob1,ob2); |
rob = KooMult(ob1,ob2); |
| Kpush(rob); |
Kpush(rob); |
| break; |
break; |
| case Sidiv: |
case Sidiv: |
| ob2 = Kpop(); ob1 = Kpop(); |
ob2 = Kpop(); ob1 = Kpop(); |
| |
evalEA(ob1); evalEA(ob2); |
| rob = KooDiv(ob1,ob2); |
rob = KooDiv(ob1,ob2); |
| Kpush(rob); |
Kpush(rob); |
| break; |
break; |
| |
|
| case Sdiv: |
case Sdiv: |
| ob2 = Kpop(); ob1 = Kpop(); |
ob2 = Kpop(); ob1 = Kpop(); |
| |
evalEA(ob1); evalEA(ob2); |
| rob = KooDiv2(ob1,ob2); |
rob = KooDiv2(ob1,ob2); |
| Kpush(rob); |
Kpush(rob); |
| break; |
break; |
| Line 609 int executePrimitive(ob) |
|
| Line 647 int executePrimitive(ob) |
|
| /* Or; [[a_00 ....] [a_10 ....] ....] [1 0] any put. MultiIndex. */ |
/* Or; [[a_00 ....] [a_10 ....] ....] [1 0] any put. MultiIndex. */ |
| ob1 = Kpop(); ob2 = Kpop(); ob3 = Kpop(); |
ob1 = Kpop(); ob2 = Kpop(); ob3 = Kpop(); |
| switch(ob2.tag) { |
switch(ob2.tag) { |
| |
case SuniversalNumber: |
| |
ob2 = Kto_int32(ob2); /* do not break and go to Sinteger */ |
| case Sinteger: |
case Sinteger: |
| switch(ob3.tag) { |
switch(ob3.tag) { |
| case Sarray: |
case Sarray: |
| Line 633 int executePrimitive(ob) |
|
| Line 673 int executePrimitive(ob) |
|
| errorStackmachine("Index is out of bound. (put)\n"); |
errorStackmachine("Index is out of bound. (put)\n"); |
| } |
} |
| break; |
break; |
| |
case SbyteArray: |
| |
i = ob2.lc.ival; |
| |
size = getByteArraySize(ob3); |
| |
if ((0 <= i) && (i<size)) { |
| |
if (ob1.tag != Sinteger) ob1 = Kto_int32(ob1); |
| |
if (ob1.tag != Sinteger) errorStackmachine("One can put only integer.\n"); |
| |
KopByteArray(ob3)[i] = KopInteger(ob1); |
| |
}else{ |
| |
errorStackmachine("Index is out of bound. (put)\n"); |
| |
} |
| |
break; |
| default: errorStackmachine("Usage:put"); |
default: errorStackmachine("Usage:put"); |
| } |
} |
| break; |
break; |
| Line 643 int executePrimitive(ob) |
|
| Line 694 int executePrimitive(ob) |
|
| if (ob5.tag != Sarray) |
if (ob5.tag != Sarray) |
| errorStackmachine("Object pointed by the multi-index is not array (put)\n"); |
errorStackmachine("Object pointed by the multi-index is not array (put)\n"); |
| ob4 = getoa(ob2,i); |
ob4 = getoa(ob2,i); |
| |
if (ob4.tag == SuniversalNumber) ob4 = Kto_int32(ob4); |
| if (ob4.tag != Sinteger) |
if (ob4.tag != Sinteger) |
| errorStackmachine("Index has to be an integer. (put)\n"); |
errorStackmachine("Index has to be an integer. (put)\n"); |
| k = ob4.lc.ival; |
k = ob4.lc.ival; |
| Line 703 int executePrimitive(ob) |
|
| Line 755 int executePrimitive(ob) |
|
| case Spoly: |
case Spoly: |
| Kpush(KpoInteger(KpolyLength(KopPOLY(ob1)))); |
Kpush(KpoInteger(KpolyLength(KopPOLY(ob1)))); |
| break; |
break; |
| |
case SbyteArray: |
| |
Kpush(KpoInteger(getByteArraySize(ob1))); |
| |
break; |
| default: errorStackmachine("Usage:length"); |
default: errorStackmachine("Usage:length"); |
| } |
} |
| break; |
break; |
| Line 744 int executePrimitive(ob) |
|
| Line 799 int executePrimitive(ob) |
|
| errorStackmachine("Usage:loop"); |
errorStackmachine("Usage:loop"); |
| break; |
break; |
| } |
} |
| tokenArray = ob1.lc.tokenArray; |
|
| size = ob1.rc.ival; |
|
| i = 0; |
|
| while (1) { |
while (1) { |
| token = tokenArray[i]; |
status = executeExecutableArray(ob1,(char *)NULL,1); |
| /***printf("[token %d]%s\n",i,token.token);*/ |
|
| i++; |
|
| if (i >= size) { |
|
| i=0; |
|
| } |
|
| status = executeToken(token); |
|
| if ((status & STATUS_BREAK) || GotoP) break; |
if ((status & STATUS_BREAK) || GotoP) break; |
| /* here, do not return 1. Do not propagate exit signal outside of the |
/* here, do not return 1. Do not propagate exit signal outside of the |
| loop. */ |
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; |
break; |
| |
|
| Line 802 int executePrimitive(ob) |
|
| Line 839 int executePrimitive(ob) |
|
| */ |
*/ |
| for ( ; i<=lim; i += inc) { |
for ( ; i<=lim; i += inc) { |
| Kpush(KpoInteger(i)); |
Kpush(KpoInteger(i)); |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,1); |
| size = ob1.rc.ival; |
if ((status & STATUS_BREAK) || GotoP) goto xyz; |
| for (j=0; j<size; j++) { |
|
| status = executeToken(tokenArray[j]); |
|
| if ((status & STATUS_BREAK) || GotoP) goto xyz; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (j == size-1) errorStackmachine("infix operator at the end.\n"); |
|
| infixOn = 1; infixToken = tokenArray[j]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if ((status & STATUS_BREAK) || GotoP) goto xyz; |
|
| } |
|
| |
|
| } |
|
| } |
} |
| }else{ |
}else{ |
| /* |
/* |
| Line 825 int executePrimitive(ob) |
|
| Line 848 int executePrimitive(ob) |
|
| */ |
*/ |
| for ( ; i>=lim; i += inc) { |
for ( ; i>=lim; i += inc) { |
| Kpush(KpoInteger(i)); |
Kpush(KpoInteger(i)); |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,1); |
| size = ob1.rc.ival; |
if ((status & STATUS_BREAK) || GotoP) goto xyz; |
| for (j=0; j<size; j++) { |
|
| status = executeToken(tokenArray[j]); |
|
| if ((status & STATUS_BREAK) || GotoP) goto xyz; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (j == size-1) errorStackmachine("infix operator at the end.\n"); |
|
| infixOn = 1; infixToken = tokenArray[j]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if ((status & STATUS_BREAK) || GotoP) goto xyz; |
|
| } |
|
| |
|
| } |
|
| } |
} |
| } |
} |
| xyz: ; |
xyz: ; |
| Line 871 int executePrimitive(ob) |
|
| Line 880 int executePrimitive(ob) |
|
| |
|
| for (i=0; i<osize; i++) { |
for (i=0; i<osize; i++) { |
| Kpush(getoa(ob1,i)); |
Kpush(getoa(ob1,i)); |
| tokenArray = ob2.lc.tokenArray; |
status = executeExecutableArray(ob2,(char *)NULL,0); |
| size = ob2.rc.ival; |
if (status & STATUS_BREAK) goto foor; |
| for (j=0; j<size; j++) { |
|
| status = executeToken(tokenArray[j]); |
|
| if (status & STATUS_BREAK) goto foor; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (j == size-1) errorStackmachine("infix operator at the end(map).\n"); |
|
| infixOn = 1; infixToken = tokenArray[j]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if ((status & STATUS_BREAK) || GotoP) goto foor; |
|
| } |
|
| |
|
| } |
|
| } |
} |
| foor: ; |
foor: ; |
| /*KSexecuteString("]");*/ |
/*KSexecuteString("]");*/ |
| Line 935 int executePrimitive(ob) |
|
| Line 930 int executePrimitive(ob) |
|
| ob1 = ob2; |
ob1 = ob2; |
| } |
} |
| /* execute ob1 */ |
/* execute ob1 */ |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| size = ob1.rc.ival; |
if (status & STATUS_BREAK) return(status); |
| for (i=0; i<size; i++) { |
|
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) return(status); |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(if).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) return(status); |
|
| } |
|
| |
|
| } |
|
| |
|
| break; |
break; |
| |
|
| case Sexec: |
case Sexec: |
| Line 962 int executePrimitive(ob) |
|
| Line 942 int executePrimitive(ob) |
|
| case SexecutableArray: break; |
case SexecutableArray: break; |
| default: errorStackmachine("Usage:exec"); |
default: errorStackmachine("Usage:exec"); |
| } |
} |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| size = ob1.rc.ival; |
|
| for (i=0; i<size; i++) { |
|
| token = tokenArray[i]; |
|
| /***printf("[token %d]%s\n",i,token.token);*/ |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(exec).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| break; |
break; |
| |
|
| /* Postscript primitives :dictionary */ |
/* Postscript primitives :dictionary */ |
| Line 1240 int executePrimitive(ob) |
|
| Line 1203 int executePrimitive(ob) |
|
| default: errorStackmachine("Usage:system"); |
default: errorStackmachine("Usage:system"); |
| } |
} |
| if (SecureMode) errorStackmachine("Security violation."); |
if (SecureMode) errorStackmachine("Security violation."); |
| system( ob1.lc.str ); |
{int rr; rr=system( ob1.lc.str );} |
| break; |
break; |
| |
|
| case Scat_n: |
case Scat_n: |
| Line 1559 int executePrimitive(ob) |
|
| Line 1522 int executePrimitive(ob) |
|
| } |
} |
| /* normal exec. */ |
/* normal exec. */ |
| Kpush(ob2); |
Kpush(ob2); |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| size = ob1.rc.ival; |
|
| for (i=0; i<size; i++) { |
|
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(sendmsg).\n"); |
|
| infixOn = 1; infixToken = token; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| if (ccflag) { |
if (ccflag) { |
| contextControl(CCPOP); ccflag = 0; /* recover the Current context. */ |
contextControl(CCPOP); ccflag = 0; /* recover the Current context. */ |
| } |
} |
| |
|
| break; |
break; |
| case Ssendmsg2: |
case Ssendmsg2: |
| /* ob2 ob4 { .........} sendmsg2 */ |
/* ob2 ob4 { .........} sendmsg2 */ |
| Line 1616 int executePrimitive(ob) |
|
| Line 1564 int executePrimitive(ob) |
|
| } |
} |
| /* normal exec. */ |
/* normal exec. */ |
| Kpush(ob2); Kpush(ob4); |
Kpush(ob2); Kpush(ob4); |
| |
|
| |
/* We cannot use executeExecutableArray(ob1,(char *)NULL) because of |
| |
the quote mode. Think about it later. */ |
| tokenArray = ob1.lc.tokenArray; |
tokenArray = ob1.lc.tokenArray; |
| size = ob1.rc.ival; |
size = ob1.rc.ival; |
| for (i=0; i<size; i++) { |
for (i=0; i<size; i++) { |
| Line 1636 int executePrimitive(ob) |
|
| Line 1587 int executePrimitive(ob) |
|
| |
|
| if (QuoteMode && (status & DO_QUOTE)) { |
if (QuoteMode && (status & DO_QUOTE)) { |
| /* generate tree object, for kan/k0 */ |
/* generate tree object, for kan/k0 */ |
| struct object qob; |
struct object qob = OINIT; |
| struct object qattr; |
struct object qattr = OINIT; |
| struct object qattr2; |
struct object qattr2 = OINIT; |
| if (i==0) { Kpop(); Kpop();} |
if (i==0) { Kpop(); Kpop();} |
| qob = newObjectArray(3); |
qob = newObjectArray(3); |
| qattr = newObjectArray(1); |
qattr = newObjectArray(1); |
| Line 1683 int executePrimitive(ob) |
|
| Line 1634 int executePrimitive(ob) |
|
| contextControl(CCPUSH); ccflag = 1; |
contextControl(CCPUSH); ccflag = 1; |
| CurrentContextp = PrimitiveContextp; |
CurrentContextp = PrimitiveContextp; |
| /* normal exec. */ |
/* normal exec. */ |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| size = ob1.rc.ival; |
|
| for (i=0; i<size; i++) { |
|
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(primmsg).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| |
|
| contextControl(CCPOP); /* recover the Current context. */ |
contextControl(CCPOP); /* recover the Current context. */ |
| break; |
break; |
| |
|
| Line 1745 int executePrimitive(ob) |
|
| Line 1679 int executePrimitive(ob) |
|
| } |
} |
| /* normal exec. */ |
/* normal exec. */ |
| Kpush(ob2); Kpush(ob4); |
Kpush(ob2); Kpush(ob4); |
| tokenArray = ob1.lc.tokenArray; |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| size = ob1.rc.ival; |
|
| for (i=0; i<size; i++) { |
|
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(supmsg).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| if (ccflag) { |
if (ccflag) { |
| contextControl(CCPOP); ccflag = 0; /* recover the Current context. */ |
contextControl(CCPOP); ccflag = 0; /* recover the Current context. */ |
| } |
} |
| Line 1829 int executePrimitive(ob) |
|
| Line 1747 int executePrimitive(ob) |
|
| errorStackmachine("Usage:tlimit"); |
errorStackmachine("Usage:tlimit"); |
| break; |
break; |
| } |
} |
| tokenArray = ob1.lc.tokenArray; |
|
| size = ob1.rc.ival; |
|
| n = ob2.lc.ival; |
n = ob2.lc.ival; |
| i = 0; |
|
| if (n > 0) { |
if (n > 0) { |
| signal(SIGALRM,ctrlC); alarm((unsigned int) n); |
mysignal(SIGALRM,ctrlC); alarm((unsigned int) n); |
| for (i=0; i<size; i++) { |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(tlimit).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| cancelAlarm(); |
cancelAlarm(); |
| }else{ |
}else{ |
| before_real = time(&before_real); |
before_real = time(&before_real); |
| times(&before); |
times(&before); |
| for (i=0; i<size; i++) { |
status = executeExecutableArray(ob1,(char *)NULL,0); |
| token = tokenArray[i]; |
|
| status = executeToken(token); |
|
| if (status & STATUS_BREAK) break; |
|
| |
|
| if (status & STATUS_INFIX) { |
|
| if (i == size-1) errorStackmachine("infix operator at the end(tlimit).\n"); |
|
| infixOn = 1; infixToken = tokenArray[i]; |
|
| infixToken.tflag |= NO_DELAY; continue; |
|
| }else if (infixOn) { |
|
| infixOn = 0; status = executeToken(infixToken); |
|
| if (status & STATUS_BREAK) break; |
|
| } |
|
| |
|
| } |
|
| times(&after); |
times(&after); |
| after_real = time(&after_real); |
after_real = time(&after_real); |
| ob1 = newObjectArray(3); |
ob1 = newObjectArray(3); |