Diff for /gforth/engine/io.c between versions 1.5 and 1.14

version 1.5, 1998/05/02 21:29:02 version 1.14, 2002/03/13 17:09:09
Line 1 Line 1
 /* direct key io driver; signal handler  /* direct key io driver
   
   Copyright (C) 1995 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 16 Line 16
   
   You should have received a copy of the GNU General Public License    You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software    along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
   
   The following is stolen from the readline library for bash    The following is stolen from the readline library for bash
 */  */
Line 26 Line 26
 */  */
   
 #include "config.h"  #include "config.h"
   #include <sys/time.h>
   #include <sys/types.h>
 #include <unistd.h>  #include <unistd.h>
   
 #if defined(apollo) || defined(_WIN32)  #if defined(apollo) || defined(_WIN32)
 #define _POSIX_VERSION  #define _POSIX_VERSION
 #endif  #endif
   
   #if !defined(Solaris) && defined(sun) && defined(__svr4__)
   #define Solaris
   typedef unsigned int uint32_t;
   #endif
   
 #include <stdio.h>  #include <stdio.h>
 #include <signal.h>  #include <signal.h>
 #include <string.h>  #include <string.h>
 #include <sys/types.h>  
 #if !defined(apollo) && !defined(MSDOS)  #if !defined(apollo) && !defined(MSDOS)
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
 #endif  #endif
Line 612  void deprep_terminal () Line 618  void deprep_terminal ()
   
 long pending = -1L;  long pending = -1L;
   
 long key_avail (stream)  long key_avail (FILE * stream)
         FILE *stream;  
 {  {
   int tty = fileno (stream);    int tty = fileno (stream);
   int chars_avail = pending;    int chars_avail = pending;
Line 621  long key_avail (stream) Line 626  long key_avail (stream)
   
   if(!terminal_prepped)  prep_terminal();    if(!terminal_prepped)  prep_terminal();
   
 #ifndef _WIN32  #if defined(FIONREAD) && !defined(_WIN32)
   result = ioctl (tty, FIONREAD, &chars_avail);    if(isatty (tty)) {
       result = ioctl (tty, FIONREAD, &chars_avail);
     }
 #else  #else
   {    {
      fd_set selin;      fd_set selin;
      static int now[2] = { 0 , 0 };      static int now[2] = { 0 , 0 };
      int res;      int res;
       
      FD_ZERO(&selin);      FD_ZERO(&selin);
      FD_SET(tty, &selin);      FD_SET(tty, &selin);
      chars_avail=select(1, &selin, NULL, NULL, now);      chars_avail=select(1, &selin, NULL, NULL, now);
   }    }
 #endif  #endif
     
   if(chars_avail == -1L)    if(chars_avail == -1L) {
     {  unsigned char inchar;      unsigned char inchar;
       
        fcntl(tty, F_SETFL, O_NDELAY);      fcntl(tty, F_SETFL, O_NDELAY);
        result = read(tty, &inchar, sizeof(char));      result = read(tty, &inchar, sizeof(char));
        if(result == sizeof(char))      if(result == sizeof(char)) {
        {        chars_avail = 1;
          chars_avail = 1;        pending = (long)inchar;
          pending = (long)inchar;      } else {
        }        chars_avail = 0;
        else  
          chars_avail = 0;  
        fcntl(tty, F_SETFL, 0);  
     }      }
       fcntl(tty, F_SETFL, 0);
     }
   
   return chars_avail;    return chars_avail;
 }  }
