--- gforth/Attic/io.c 1994/06/17 12:35:05 1.3 +++ gforth/Attic/io.c 1995/01/18 18:41:38 1.7 @@ -7,6 +7,8 @@ Use -D_POSIX_VERSION for POSIX systems. */ +#include + #ifdef DOMAINOS #define _POSIX_VERSION #endif @@ -19,6 +21,9 @@ #endif #include #include +#include +#include "forth.h" +#include "io.h" #if defined (__GNUC__) # define alloca __builtin_alloca @@ -28,15 +33,15 @@ # endif #endif -#if defined (HAVE_UNISTD_H) -# include -#endif - #define NEW_TTY_DRIVER #define HAVE_BSD_SIGNALS +/* #ifndef DOMAINOS #define USE_XON_XOFF #endif +*/ + +#define HANDLE_SIGNALS /* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */ #if defined (USG) && !defined (hpux) @@ -45,7 +50,7 @@ /* System V machines use termio. */ #if !defined (_POSIX_VERSION) -# if defined (USG) || defined (hpux) || defined (Xenix) || defined (sgi) || defined (DGUX) || defined (ultrix) +# if defined (USG) || defined (hpux) || defined (Xenix) || defined (sgi) || defined (DGUX) || defined (ultrix) || defined (Solaris) # undef NEW_TTY_DRIVER # define TERMIO_TTY_DRIVER # include @@ -706,7 +711,42 @@ graceful_exit (int sig) fprintf (stderr, "\n\n%s.\n", sigmsg (sig)); else fprintf (stderr, "\n\nSignal %d received, terminated.\n", sig); - exit (sig); + exit (0x80|sig); +} + +jmp_buf throw_jmp_buf; + +static void +signal_throw(int sig) +{ + static int throw_codes[] = { + -256, + -28, + -257, + -258, + -259, + -260, + -261, + -55, + -262, + -23, + -9, + -263, + -264, + -265, + -266, + -267, + -268, + }; + signal(sig,signal_throw); + longjmp(throw_jmp_buf,throw_codes[sig-1]); /* or use siglongjmp ? */ +} + +static void +termprep (int sig) +{ + terminal_prepped=0; prep_terminal(); + signal(sig,termprep); } void @@ -720,10 +760,12 @@ install_signal_handlers (void) SIGALRM, SIGBUS #define SIGS_TO_QUIT SIGHUP, SIGQUIT, SIGABRT, SIGPIPE, \ SIGTERM +#define SIGS_TO_TERMPREP SIGCONT static short sigs_to_ignore [] = { SIGS_TO_IGNORE }; static short sigs_to_abort [] = { SIGS_TO_ABORT }; static short sigs_to_quit [] = { SIGS_TO_QUIT }; + static short sigs_to_termprep [] = { SIGS_TO_TERMPREP }; int i; #define DIM(X) (sizeof (X) / sizeof *(X)) @@ -731,8 +773,10 @@ install_signal_handlers (void) if (sigs_to_ignore [i]) signal (sigs_to_ignore [i], SIG_IGN); for (i = 0; i < DIM (sigs_to_abort); i++) - signal (sigs_to_abort [i], graceful_exit); /* !! change to throw */ + signal (sigs_to_abort [i], signal_throw); /* !! change to throw */ for (i = 0; i < DIM (sigs_to_quit); i++) signal (sigs_to_quit [i], graceful_exit); + for (i = 0; i < DIM (sigs_to_termprep); i++) + signal (sigs_to_termprep [i], termprep); } /* end signal handling */