--- gforth/engine/io.c 1999/02/28 08:37:45 1.10 +++ gforth/engine/io.c 2006/04/04 13:36:37 1.19 @@ -1,6 +1,6 @@ /* direct key io driver - Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. + Copyright (C) 1995,1996,1997,1998,1999,2002,2003 Free Software Foundation, Inc. This file is part of Gforth. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License 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 */ @@ -26,6 +26,7 @@ */ #include "config.h" +#include "forth.h" #include #include #include @@ -51,7 +52,6 @@ typedef unsigned int uint32_t; #include #endif #include -#include "forth.h" #include "io.h" #ifndef MSDOS @@ -447,6 +447,8 @@ void deprep_terminal () #define VTIME VEOL #endif +#include + void prep_terminal () { int tty = fileno (stdin); @@ -472,6 +474,8 @@ void prep_terminal () return; /* added by MdG */ } /* added by MdG */ + setlocale(LC_ALL, ""); + /* Try to keep this function from being INTerrupted. We can do it on POSIX and systems with BSD-like signal handling. */ #if defined (HAVE_POSIX_SIGNALS) @@ -615,8 +619,13 @@ void deprep_terminal () /* If a character is available to be read, then read it and stuff it into IBUFFER. Otherwise, just return. */ - long pending = -1L; +/* !! This is a bug: if key_avail(file1) is followed by getkey(file2), + the getkey(file2) can return the character from file1. - anton */ + +/* Moreover, key_avail and getkey bypass the buffering of the FILE *, + leading to unpleasant effects if KEY-FILE and KEY?-FILE are mixed + with READ-FILE and READ-LINE */ long key_avail (FILE * stream) { @@ -626,7 +635,9 @@ long key_avail (FILE * stream) if(!terminal_prepped) prep_terminal(); -#ifndef _WIN32 +#if defined(FIONREAD) && !defined(_WIN32) + /* !! What is the point of this part? it does not affect + chars_avail, and "result" is never used - anton */ if(isatty (tty)) { result = ioctl (tty, FIONREAD, &chars_avail); } @@ -666,12 +677,13 @@ long key_avail (FILE * stream) /* When compiling and running in the `Posix' environment, Ultrix does not restart system calls, so this needs to do it. */ -unsigned getkey(FILE * stream) +Cell getkey(FILE * stream) { - int result; + Cell result; unsigned char c; - if(!terminal_prepped) prep_terminal(); + if(!terminal_prepped) + prep_terminal(); while (pending < 0) { @@ -692,7 +704,9 @@ unsigned getkey(FILE * stream) return (EOF); } - result = (int) pending; + /* otherwise there is a character pending; + return it and delete pending char */ + result = (Cell) pending; pending = -1L; return result;