diff --git a/inc/uutilsdefs.h b/inc/uutilsdefs.h index 4fb7f296..4061ae68 100644 --- a/inc/uutilsdefs.h +++ b/inc/uutilsdefs.h @@ -6,5 +6,5 @@ LispPTR unix_username(LispPTR *args); LispPTR unix_getparm(LispPTR *args); LispPTR unix_getenv(LispPTR *args); LispPTR unix_fullname(LispPTR *args); -LispPTR suspend_lisp(LispPTR *args); +LispPTR suspend_lisp(void); #endif diff --git a/inc/vmemsavedefs.h b/inc/vmemsavedefs.h index 916d19e2..3b095403 100644 --- a/inc/vmemsavedefs.h +++ b/inc/vmemsavedefs.h @@ -4,5 +4,5 @@ int lispstringP(LispPTR Lisp); LispPTR vmem_save(char *sysout_file_name); LispPTR vmem_save0(LispPTR *args); -void lisp_finish(void); +void lisp_finish(int exit_status); #endif diff --git a/src/subr.c b/src/subr.c index f1153b04..ff627b9b 100644 --- a/src/subr.c +++ b/src/subr.c @@ -29,6 +29,7 @@ /***********************************************************/ #include // for printf, sprintf, NULL +#include // for EXIT_FAILURE, EXIT_SUCCESS #include // for nanosleep, timespec #include "adr68k.h" // for NativeAligned2FromLAddr, NativeAligned4FromLAddr #include "arith.h" // for N_GETNUMBER, ARITH_SWITCH @@ -412,16 +413,17 @@ void OP_subrcall(int subr_no, int argnum) { break; case sb_LISPFINISH: - case sb_LISP_FINISH: + case sb_LISP_FINISH: { + int status; POP_SUBR_ARGS; - if ((argnum > 0) && (args[0] == S_POSITIVE)) - /* 8/03/88 This branch impossible to take, subr has no args */ - { - TopOfStack = suspend_lisp(args); - } else - lisp_finish(); + if (argnum == 0 || args[0] == NIL || args[0] == ATOM_T) + lisp_finish(EXIT_SUCCESS); + N_GETNUMBER(args[0], status, exit_fail); + lisp_finish(status); + exit_fail: + lisp_finish(EXIT_FAILURE); break; - + } case sb_NEWPAGE: POP_SUBR_ARGS; TopOfStack = newpage(args[0]); @@ -589,7 +591,7 @@ void OP_subrcall(int subr_no, int argnum) { case sb_SUSPEND_LISP: POP_SUBR_ARGS; /* Suspend Maiko */ - TopOfStack = suspend_lisp(args); + TopOfStack = suspend_lisp(); break; case sb_MONITOR_CONTROL: diff --git a/src/uutils.c b/src/uutils.c index e49e998d..3d660de3 100644 --- a/src/uutils.c +++ b/src/uutils.c @@ -292,7 +292,7 @@ LispPTR unix_fullname(LispPTR *args) { extern DLword *EmMouseX68K, *EmMouseY68K, *EmKbdAd068K, *EmRealUtilin68K, *EmUtilin68K; extern DLword *EmKbdAd168K, *EmKbdAd268K, *EmKbdAd368K, *EmKbdAd468K, *EmKbdAd568K; -LispPTR suspend_lisp(LispPTR *args) { +LispPTR suspend_lisp(void) { #ifndef DOS extern DLword *CTopKeyevent; extern LispPTR *KEYBUFFERING68k; diff --git a/src/vmemsave.c b/src/vmemsave.c index 0ccd58a5..e77af0f6 100644 --- a/src/vmemsave.c +++ b/src/vmemsave.c @@ -518,7 +518,7 @@ LispPTR vmem_save(char *sysout_file_name) /* Make sure that we kill off any Unix subprocesses before we go away */ -void lisp_finish(void) { +void lisp_finish(int exit_status) { char d[4]; DBPRINT(("finish lisp_finish\n")); @@ -536,5 +536,5 @@ void lisp_finish(void) { #ifdef DOS exit_host_filesystem(); #endif /* DOS */ - exit(0); + exit(exit_status); }