Line 660  long key_avail (stream) Line 666  long key_avail (stream)
 /* When compiling and running in the `Posix' environment, Ultrix does  /* When compiling and running in the `Posix' environment, Ultrix does
    not restart system calls, so this needs to do it. */     not restart system calls, so this needs to do it. */
   
 unsigned char getkey(stream)  Cell getkey(FILE * stream)
      FILE *stream;  
 {  {
   int result;    Cell result;
   unsigned char c;    unsigned char c;
   
   if(!terminal_prepped)  prep_terminal();    if(!terminal_prepped)
       prep_terminal();
   
   while (pending < 0)    while (pending < 0)
     {      {
Line 678  unsigned char getkey(stream) Line 684  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 CTRL('D');          return (EOF);
   
       /* 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 687  unsigned char getkey(stream) Line 693  unsigned char getkey(stream)
         return (EOF);          return (EOF);
     }      }
   
   result = (int) pending;    /* otherwise there is a character pending;
        return it and delete pending char */
     result = (Cell) pending;
   pending = -1L;    pending = -1L;
   
   return result;    return result;
Line 734  int main() Line 742  int main()
 #endif  #endif
 #endif /* MSDOS */  #endif /* MSDOS */
   
 /* signal handling adapted from pfe by Dirk Zoller (Copylefted) - anton */  
   
 static void  
 graceful_exit (int sig)  
 {  
   deprep_terminal();  
   fprintf (stderr, "\n\n%s.\n", strsignal (sig));  
   exit (0x80|sig);  
 }  
   
 jmp_buf throw_jmp_buf;  
   
 static void   
 signal_throw(int sig)  
 {  
   int code;  
   struct {  
     int signal;  
     int throwcode;  
   } *p, throwtable[] = {  
     { SIGINT, -28 },  
     { SIGFPE, -55 },  
 #ifdef SIGBUS  
     { SIGBUS, -23 },  
 #endif  
     { SIGSEGV, -9 },  
   };  
   signal(sig,signal_throw);  
   for (code=-256-sig, p=throwtable; p<throwtable+(sizeof(throwtable)/sizeof(*p)); p++)  
     if (sig == p->signal) {  
       code = p->throwcode;  
       break;  
     }  
   longjmp(throw_jmp_buf,code); /* or use siglongjmp ? */  
 }  
   
 UCell cols=80;  
 #if defined(MSDOS) || defined (_WIN32)  
 UCell rows=25;  
 #else  
 UCell rows=24;  
 #endif  
   
 #ifdef SIGCONT  
 static void termprep (int sig)  
 {  
   signal(sig,termprep);  
   terminal_prepped=0;  
 }  
 #endif  
   
 #ifdef SIGWINCH  
 void get_winsize()  
 {  
 #ifdef TIOCGWINSZ  
   struct winsize size;  
     
   if (ioctl (1, TIOCGWINSZ, (char *) &size) >= 0) {  
     rows = size.ws_row;  
     cols = size.ws_col;  
   }  
 #else  
   char *s, *ends;  
   unsigned long ul;  
   if (s=getenv("LINES")) {  
     rows=atoi(s);  
     if (rows==0)  
       rows=24;  
   }  
   if (s=getenv("COLUMNS")) {  
     rows=atoi(s);  
     if (rows==0)  
       cols=80;  
   }  
 #endif  
 }  
   
 static void change_winsize(int sig)  
 {  
   signal(sig,change_winsize);  
 #ifdef TIOCGWINSZ  
   get_winsize();  
 #endif  
 }  
 #endif  
   
 void install_signal_handlers (void)  
 {  
   
 #if 0  
 /* these signals are handled right by default, no need to handle them;  
    they are listed here just for fun */  
   static short sigs_to_default [] = {  
 #ifdef SIGCHLD  
     SIGCHLD,  
 #endif  
 #ifdef SIGINFO  
     SIGINFO,  
 #endif  
 #ifdef SIGIO  
     SIGIO,  
 #endif  
 #ifdef SIGLOST  
     SIGLOST,  
 #endif  
 #ifdef SIGKILL  
     SIGKILL,  
 #endif  
 #ifdef SIGSTOP  
     SIGSTOP,  
 #endif  
 #ifdef SIGPWR  
     SIGPWR,  
 #endif  
 #ifdef SIGMSG  
     SIGMSG,  
 #endif  
 #ifdef SIGDANGER  
     SIGDANGER,  
 #endif  
 #ifdef SIGMIGRATE  
     SIGMIGRATE,  
 #endif  
 #ifdef SIGPRE  
     SIGPRE,  
 #endif  
 #ifdef SIGVIRT  
     SIGVIRT,  
 #endif  
 #ifdef SIGGRANT  
     SIGGRANT,  
 #endif  
 #ifdef SIGRETRACT  
     SIGRETRACT,  
 #endif  
 #ifdef SIGSOUND  
     SIGSOUND,  
 #endif  
 #ifdef SIGSAK  
     SIGSAK,  
 #endif  
 #ifdef SIGTSTP  
     SIGTSTP,  
 #endif  
 #ifdef SIGTTIN  
     SIGTTIN,  
 #endif  
 #ifdef SIGTTOU  
     SIGTTOU,  
 #endif  
 #ifdef SIGSTKFLT  
     SIGSTKFLT,  
 #endif  
 #ifdef SIGUNUSED  
     SIGUNUSED,  
 #endif  
   };  
 #endif  
   
   static short sigs_to_throw [] = {  
 #ifdef SIGBREAK  
     SIGBREAK,  
 #endif  
 #ifdef SIGINT  
     SIGINT,  
 #endif  
 #ifdef SIGILL  
     SIGILL,  
 #endif  
 #ifdef SIGEMT  
     SIGEMT,  
 #endif  
 #ifdef SIGFPE  
     SIGFPE,  
 #endif  
 #ifdef SIGIOT  
     SIGIOT,  
 #endif  
 #ifdef SIGSEGV  
     SIGSEGV,  
 #endif  
 #ifdef SIGALRM  
     SIGALRM,  
 #endif  
 #ifdef SIGPIPE  
     SIGPIPE,  
 #endif  
 #ifdef SIGPOLL  
     SIGPOLL,  
 #endif  
 #ifdef SIGPROF  
     SIGPROF,  
 #endif  
 #ifdef SIGBUS  
     SIGBUS,  
 #endif  
 #ifdef SIGSYS  
     SIGSYS,  
 #endif  
 #ifdef SIGTRAP  
     SIGTRAP,  
 #endif  
 #ifdef SIGURG  
     SIGURG,  
 #endif  
 #ifdef SIGUSR1  
     SIGUSR1,  
 #endif  
 #ifdef SIGUSR2  
     SIGUSR2,  
 #endif  
 #ifdef SIGVTALRM  
     SIGVTALRM,  
 #endif  
 #ifdef SIGXFSZ  
     SIGXFSZ,  
 #endif  
   };  
   static short sigs_to_quit [] = {  
 #ifdef SIGHUP  
     SIGHUP,  
 #endif  
 #ifdef SIGQUIT  
     SIGQUIT,  
 #endif  
 #ifdef SIGABRT  
     SIGABRT,  
 #endif  
 #ifdef SIGTERM  
     SIGTERM,  
 #endif  
 #ifdef SIGXCPU  
     SIGXCPU,  
 #endif  
   };  
   int i;  
   
 #define DIM(X)          (sizeof (X) / sizeof *(X))  
 /*  
   for (i = 0; i < DIM (sigs_to_ignore); i++)  
     signal (sigs_to_ignore [i], SIG_IGN);  
 */  
   for (i = 0; i < DIM (sigs_to_throw); i++)  
     signal (sigs_to_throw [i], die_on_signal ? graceful_exit : signal_throw);  
   for (i = 0; i < DIM (sigs_to_quit); i++)  
     signal (sigs_to_quit [i], graceful_exit);  
 #ifdef SIGCONT  
     signal (SIGCONT, termprep);  
 #endif  
 #ifdef SIGWINCH  
     signal (SIGWINCH, change_winsize);  
 #endif  
 }  
 /* end signal handling */  

Removed from v.1.5  
changed lines
  Added in v.1.14


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