diff options
Diffstat (limited to 'lib/readline/input.c')
-rw-r--r-- | lib/readline/input.c | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/lib/readline/input.c b/lib/readline/input.c index da5d771..b5876da 100644 --- a/lib/readline/input.c +++ b/lib/readline/input.c @@ -1,24 +1,24 @@ /* input.c -- character input functions for readline. */ -/* Copyright (C) 1994-2005 Free Software Foundation, Inc. +/* Copyright (C) 1994-2009 Free Software Foundation, Inc. - This file is part of the GNU Readline Library, a library for - reading lines of text with interactive input and history editing. + This file is part of the GNU Readline Library (Readline), a library + for reading lines of text with interactive input and history editing. - The GNU Readline Library is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or + Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - The GNU Readline Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Readline is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + You should have received a copy of the GNU General Public License + along with Readline. If not, see <http://www.gnu.org/licenses/>. +*/ + #define READLINE_LIBRARY #if defined (__TANDEM) @@ -45,14 +45,7 @@ # include "ansi_stdlib.h" #endif /* HAVE_STDLIB_H */ -#if defined (HAVE_SELECT) -# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) -# include <sys/time.h> -# endif -#endif /* HAVE_SELECT */ -#if defined (HAVE_SYS_SELECT_H) -# include <sys/select.h> -#endif +#include "posixselect.h" #if defined (FIONREAD_IN_SYS_IOCTL) # include <sys/ioctl.h> @@ -133,8 +126,11 @@ rl_get_char (key) return (0); *key = ibuffer[pop_index++]; - +#if 0 if (pop_index >= ibuffer_len) +#else + if (pop_index > ibuffer_len) +#endif pop_index = 0; return (1); @@ -151,7 +147,7 @@ _rl_unget_char (key) { pop_index--; if (pop_index < 0) - pop_index = ibuffer_len - 1; + pop_index = ibuffer_len; ibuffer[pop_index] = key; return (1); } @@ -187,8 +183,7 @@ rl_gather_tyi () FD_ZERO (&exceptfds); FD_SET (tty, &readfds); FD_SET (tty, &exceptfds); - timeout.tv_sec = 0; - timeout.tv_usec = _keyboard_input_timeout; + USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); if (result <= 0) return 0; /* Nothing to read. */ @@ -249,8 +244,10 @@ rl_gather_tyi () { while (chars_avail--) { + RL_CHECK_SIGNALS (); k = (*rl_getc_function) (rl_instream); - rl_stuff_char (k); + if (rl_stuff_char (k) == 0) + break; /* some problem; no more room */ if (k == NEWLINE || k == RETURN) break; } @@ -354,7 +351,7 @@ _rl_insert_typein (c) string[i] = '\0'; rl_insert_text (string); - free (string); + xfree (string); } /* Add KEY to the buffer of characters to be read. Returns 1 if the @@ -373,7 +370,11 @@ rl_stuff_char (key) RL_SETSTATE (RL_STATE_INPUTPENDING); } ibuffer[push_index++] = key; +#if 0 if (push_index >= ibuffer_len) +#else + if (push_index > ibuffer_len) +#endif push_index = 0; return 1; @@ -429,6 +430,7 @@ rl_read_key () while (rl_event_hook && rl_get_char (&c) == 0) { (*rl_event_hook) (); + RL_CHECK_SIGNALS (); if (rl_done) /* XXX - experimental */ return ('\n'); if (rl_gather_tyi () < 0) /* XXX - EIO */ @@ -442,6 +444,7 @@ rl_read_key () { if (rl_get_char (&c) == 0) c = (*rl_getc_function) (rl_instream); + RL_CHECK_SIGNALS (); } } @@ -457,6 +460,8 @@ rl_getc (stream) while (1) { + RL_CHECK_SIGNALS (); + #if defined (__MINGW32__) if (isatty (fileno (stream))) return (getch ()); @@ -513,20 +518,26 @@ _rl_read_mbchar (mbchar, size) char *mbchar; int size; { - int mb_len = 0; + int mb_len, c; size_t mbchar_bytes_length; wchar_t wc; mbstate_t ps, ps_back; memset(&ps, 0, sizeof (mbstate_t)); memset(&ps_back, 0, sizeof (mbstate_t)); - + + mb_len = 0; while (mb_len < size) { RL_SETSTATE(RL_STATE_MOREINPUT); - mbchar[mb_len++] = rl_read_key (); + c = rl_read_key (); RL_UNSETSTATE(RL_STATE_MOREINPUT); + if (c < 0) + break; + + mbchar[mb_len++] = c; + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); if (mbchar_bytes_length == (size_t)(-1)) break; /* invalid byte sequence for the current locale */ @@ -564,7 +575,7 @@ _rl_read_mbstring (first, mb, mlen) c = first; memset (mb, 0, mlen); - for (i = 0; i < mlen; i++) + for (i = 0; c >= 0 && i < mlen; i++) { mb[i] = (char)c; memset (&ps, 0, sizeof (mbstate_t)); |