=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.37 retrieving revision 1.44 diff -u -p -r1.37 -r1.44 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2015/09/27 08:12:42 1.37 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2020/10/06 11:33:47 1.44 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.36 2006/02/02 05:55:33 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.43 2018/09/07 00:15:44 takayama Exp $ */ /* stackmachin.c */ #include @@ -11,6 +11,8 @@ #include "kclass.h" #include #include +#include +#include "mysig.h" /* The msys2 seems to make a buffer overflow of EnvOfStackmachine[]. The code @@ -19,11 +21,8 @@ The code 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 */ -#if defined(__MSYS__) -#define setjmp(e) _setjmp(e) -#define sigsetjmp(e,n) _setjmp(e) -#endif /* #define OPERAND_STACK_SIZE 2000 */ #define OPERAND_STACK_SIZE 30000 @@ -83,13 +82,14 @@ int GotoP = 0; static char *SMacros = #include "smacro.h" -static isInteger(char *); -static strToInteger(char *); -static power(int s,int i); +static int isInteger(char *); +static int strToInteger(char *); +static int 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; @@ -135,7 +135,7 @@ struct object newObjectArray(size) return(rob); } -isNullObject(obj) +int isNullObject(obj) struct object obj; { if (obj.tag == 0) return(1); @@ -403,7 +403,7 @@ void hashInitialize(struct dictionary *dic) } } -static isInteger(str) +static int isInteger(str) char *str; { int i; @@ -424,7 +424,7 @@ static isInteger(str) return(1); } -static strToInteger(str) +static int strToInteger(str) char *str; { int i; @@ -445,7 +445,7 @@ static strToInteger(str) return(r); } -static power(s,i) +static int power(s,i) int s; int i; { @@ -674,7 +674,7 @@ void printOperandStack() { -static initSystemDictionary() +static int initSystemDictionary() { StandardStack.ostack = StandardStackA; StandardStack.sp = StandardStackP; @@ -804,16 +804,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 */ @@ -868,9 +868,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) { @@ -918,7 +918,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(); @@ -929,7 +929,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) { @@ -938,11 +938,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) { @@ -964,11 +964,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 } @@ -1119,8 +1119,7 @@ int executeToken(token) -errorStackmachine(str) - char *str; +void errorStackmachine(char *str) { int i,j,k; static char *u="Usage:"; @@ -1162,7 +1161,7 @@ errorStackmachine(str) } }else { fprintf(stderr,"ERROR(sm): "); - fprintf(stderr,str); + fprintf(stderr,"%s",str); } fprintf(stderr,"\n"); MsgStackTraceInArrayp = traceNameStackToArrayp(); @@ -1177,11 +1176,10 @@ 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) - char *str; +int warningStackmachine(char *str) { extern int WarningMessageMode; extern int Strict; @@ -1189,8 +1187,8 @@ warningStackmachine(str) pushErrorStack(KnewErrorPacket(SerialCurrent,-1,str)); } if (WarningMessageMode != 1) { - fprintf(stderr,"WARNING(sm): "); - fprintf(stderr,str); + fprintf(stderr,"%s","WARNING(sm): "); + fprintf(stderr,"%s",str); } if (Strict) errorStackmachine(" "); return(0); @@ -1201,7 +1199,7 @@ warningStackmachine(str) /* NOTE: If you call this function and an error occured, you have to reset the jump buffer by setjmp(EnvOfStackMachine). cf. kxx/memo1.txt, kxx/stdserver00.c 1998, 2/6 */ -KSexecuteString(s) +int KSexecuteString(s) char *s; { struct tokens token; @@ -1222,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) { @@ -1240,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. */ @@ -1248,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) { @@ -1263,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. */ @@ -1272,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 { } } @@ -1290,11 +1290,11 @@ KSexecuteString(s) executePrimitive(ob); recursive--; if (KSPushEnvMode) *EnvOfStackMachine = *saved_EnvOfStackMachine; - if (localCatchCtrlC) { signal(SIGINT, sigfunc); } + if (localCatchCtrlC) { mysignal(SIGINT, sigfunc); } return(0); } -KSdefineMacros() { +int KSdefineMacros() { struct tokens token; int tmp; struct object ob = OINIT; @@ -1315,6 +1315,11 @@ KSdefineMacros() { } +void KSstart_quiet() { + extern int Quiet; + Quiet=1; + KSstart(); +} void KSstart() { struct tokens token; int tmp; @@ -1327,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 { } */ @@ -1366,7 +1371,7 @@ void KSpush(ob) Kpush(ob); } -struct object KSpeek(k) { +struct object KSpeek(int k) { return(peek(k)); } @@ -1625,7 +1630,7 @@ struct object KSdupErrors() { void cancelAlarm() { alarm((unsigned int) 0); - signal(SIGALRM,SIG_DFL); + mysignal(SIGALRM,SIG_DFL); } /* back-trace */