=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.8 retrieving revision 1.15 diff -u -p -r1.8 -r1.15 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2001/12/19 23:39:53 1.8 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2004/09/04 11:25:58 1.15 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.7 2001/05/04 01:06:25 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.14 2003/12/05 13:51:31 takayama Exp $ */ /* stackmachin.c */ #include @@ -74,6 +74,7 @@ static void pstack(void); static struct object executableStringToExecutableArray(char *str); extern int SerialCurrent; +extern int QuoteMode; int SGClock = 0; int UserCtrlC = 0; @@ -733,10 +734,15 @@ void scanner() { char *tmp2; extern int ErrorMessageMode; int jval; + extern int InSendmsg2; getokenSM(INIT); initSystemDictionary(); +#if defined(__CYGWIN__) + if (sigsetjmp(EnvOfStackMachine,1)) { +#else if (setjmp(EnvOfStackMachine)) { +#endif /* do nothing in the case of error */ fprintf(stderr,"An error or interrupt in reading macros, files and command strings.\n"); exit(10); @@ -796,7 +802,11 @@ void scanner() { for (;;) { +#if defined(__CYGWIN__) + if (jval=sigsetjmp(EnvOfStackMachine,1)) { +#else if (jval=setjmp(EnvOfStackMachine)) { +#endif /* *** The following does not work properly. **** if (jval == 2) { if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { @@ -808,6 +818,8 @@ void scanner() { fprintf(Fstack,"\nscanner> "); } KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */ + InSendmsg2 = 0; continue ; } else { } if (DebugStack >= 1) { printOperandStack(); } @@ -826,14 +838,18 @@ void ctrlC(sig) extern int SGClock; extern int UserCtrlC; extern int OXlock; - + signal(sig,SIG_IGN); /* see 133p */ + cancelAlarm(); + if (sig == SIGALRM) { + fprintf(stderr,"ctrlC by SIGALRM\n"); + } if (SGClock) { UserCtrlC = 1; fprintf(stderr,"ctrl-c is locked because of gc.\n"); - signal(SIGINT,ctrlC); + signal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); return; } if (OXlock) { @@ -846,7 +862,7 @@ void ctrlC(sig) unlockCtrlCForOx(); } fprintf(stderr,"ctrl-c is locked because of ox lock %d.\n",UserCtrlC); - signal(SIGINT,ctrlC); + signal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); return; } if (ErrorMessageMode != 1) { @@ -867,7 +883,11 @@ void ctrlC(sig) */ getokenSM(INIT); /* It might fix the bug above. 1992/11/14 */ signal(SIGINT,ctrlC); +#if defined(__CYGWIN__) + siglongjmp(EnvOfStackMachine,2); +#else longjmp(EnvOfStackMachine,2); /* returns 2 for ctrl-C */ +#endif } int executeToken(token) @@ -881,6 +901,7 @@ int executeToken(token) int i,h0,h1; extern int WarningMessageMode; extern int Strict; + extern int InSendmsg2; if (GotoP) { /* for goto */ if (token.kind == ID && isLiteral(token.token)) { @@ -930,21 +951,35 @@ int executeToken(token) 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>. It is also aborted.\n",GotoLabel); @@ -1083,7 +1120,11 @@ KSexecuteString(s) if (KSPushEnvMode) { *saved_EnvOfStackMachine = *EnvOfStackMachine; +#if defined(__CYGWIN__) + if (jval = sigsetjmp(EnvOfStackMachine,1)) { +#else if (jval = setjmp(EnvOfStackMachine)) { +#endif *EnvOfStackMachine = *saved_EnvOfStackMachine; if (jval == 2) { if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { @@ -1092,11 +1133,17 @@ KSexecuteString(s) } recursive--; if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook?*/ return(-1); }else{ } }else{ if (recursive == 0) { +#if defined(__CYGWIN__) + if (jval=sigsetjmp(EnvOfStackMachine,1)) { +#else if (jval=setjmp(EnvOfStackMachine)) { +#endif if (jval == 2) { if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); @@ -1104,6 +1151,8 @@ KSexecuteString(s) } recursive = 0; if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + KSexecuteString(" (Computation is interrupted.) "); return(-1); }else { } } @@ -1450,4 +1499,62 @@ struct object KSdupErrors() { } return(rob); } - + +void cancelAlarm() { + alarm((unsigned int) 0); + signal(SIGALRM,SIG_DFL); +} + +/* back-trace */ +#define TraceNameStackSize 3000 +char *TraceNameStack[TraceNameStackSize]; +int TraceNameStackp = 0; +void tracePushName(char *s) { + char *t; + /* + t = (char *)sGC_malloc(strlen(s)+1); + if (t == NULL) { + fprintf(stderr,"No more memory.\n"); return; + } + strcpy(t,s); + */ + t = s; + TraceNameStack[TraceNameStackp++] = t; + if (TraceNameStackp >= TraceNameStackSize) { + fprintf(stderr,"Warning: TraceNameStack overflow. Clearing the stack.\n"); + TraceNameStackp = 0; + } +} +void traceClearStack(void) { + TraceNameStackp = 0; +} +char *tracePopName(void) { + if (TraceNameStackp <= 0) return (char *) NULL; + return TraceNameStack[--TraceNameStackp]; +} +#define TRACE_MSG_SIZE 320 +char *traceShowStack(void) { + char *s; + char *t; + int p; + s = (char *) sGC_malloc(TRACE_MSG_SIZE); + if (s == NULL) { + fprintf(stderr,"No more memory.\n"); return NULL; + } + sprintf(s,"Trace: "); + p = strlen(s); + do { + t = tracePopName(); + if (t == NULL) { + s[p] = ';'; s[p+1] = 0; + break; + }else if (strlen(t) + p -10 > TRACE_MSG_SIZE) { + strcpy(&(s[p])," ..."); + break; + } + strcpy(&(s[p]),t); p += strlen(t); + strcpy(&(s[p]),"<-"); p += 2; + } while (t != (char *)NULL); + fprintf(stderr,"%s\n",s); + return s; +}