--- gforth/Attic/io.c 1994/02/11 16:30:46 1.1 +++ gforth/Attic/io.c 1994/11/29 16:22:41 1.6 @@ -3,12 +3,25 @@ The following is stolen from the readline library for bash */ +/* Use -DDOMAINOS for Apollo Domain-OS. + Use -D_POSIX_VERSION for POSIX systems. +*/ + +#ifdef DOMAINOS +#define _POSIX_VERSION +#endif + #include #include #include +#ifndef DOMAINOS #include +#endif #include #include +#include +#include "forth.h" +#include "io.h" #if defined (__GNUC__) # define alloca __builtin_alloca @@ -24,7 +37,13 @@ #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) @@ -33,7 +52,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 @@ -89,7 +108,7 @@ extern int errno; # endif /* USGr3 */ #endif /* USG && hpux */ -#if defined (_POSIX_VERSION) || defined (USGr3) +#if (defined (_POSIX_VERSION) || defined (USGr3)) && !defined(DOMAINOS) # include # define direct dirent # if defined (_POSIX_VERSION) @@ -694,7 +713,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 @@ -705,13 +759,15 @@ install_signal_handlers (void) but I would like something more automatic - anton */ #define SIGS_TO_IGNORE SIGCHLD #define SIGS_TO_ABORT SIGINT, SIGILL, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, \ - SIGALRM, SIGEMT, SIGBUS, SIGSYS + 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)) @@ -719,8 +775,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 */