=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.34 retrieving revision 1.43 diff -u -p -r1.34 -r1.43 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2006/02/01 00:30:05 1.34 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2018/09/07 00:15:44 1.43 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.33 2005/07/18 10:55:16 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.42 2016/03/31 06:34:29 takayama Exp $ */ /* stackmachin.c */ #include @@ -11,7 +11,17 @@ #include "kclass.h" #include #include +#include "mysig.h" +/* The msys2 seems to make a buffer overflow of EnvOfStackmachine[]. +The code +[(x) ring_of_differential_operators 11] define_ring +( Dx*(x+Dx) ) /ff set +causes the segfault because Mp_zero is borken. Is it a bug of msys2? +Anyway, the following definition seems to be a workaround. 2015.09 +Singnals do not work properly on msys2. (gcc -dM -E ... to see macros defs) +See stackm.h +*/ /* #define OPERAND_STACK_SIZE 2000 */ #define OPERAND_STACK_SIZE 30000 @@ -792,16 +802,16 @@ void scanner() { initSystemDictionary(); #if defined(__CYGWIN__) - if (sigsetjmp(EnvOfStackMachine,1)) { + if (MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (setjmp(EnvOfStackMachine)) { + if (MYSETJMP(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); } else { } - if (signal(SIGINT,SIG_IGN) != SIG_IGN) { - signal(SIGINT,ctrlC); + if (mysignal(SIGINT,SIG_IGN) != SIG_IGN) { + mysignal(SIGINT,ctrlC); } /* setup quiet mode or not */ @@ -856,9 +866,9 @@ void scanner() { for (;;) { #if defined(__CYGWIN__) - if (jval=sigsetjmp(EnvOfStackMachine,1)) { + if (jval=MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval=setjmp(EnvOfStackMachine)) { + if (jval=MYSETJMP(EnvOfStackMachine)) { #endif /* *** The following does not work properly. **** if (jval == 2) { @@ -906,7 +916,7 @@ void ctrlC(sig) extern int OXlock; extern int RestrictedMode, RestrictedMode_saved; - signal(sig,SIG_IGN); + mysignal(sig,SIG_IGN); /* see 133p */ RestrictedMode = RestrictedMode_saved; cancelAlarm(); @@ -917,7 +927,7 @@ void ctrlC(sig) if (SGClock) { UserCtrlC = 1; fprintf(stderr,"ctrl-c is locked because of gc.\n"); - signal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); + mysignal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); return; } if (OXlock) { @@ -926,11 +936,11 @@ void ctrlC(sig) if (UserCtrlC > 3) { fprintf(stderr,"OK. You are eager to cancel the computation.\n"); fprintf(stderr,"You should close the ox communication cannel.\n"); - signal(SIGINT,ctrlC); + mysignal(SIGINT,ctrlC); unlockCtrlCForOx(); } fprintf(stderr,"ctrl-c is locked because of ox lock %d.\n",UserCtrlC); - signal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); + mysignal(sig,ctrlC); if (sig == SIGALRM) alarm((unsigned int)10); return; } if (ErrorMessageMode != 1) { @@ -952,11 +962,11 @@ void ctrlC(sig) It SOMETIMES makes core dump. */ getokenSM(INIT); /* It might fix the bug above. 1992/11/14 */ - signal(SIGINT,ctrlC); + mysignal(SIGINT,ctrlC); #if defined(__CYGWIN__) - siglongjmp(EnvOfStackMachine,2); + MYSIGLONGJMP(EnvOfStackMachine,2); #else - longjmp(EnvOfStackMachine,2); /* returns 2 for ctrl-C */ + MYLONGJMP(EnvOfStackMachine,2); /* returns 2 for ctrl-C */ #endif } @@ -1065,21 +1075,24 @@ int executeToken(token) return(0); /* normal exit.*/ } } - if (WarningMessageMode == 1 || WarningMessageMode == 2) { + { char tmpc[1024]; if (strlen(token.token) < 900) { - sprintf(tmpc,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); - }else {strcpy(tmpc,"Warning: identifier is not in the dictionaries.");} - pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); + sprintf(tmpc,"\n>>Warning: The identifier <<%s>> is not in the system dictionary\n>> nor in the user dictionaries. Push NullObject.\n",token.token); + }else {strcpy(tmpc,"\n>>Warning: identifier is not in the dictionaries.\n");} + /* do not use %% in a string. tmpc will be used as fprintf(stderr,tmpc); */ + if (WarningMessageMode == 1 || WarningMessageMode == 2) { + pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); + } + if (WarningMessageMode != 1) { + fprintf(Fstack,"%s",tmpc); + /*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ + } + if (Strict) { + errorStackmachine(tmpc); + } + Kpush(NullObject); } - if (WarningMessageMode != 1) { - fprintf(Fstack,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); - /*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ - } - if (Strict) { - errorStackmachine("Warning: identifier is not in the dictionaries"); - } - Kpush(NullObject); } } } else if (token.kind == EXECUTABLE_STRING) { @@ -1162,7 +1175,7 @@ errorStackmachine(str) stdOperandStack(); contextControl(CCRESTORE); getokenSM(INIT); /* It might fix the bug. 1996/3/10 */ /* fprintf(stderr,"Now, Long jump!\n"); */ - longjmp(EnvOfStackMachine,1); + MYLONGJMP(EnvOfStackMachine,1); } warningStackmachine(str) @@ -1207,16 +1220,16 @@ KSexecuteString(s) we crash. So, we use localCatchCtrlC. */ if (localCatchCtrlC) { - sigfunc = signal(SIGINT,SIG_IGN); - signal(SIGINT,ctrlC); + sigfunc = mysignal(SIGINT,SIG_IGN); + mysignal(SIGINT,ctrlC); } if (KSPushEnvMode) { *saved_EnvOfStackMachine = *EnvOfStackMachine; #if defined(__CYGWIN__) - if (jval = sigsetjmp(EnvOfStackMachine,1)) { + if (jval = MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval = setjmp(EnvOfStackMachine)) { + if (jval = MYSETJMP(EnvOfStackMachine)) { #endif *EnvOfStackMachine = *saved_EnvOfStackMachine; if (jval == 2) { @@ -1225,7 +1238,7 @@ KSexecuteString(s) } } recursive--; - if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + if (localCatchCtrlC) { mysignal(SIGINT, sigfunc); } if (!Calling_ctrlC_hook) { Calling_ctrlC_hook = 1; RestrictedMode = 0; KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ @@ -1233,14 +1246,15 @@ KSexecuteString(s) } Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook?*/ + /* fprintf(stderr,"result code=-1 for %s\n",s); */ return(-1); }else{ } }else{ if (recursive == 0) { #if defined(__CYGWIN__) - if (jval=sigsetjmp(EnvOfStackMachine,1)) { + if (jval=MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval=setjmp(EnvOfStackMachine)) { + if (jval=MYSETJMP(EnvOfStackMachine)) { #endif if (jval == 2) { if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { @@ -1248,7 +1262,7 @@ KSexecuteString(s) } } recursive = 0; - if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + if (localCatchCtrlC) { mysignal(SIGINT, sigfunc); } if (!Calling_ctrlC_hook) { Calling_ctrlC_hook = 1; RestrictedMode = 0; KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ @@ -1257,6 +1271,7 @@ KSexecuteString(s) Calling_ctrlC_hook = 0; Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); + /* fprintf(stderr,"result code=-1 for %s\n",s);*/ return(-1); }else { } } @@ -1275,7 +1290,7 @@ KSexecuteString(s) executePrimitive(ob); recursive--; if (KSPushEnvMode) *EnvOfStackMachine = *saved_EnvOfStackMachine; - if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + if (localCatchCtrlC) { mysignal(SIGINT, sigfunc); } return(0); } @@ -1300,6 +1315,11 @@ KSdefineMacros() { } +void KSstart_quiet() { + extern int Quiet; + Quiet=1; + KSstart(); +} void KSstart() { struct tokens token; int tmp; @@ -1312,7 +1332,7 @@ void KSstart() { /* The following line may cause a core dump, if you do not setjmp properly after calling KSstart().*/ /* - if (setjmp(EnvOfStackMachine)) { + if (MYSETJMP(EnvOfStackMachine)) { fprintf(stderr,"KSstart(): An error or interrupt in reading macros, files and command strings.\n"); exit(10); } else { } */ @@ -1610,7 +1630,7 @@ struct object KSdupErrors() { void cancelAlarm() { alarm((unsigned int) 0); - signal(SIGALRM,SIG_DFL); + mysignal(SIGALRM,SIG_DFL); } /* back-trace */