Diff for /gforth/engine/io.c between versions 1.17 and 1.23

version 1.17, 2003/08/25 14:17:51 version 1.23, 2006/04/09 08:24:47
Line 447  void deprep_terminal () Line 447  void deprep_terminal ()
 #define VTIME VEOL  #define VTIME VEOL
 #endif  #endif
   
   #include <locale.h>
   
 void prep_terminal ()  void prep_terminal ()
 {  {
   int tty = fileno (stdin);    int tty = fileno (stdin);
Line 472  void prep_terminal () Line 474  void prep_terminal ()
     return;      /* added by MdG */      return;      /* added by MdG */
   }      /* added by MdG */    }      /* added by MdG */
         
     setlocale(LC_ALL, "");
   
   /* Try to keep this function from being INTerrupted.  We can do it    /* Try to keep this function from being INTerrupted.  We can do it
      on POSIX and systems with BSD-like signal handling. */       on POSIX and systems with BSD-like signal handling. */
 #if defined (HAVE_POSIX_SIGNALS)  #if defined (HAVE_POSIX_SIGNALS)
Line 613  void deprep_terminal () Line 617  void deprep_terminal ()
 }  }
 #endif  /* NEW_TTY_DRIVER */  #endif  /* NEW_TTY_DRIVER */
   
 /* If a character is available to be read, then read it  
    and stuff it into IBUFFER.  Otherwise, just return. */  
   
 long pending = -1L;  
   
 long key_avail (FILE * stream)  long key_avail (FILE * stream)
 {  {
   int tty = fileno (stream);    int tty = fileno (stream);
   int chars_avail = pending;    fd_set selin;
   int result;    static int now[2] = { 0 , 0 };
     int res;
   if(!terminal_prepped)  prep_terminal();  
   
 #if defined(FIONREAD) && !defined(_WIN32)    setvbuf(stream, NULL, _IONBF, 0);
   if(isatty (tty)) {    if(!terminal_prepped && stream == stdin)
     result = ioctl (tty, FIONREAD, &chars_avail);      prep_terminal();
   }  
 #else  
   {  
     fd_set selin;  
     static int now[2] = { 0 , 0 };  
     int res;  
       
     FD_ZERO(&selin);  
     FD_SET(tty, &selin);  
     chars_avail=select(1, &selin, NULL, NULL, now);  
   }  
 #endif  
     
   if(chars_avail == -1L) {  
     unsigned char inchar;  
       
     fcntl(tty, F_SETFL, O_NDELAY);  
     result = read(tty, &inchar, sizeof(char));  
     if(result == sizeof(char)) {  
       chars_avail = 1;  
       pending = (long)inchar;  
     } else {  
       chars_avail = 0;  
     }  
     fcntl(tty, F_SETFL, 0);  
   }  
   
   return chars_avail;    FD_ZERO(&selin);
     FD_SET(tty, &selin);
     return select(1, &selin, NULL, NULL, now);
 }  }
   
 /* Get a key from the buffer of characters to be read.  /* Get a key from the buffer of characters to be read.
Line 671  Cell getkey(FILE * stream) Line 645  Cell getkey(FILE * stream)
   Cell result;    Cell result;
   unsigned char c;    unsigned char c;
   
   if(!terminal_prepped)    setvbuf(stream, NULL, _IONBF, 0);
     if(!terminal_prepped && stream == stdin)
     prep_terminal();      prep_terminal();
   
   while (pending < 0)    result = fread(&c, sizeof(c), 1, stream);
     {    return result==0 ? EOF : c;
       result = read (fileno (stream), &c, sizeof (char));  
   
       if (result == sizeof (char))  
         return /* (c == 0x7F ? 0x08 :*/ c /*)*/;  
   
       /* If zero characters are returned, then the file that we are  
          reading from is empty!  Return EOF in that case. */  
       if (result == 0)  
         return (EOF);  
   
       /* If the error that we received was SIGINT, then try again,  
          this is simply an interrupted system call to read ().  
          Otherwise, some error ocurred, also signifying EOF. */  
       if (errno != EINTR)  
         return (EOF);  
     }  
   
   /* otherwise there is a character pending;  
      return it and delete pending char */  
   result = (Cell) pending;  
   pending = -1L;  
   
   return result;  
 }  }
   
 #ifdef TEST  #ifdef TEST

Removed from v.1.17  
changed lines
  Added in v.1.23


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