=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.22 retrieving revision 1.29 diff -u -p -r1.22 -r1.29 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2004/09/12 01:32:08 1.22 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2004/09/19 00:47:47 1.29 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.21 2004/09/12 00:26:21 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.28 2004/09/17 02:42:57 takayama Exp $ */ /* stackmachin.c */ #include @@ -74,6 +74,7 @@ static strToInteger(char *); static power(int s,int i); static void pstack(void); static struct object executableStringToExecutableArray(char *str); +static int isThereExecutableArrayOnStack(int n); extern int SerialCurrent; extern int QuoteMode; @@ -295,6 +296,12 @@ int putUserDictionary2(str,h0,h1,attr,dic) } return(0); } + if (OR_ATTR_FOR_ALL_WORDS & attr) { + for (i=0; i "); } if (!Calling_ctrlC_hook) { /* to avoid recursive call of ctrlC-hook. */ - Calling_ctrlC_hook = 1; + Calling_ctrlC_hook = 1; RestrictedMode = 0; KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; } Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */ @@ -862,9 +897,11 @@ void ctrlC(sig) extern int SGClock; extern int UserCtrlC; extern int OXlock; + extern int RestrictedMode, RestrictedMode_saved; signal(sig,SIG_IGN); /* see 133p */ + RestrictedMode = RestrictedMode_saved; cancelAlarm(); if (sig == SIGALRM) { fprintf(stderr,"ctrlC by SIGALRM\n"); @@ -923,12 +960,14 @@ int executeToken(token) int primitive; int size; int status; - struct tokens *tokenArray; int i,h0,h1; extern int WarningMessageMode; extern int Strict; extern int InSendmsg2; + extern int RestrictedMode, RestrictedMode_saved; + int localRestrictedMode_saved; + localRestrictedMode_saved = 0; if (GotoP) { /* for goto */ if (token.kind == ID && isLiteral(token.token)) { if (strcmp(&((token.token)[1]),GotoLabel) == 0) { @@ -976,22 +1015,30 @@ int executeToken(token) primitive = ((token.object.rc.op)->lc).ival; if (!(token.tflag & NO_DELAY)) { if ((ob.tag >= 0) && (UD_attr & ATTR_INFIX)) { - tracePopName(); return STATUS_INFIX; + return STATUS_INFIX; } } if (ob.tag >= 0) { /* there is a definition in the user dictionary */ if (ob.tag == SexecutableArray) { - tracePushName(token.token); - tokenArray = ob.lc.tokenArray; - size = ob.rc.ival; - for (i=0; i TRACE_MSG_SIZE) { - /* fprintf(stderr,"p=%d, TraceNameStackp=%d, strlen(t)=%d, t=%s\n",p,TraceNameStackp,strlen(t),t); */ + }else if ((strlen(t) + p) > (TRACE_MSG_SIZE-10)) { + /* fprintf(stderr,"p=%d, TraceNameStackp=%d, strlen(t)=%d, t=%s\n",p,TraceNameStackp,strlen(t),t); */ strcpy(&(s[p])," ..."); break; } @@ -1599,4 +1651,46 @@ char *traceShowStack(void) { } while (t != (char *)NULL); fprintf(stderr,"%s\n",s); return s; +} + +/* + if (fname != NULL) fname is pushed to the trace stack. + */ +int executeExecutableArray(struct object ob,char *fname,int withGotoP) { + struct tokens *tokenArray; + int size,i; + int status; + int infixOn; + struct tokens infixToken; + extern int GotoP; + + infixOn = 0; + if (ob.tag != SexecutableArray) errorStackmachine("Error (executeTokenArray): the argument is not a token array."); + + if (fname != NULL) tracePushName(fname); + tokenArray = ob.lc.tokenArray; + size = ob.rc.ival; + for (i=0; i