=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.7 retrieving revision 1.13 diff -u -p -r1.7 -r1.13 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2001/05/04 01:06:25 1.7 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2003/11/20 09:20:36 1.13 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.6 2001/01/27 05:48:46 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.12 2002/11/07 23:35:23 takayama Exp $ */ /* stackmachin.c */ #include @@ -14,8 +14,8 @@ /* #define OPERAND_STACK_SIZE 2000 */ #define OPERAND_STACK_SIZE 30000 #define SYSTEM_DICTIONARY_SIZE 200 -/* #define USER_DICTIONARY_SIZE 1223, 3581 */ -#define USER_DICTIONARY_SIZE 27449 +/* #define USER_DICTIONARY_SIZE 1223, 3581, 27449 */ +#define USER_DICTIONARY_SIZE 59359 /* The value of USER_DICTIONARY_SIZE must be prime number, because of hashing method */ #define ARGV_WORK_MAX (AGLIMIT+100) @@ -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; @@ -736,7 +737,11 @@ void scanner() { 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 +801,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 +817,7 @@ void scanner() { fprintf(Fstack,"\nscanner> "); } KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */ continue ; } else { } if (DebugStack >= 1) { printOperandStack(); } @@ -829,11 +839,15 @@ void ctrlC(sig) 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 +860,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 +881,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) @@ -945,6 +963,9 @@ int executeToken(token) ob.lc.ival = primitive; return(executePrimitive(ob)); } else { + if (QuoteMode) { + return(DO_QUOTE); + } if (WarningMessageMode == 1 || WarningMessageMode == 2) { char tmpc[1024]; if (strlen(token.token) < 900) { @@ -992,6 +1013,7 @@ errorStackmachine(str) char message0[1024]; char *message; extern int ErrorMessageMode; + cancelAlarm(); if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { pushErrorStack(KnewErrorPacket(SerialCurrent,-1,str)); } @@ -1083,7 +1105,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 +1118,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 +1136,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 +1484,8 @@ struct object KSdupErrors() { } return(rob); } - + +void cancelAlarm() { + alarm((unsigned int) 0); + signal(SIGALRM,SIG_DFL); +}