--- gforth/engine/io.c 1999/11/15 22:27:50 1.11 +++ 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); }