Diff for /gforth/Attic/io.c between versions 1.1 and 1.9

version 1.1, 1994/02/11 16:30:46 version 1.9, 1995/09/06 21:00:19
Line 3 Line 3
         The following is stolen from the readline library for bash          The following is stolen from the readline library for bash
 */  */
   
   /*
      Use -D_POSIX_VERSION for POSIX systems.
   */
   
   #include <unistd.h>
   
   #ifdef apollo
   #define _POSIX_VERSION
   #endif
   
 #include <stdio.h>  #include <stdio.h>
 #include <signal.h>  #include <signal.h>
 #include <sys/types.h>  #include <sys/types.h>
   #ifndef apollo
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
   #endif
 #include <fcntl.h>  #include <fcntl.h>
 #include <sys/file.h>  #include <sys/file.h>
   #include <setjmp.h>
   #include "forth.h"
   #include "io.h"
   
 #if defined (__GNUC__)  #if defined (__GNUC__)
 #  define alloca __builtin_alloca  #  define alloca __builtin_alloca
Line 18 Line 33
 #  endif  #  endif
 #endif  #endif
   
 #if defined (HAVE_UNISTD_H)  
 #  include <unistd.h>  
 #endif  
   
 #define NEW_TTY_DRIVER  #define NEW_TTY_DRIVER
 #define HAVE_BSD_SIGNALS  #define HAVE_BSD_SIGNALS
   /*
   #ifndef apollo
 #define USE_XON_XOFF  #define USE_XON_XOFF
   #endif
   */
   
   #define HANDLE_SIGNALS
   
 /* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */  /* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */
 #if defined (USG) && !defined (hpux)  #if defined (USG) && !defined (hpux)
Line 33 Line 50
   
 /* System V machines use termio. */  /* System V machines use termio. */
 #if !defined (_POSIX_VERSION)  #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  #    undef NEW_TTY_DRIVER
 #    define TERMIO_TTY_DRIVER  #    define TERMIO_TTY_DRIVER
 #    include <termio.h>  #    include <termio.h>
Line 89  extern int errno; Line 106  extern int errno;
 #  endif /* USGr3 */  #  endif /* USGr3 */
 #endif /* USG && hpux */  #endif /* USG && hpux */
   
 #if defined (_POSIX_VERSION) || defined (USGr3)  #if (defined (_POSIX_VERSION) || defined (USGr3)) && !defined(apollo)
 #  include <dirent.h>  #  include <dirent.h>
 #  define direct dirent  #  define direct dirent
 #  if defined (_POSIX_VERSION)  #  if defined (_POSIX_VERSION)
Line 553  long key_avail (stream) Line 570  long key_avail (stream)
   long chars_avail = pending;    long chars_avail = pending;
   int result;    int result;
   
     if(!terminal_prepped)  prep_terminal();
   
 #if defined (FIONREAD)  #if defined (FIONREAD)
   result = ioctl (tty, FIONREAD, &chars_avail);    result = ioctl (tty, FIONREAD, &chars_avail);
 #endif  #endif
Line 588  unsigned char getkey(stream) Line 607  unsigned char getkey(stream)
   int result;    int result;
   unsigned char c;    unsigned char c;
   
     if(!terminal_prepped)  prep_terminal();
   
   while (pending < 0)    while (pending < 0)
     {      {
       result = read (fileno (stream), &c, sizeof (char));        result = read (fileno (stream), &c, sizeof (char));
Line 598  unsigned char getkey(stream) Line 619  unsigned char getkey(stream)
       /* If zero characters are returned, then the file that we are        /* If zero characters are returned, then the file that we are
          reading from is empty!  Return EOF in that case. */           reading from is empty!  Return EOF in that case. */
       if (result == 0)        if (result == 0)
         return (0);          return CTRL('D');
   
       /* If the error that we received was SIGINT, then try again,        /* If the error that we received was SIGINT, then try again,
          this is simply an interrupted system call to read ().           this is simply an interrupted system call to read ().
Line 694  graceful_exit (int sig) Line 715  graceful_exit (int sig)
     fprintf (stderr, "\n\n%s.\n", sigmsg (sig));      fprintf (stderr, "\n\n%s.\n", sigmsg (sig));
   else    else
     fprintf (stderr, "\n\nSignal %d received, terminated.\n", sig);      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;
     signal(sig,termprep);
 }  }
   
 void  void
Line 705  install_signal_handlers (void) Line 761  install_signal_handlers (void)
    but I would like something more automatic - anton */     but I would like something more automatic - anton */
 #define SIGS_TO_IGNORE  SIGCHLD  #define SIGS_TO_IGNORE  SIGCHLD
 #define SIGS_TO_ABORT   SIGINT, SIGILL, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, \  #define SIGS_TO_ABORT   SIGINT, SIGILL, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, \
                         SIGALRM, SIGEMT, SIGBUS, SIGSYS                          SIGALRM,  SIGBUS
 #define SIGS_TO_QUIT    SIGHUP, SIGQUIT, SIGABRT, SIGPIPE, \  #define SIGS_TO_QUIT    SIGHUP, SIGQUIT, SIGABRT, SIGPIPE, \
                         SIGTERM                           SIGTERM 
   #define SIGS_TO_TERMPREP    SIGCONT
   
   static short sigs_to_ignore [] = { SIGS_TO_IGNORE };    static short sigs_to_ignore [] = { SIGS_TO_IGNORE };
   static short sigs_to_abort [] = { SIGS_TO_ABORT };    static short sigs_to_abort [] = { SIGS_TO_ABORT };
   static short sigs_to_quit [] = { SIGS_TO_QUIT };    static short sigs_to_quit [] = { SIGS_TO_QUIT };
     static short sigs_to_termprep [] = { SIGS_TO_TERMPREP };
   int i;    int i;
   
 #define DIM(X)          (sizeof (X) / sizeof *(X))  #define DIM(X)          (sizeof (X) / sizeof *(X))
Line 719  install_signal_handlers (void) Line 777  install_signal_handlers (void)
     if (sigs_to_ignore [i])      if (sigs_to_ignore [i])
       signal (sigs_to_ignore [i], SIG_IGN);        signal (sigs_to_ignore [i], SIG_IGN);
   for (i = 0; i < DIM (sigs_to_abort); i++)    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++)    for (i = 0; i < DIM (sigs_to_quit); i++)
     signal (sigs_to_quit [i], graceful_exit);      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 */  /* end signal handling */

Removed from v.1.1  
changed lines
  Added in v.1.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>