xref: /dragonfly/contrib/gdb-7/readline/input.c (revision 6b445a62)
1*6b445a62SJohn Marino /* input.c -- character input functions for readline. */
2*6b445a62SJohn Marino 
3*6b445a62SJohn Marino /* Copyright (C) 1994-2010 Free Software Foundation, Inc.
4*6b445a62SJohn Marino 
5*6b445a62SJohn Marino    This file is part of the GNU Readline Library (Readline), a library
6*6b445a62SJohn Marino    for reading lines of text with interactive input and history editing.
7*6b445a62SJohn Marino 
8*6b445a62SJohn Marino    Readline is free software: you can redistribute it and/or modify
9*6b445a62SJohn Marino    it under the terms of the GNU General Public License as published by
10*6b445a62SJohn Marino    the Free Software Foundation, either version 3 of the License, or
11*6b445a62SJohn Marino    (at your option) any later version.
12*6b445a62SJohn Marino 
13*6b445a62SJohn Marino    Readline is distributed in the hope that it will be useful,
14*6b445a62SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
15*6b445a62SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*6b445a62SJohn Marino    GNU General Public License for more details.
17*6b445a62SJohn Marino 
18*6b445a62SJohn Marino    You should have received a copy of the GNU General Public License
19*6b445a62SJohn Marino    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
20*6b445a62SJohn Marino */
21*6b445a62SJohn Marino 
22*6b445a62SJohn Marino #define READLINE_LIBRARY
23*6b445a62SJohn Marino 
24*6b445a62SJohn Marino #if defined (__TANDEM)
25*6b445a62SJohn Marino #  include <floss.h>
26*6b445a62SJohn Marino #endif
27*6b445a62SJohn Marino 
28*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
29*6b445a62SJohn Marino #  include <config.h>
30*6b445a62SJohn Marino #endif
31*6b445a62SJohn Marino 
32*6b445a62SJohn Marino #include <sys/types.h>
33*6b445a62SJohn Marino #include <fcntl.h>
34*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H)
35*6b445a62SJohn Marino #  include <sys/file.h>
36*6b445a62SJohn Marino #endif /* HAVE_SYS_FILE_H */
37*6b445a62SJohn Marino 
38*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
39*6b445a62SJohn Marino #  include <unistd.h>
40*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
41*6b445a62SJohn Marino 
42*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
43*6b445a62SJohn Marino #  include <stdlib.h>
44*6b445a62SJohn Marino #else
45*6b445a62SJohn Marino #  include "ansi_stdlib.h"
46*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
47*6b445a62SJohn Marino 
48*6b445a62SJohn Marino #include "posixselect.h"
49*6b445a62SJohn Marino 
50*6b445a62SJohn Marino #if defined (FIONREAD_IN_SYS_IOCTL)
51*6b445a62SJohn Marino #  include <sys/ioctl.h>
52*6b445a62SJohn Marino #endif
53*6b445a62SJohn Marino 
54*6b445a62SJohn Marino #include <stdio.h>
55*6b445a62SJohn Marino #include <errno.h>
56*6b445a62SJohn Marino 
57*6b445a62SJohn Marino #if !defined (errno)
58*6b445a62SJohn Marino extern int errno;
59*6b445a62SJohn Marino #endif /* !errno */
60*6b445a62SJohn Marino 
61*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
62*6b445a62SJohn Marino #include "rldefs.h"
63*6b445a62SJohn Marino #include "rlmbutil.h"
64*6b445a62SJohn Marino 
65*6b445a62SJohn Marino /* Some standard library routines. */
66*6b445a62SJohn Marino #include "readline.h"
67*6b445a62SJohn Marino 
68*6b445a62SJohn Marino #include "rlprivate.h"
69*6b445a62SJohn Marino #include "rlshell.h"
70*6b445a62SJohn Marino #include "xmalloc.h"
71*6b445a62SJohn Marino 
72*6b445a62SJohn Marino /* What kind of non-blocking I/O do we have? */
73*6b445a62SJohn Marino #if !defined (O_NDELAY) && defined (O_NONBLOCK)
74*6b445a62SJohn Marino #  define O_NDELAY O_NONBLOCK	/* Posix style */
75*6b445a62SJohn Marino #endif
76*6b445a62SJohn Marino 
77*6b445a62SJohn Marino /* Non-null means it is a pointer to a function to run while waiting for
78*6b445a62SJohn Marino    character input. */
79*6b445a62SJohn Marino rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
80*6b445a62SJohn Marino 
81*6b445a62SJohn Marino rl_getc_func_t *rl_getc_function = rl_getc;
82*6b445a62SJohn Marino 
83*6b445a62SJohn Marino static int _keyboard_input_timeout = 100000;		/* 0.1 seconds; it's in usec */
84*6b445a62SJohn Marino 
85*6b445a62SJohn Marino static int ibuffer_space PARAMS((void));
86*6b445a62SJohn Marino static int rl_get_char PARAMS((int *));
87*6b445a62SJohn Marino static int rl_gather_tyi PARAMS((void));
88*6b445a62SJohn Marino 
89*6b445a62SJohn Marino /* **************************************************************** */
90*6b445a62SJohn Marino /*								    */
91*6b445a62SJohn Marino /*			Character Input Buffering       	    */
92*6b445a62SJohn Marino /*								    */
93*6b445a62SJohn Marino /* **************************************************************** */
94*6b445a62SJohn Marino 
95*6b445a62SJohn Marino static int pop_index, push_index;
96*6b445a62SJohn Marino static unsigned char ibuffer[512];
97*6b445a62SJohn Marino static int ibuffer_len = sizeof (ibuffer) - 1;
98*6b445a62SJohn Marino 
99*6b445a62SJohn Marino #define any_typein (push_index != pop_index)
100*6b445a62SJohn Marino 
101*6b445a62SJohn Marino int
_rl_any_typein()102*6b445a62SJohn Marino _rl_any_typein ()
103*6b445a62SJohn Marino {
104*6b445a62SJohn Marino   return any_typein;
105*6b445a62SJohn Marino }
106*6b445a62SJohn Marino 
107*6b445a62SJohn Marino /* Return the amount of space available in the buffer for stuffing
108*6b445a62SJohn Marino    characters. */
109*6b445a62SJohn Marino static int
ibuffer_space()110*6b445a62SJohn Marino ibuffer_space ()
111*6b445a62SJohn Marino {
112*6b445a62SJohn Marino   if (pop_index > push_index)
113*6b445a62SJohn Marino     return (pop_index - push_index - 1);
114*6b445a62SJohn Marino   else
115*6b445a62SJohn Marino     return (ibuffer_len - (push_index - pop_index));
116*6b445a62SJohn Marino }
117*6b445a62SJohn Marino 
118*6b445a62SJohn Marino /* Get a key from the buffer of characters to be read.
119*6b445a62SJohn Marino    Return the key in KEY.
120*6b445a62SJohn Marino    Result is KEY if there was a key, or 0 if there wasn't. */
121*6b445a62SJohn Marino static int
rl_get_char(key)122*6b445a62SJohn Marino rl_get_char (key)
123*6b445a62SJohn Marino      int *key;
124*6b445a62SJohn Marino {
125*6b445a62SJohn Marino   if (push_index == pop_index)
126*6b445a62SJohn Marino     return (0);
127*6b445a62SJohn Marino 
128*6b445a62SJohn Marino   *key = ibuffer[pop_index++];
129*6b445a62SJohn Marino #if 0
130*6b445a62SJohn Marino   if (pop_index >= ibuffer_len)
131*6b445a62SJohn Marino #else
132*6b445a62SJohn Marino   if (pop_index > ibuffer_len)
133*6b445a62SJohn Marino #endif
134*6b445a62SJohn Marino     pop_index = 0;
135*6b445a62SJohn Marino 
136*6b445a62SJohn Marino   return (1);
137*6b445a62SJohn Marino }
138*6b445a62SJohn Marino 
139*6b445a62SJohn Marino /* Stuff KEY into the *front* of the input buffer.
140*6b445a62SJohn Marino    Returns non-zero if successful, zero if there is
141*6b445a62SJohn Marino    no space left in the buffer. */
142*6b445a62SJohn Marino int
_rl_unget_char(key)143*6b445a62SJohn Marino _rl_unget_char (key)
144*6b445a62SJohn Marino      int key;
145*6b445a62SJohn Marino {
146*6b445a62SJohn Marino   if (ibuffer_space ())
147*6b445a62SJohn Marino     {
148*6b445a62SJohn Marino       pop_index--;
149*6b445a62SJohn Marino       if (pop_index < 0)
150*6b445a62SJohn Marino 	pop_index = ibuffer_len;
151*6b445a62SJohn Marino       ibuffer[pop_index] = key;
152*6b445a62SJohn Marino       return (1);
153*6b445a62SJohn Marino     }
154*6b445a62SJohn Marino   return (0);
155*6b445a62SJohn Marino }
156*6b445a62SJohn Marino 
157*6b445a62SJohn Marino int
_rl_pushed_input_available()158*6b445a62SJohn Marino _rl_pushed_input_available ()
159*6b445a62SJohn Marino {
160*6b445a62SJohn Marino   return (push_index != pop_index);
161*6b445a62SJohn Marino }
162*6b445a62SJohn Marino 
163*6b445a62SJohn Marino /* If a character is available to be read, then read it and stuff it into
164*6b445a62SJohn Marino    IBUFFER.  Otherwise, just return.  Returns number of characters read
165*6b445a62SJohn Marino    (0 if none available) and -1 on error (EIO). */
166*6b445a62SJohn Marino static int
rl_gather_tyi()167*6b445a62SJohn Marino rl_gather_tyi ()
168*6b445a62SJohn Marino {
169*6b445a62SJohn Marino   int tty;
170*6b445a62SJohn Marino   register int tem, result;
171*6b445a62SJohn Marino   int chars_avail, k;
172*6b445a62SJohn Marino   char input;
173*6b445a62SJohn Marino #if defined(HAVE_SELECT)
174*6b445a62SJohn Marino   fd_set readfds, exceptfds;
175*6b445a62SJohn Marino   struct timeval timeout;
176*6b445a62SJohn Marino #endif
177*6b445a62SJohn Marino 
178*6b445a62SJohn Marino   chars_avail = 0;
179*6b445a62SJohn Marino   tty = fileno (rl_instream);
180*6b445a62SJohn Marino 
181*6b445a62SJohn Marino #if defined (HAVE_SELECT)
182*6b445a62SJohn Marino   FD_ZERO (&readfds);
183*6b445a62SJohn Marino   FD_ZERO (&exceptfds);
184*6b445a62SJohn Marino   FD_SET (tty, &readfds);
185*6b445a62SJohn Marino   FD_SET (tty, &exceptfds);
186*6b445a62SJohn Marino   USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout);
187*6b445a62SJohn Marino   result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
188*6b445a62SJohn Marino   if (result <= 0)
189*6b445a62SJohn Marino     return 0;	/* Nothing to read. */
190*6b445a62SJohn Marino #endif
191*6b445a62SJohn Marino 
192*6b445a62SJohn Marino   result = -1;
193*6b445a62SJohn Marino #if defined (FIONREAD)
194*6b445a62SJohn Marino   errno = 0;
195*6b445a62SJohn Marino   result = ioctl (tty, FIONREAD, &chars_avail);
196*6b445a62SJohn Marino   if (result == -1 && errno == EIO)
197*6b445a62SJohn Marino     return -1;
198*6b445a62SJohn Marino #endif
199*6b445a62SJohn Marino 
200*6b445a62SJohn Marino #if defined (O_NDELAY)
201*6b445a62SJohn Marino   if (result == -1)
202*6b445a62SJohn Marino     {
203*6b445a62SJohn Marino       tem = fcntl (tty, F_GETFL, 0);
204*6b445a62SJohn Marino 
205*6b445a62SJohn Marino       fcntl (tty, F_SETFL, (tem | O_NDELAY));
206*6b445a62SJohn Marino       chars_avail = read (tty, &input, 1);
207*6b445a62SJohn Marino 
208*6b445a62SJohn Marino       fcntl (tty, F_SETFL, tem);
209*6b445a62SJohn Marino       if (chars_avail == -1 && errno == EAGAIN)
210*6b445a62SJohn Marino 	return 0;
211*6b445a62SJohn Marino       if (chars_avail == 0)	/* EOF */
212*6b445a62SJohn Marino 	{
213*6b445a62SJohn Marino 	  rl_stuff_char (EOF);
214*6b445a62SJohn Marino 	  return (0);
215*6b445a62SJohn Marino 	}
216*6b445a62SJohn Marino     }
217*6b445a62SJohn Marino #endif /* O_NDELAY */
218*6b445a62SJohn Marino 
219*6b445a62SJohn Marino #if defined (__MINGW32__)
220*6b445a62SJohn Marino   /* Use getch/_kbhit to check for available console input, in the same way
221*6b445a62SJohn Marino      that we read it normally. */
222*6b445a62SJohn Marino    chars_avail = isatty (tty) ? _kbhit () : 0;
223*6b445a62SJohn Marino    result = 0;
224*6b445a62SJohn Marino #endif
225*6b445a62SJohn Marino 
226*6b445a62SJohn Marino   /* If there's nothing available, don't waste time trying to read
227*6b445a62SJohn Marino      something. */
228*6b445a62SJohn Marino   if (chars_avail <= 0)
229*6b445a62SJohn Marino     return 0;
230*6b445a62SJohn Marino 
231*6b445a62SJohn Marino   tem = ibuffer_space ();
232*6b445a62SJohn Marino 
233*6b445a62SJohn Marino   if (chars_avail > tem)
234*6b445a62SJohn Marino     chars_avail = tem;
235*6b445a62SJohn Marino 
236*6b445a62SJohn Marino   /* One cannot read all of the available input.  I can only read a single
237*6b445a62SJohn Marino      character at a time, or else programs which require input can be
238*6b445a62SJohn Marino      thwarted.  If the buffer is larger than one character, I lose.
239*6b445a62SJohn Marino      Damn! */
240*6b445a62SJohn Marino   if (tem < ibuffer_len)
241*6b445a62SJohn Marino     chars_avail = 0;
242*6b445a62SJohn Marino 
243*6b445a62SJohn Marino   if (result != -1)
244*6b445a62SJohn Marino     {
245*6b445a62SJohn Marino       while (chars_avail--)
246*6b445a62SJohn Marino 	{
247*6b445a62SJohn Marino 	  RL_CHECK_SIGNALS ();
248*6b445a62SJohn Marino 	  k = (*rl_getc_function) (rl_instream);
249*6b445a62SJohn Marino 	  if (rl_stuff_char (k) == 0)
250*6b445a62SJohn Marino 	    break;			/* some problem; no more room */
251*6b445a62SJohn Marino 	  if (k == NEWLINE || k == RETURN)
252*6b445a62SJohn Marino 	    break;
253*6b445a62SJohn Marino 	}
254*6b445a62SJohn Marino     }
255*6b445a62SJohn Marino   else
256*6b445a62SJohn Marino     {
257*6b445a62SJohn Marino       if (chars_avail)
258*6b445a62SJohn Marino 	rl_stuff_char (input);
259*6b445a62SJohn Marino     }
260*6b445a62SJohn Marino 
261*6b445a62SJohn Marino   return 1;
262*6b445a62SJohn Marino }
263*6b445a62SJohn Marino 
264*6b445a62SJohn Marino int
rl_set_keyboard_input_timeout(u)265*6b445a62SJohn Marino rl_set_keyboard_input_timeout (u)
266*6b445a62SJohn Marino      int u;
267*6b445a62SJohn Marino {
268*6b445a62SJohn Marino   int o;
269*6b445a62SJohn Marino 
270*6b445a62SJohn Marino   o = _keyboard_input_timeout;
271*6b445a62SJohn Marino   if (u >= 0)
272*6b445a62SJohn Marino     _keyboard_input_timeout = u;
273*6b445a62SJohn Marino   return (o);
274*6b445a62SJohn Marino }
275*6b445a62SJohn Marino 
276*6b445a62SJohn Marino /* Is there input available to be read on the readline input file
277*6b445a62SJohn Marino    descriptor?  Only works if the system has select(2) or FIONREAD.
278*6b445a62SJohn Marino    Uses the value of _keyboard_input_timeout as the timeout; if another
279*6b445a62SJohn Marino    readline function wants to specify a timeout and not leave it up to
280*6b445a62SJohn Marino    the user, it should use _rl_input_queued(timeout_value_in_microseconds)
281*6b445a62SJohn Marino    instead. */
282*6b445a62SJohn Marino int
_rl_input_available()283*6b445a62SJohn Marino _rl_input_available ()
284*6b445a62SJohn Marino {
285*6b445a62SJohn Marino #if defined(HAVE_SELECT)
286*6b445a62SJohn Marino   fd_set readfds, exceptfds;
287*6b445a62SJohn Marino   struct timeval timeout;
288*6b445a62SJohn Marino #endif
289*6b445a62SJohn Marino #if !defined (HAVE_SELECT) && defined(FIONREAD)
290*6b445a62SJohn Marino   int chars_avail;
291*6b445a62SJohn Marino #endif
292*6b445a62SJohn Marino   int tty;
293*6b445a62SJohn Marino 
294*6b445a62SJohn Marino   tty = fileno (rl_instream);
295*6b445a62SJohn Marino 
296*6b445a62SJohn Marino #if defined (HAVE_SELECT)
297*6b445a62SJohn Marino   FD_ZERO (&readfds);
298*6b445a62SJohn Marino   FD_ZERO (&exceptfds);
299*6b445a62SJohn Marino   FD_SET (tty, &readfds);
300*6b445a62SJohn Marino   FD_SET (tty, &exceptfds);
301*6b445a62SJohn Marino   timeout.tv_sec = 0;
302*6b445a62SJohn Marino   timeout.tv_usec = _keyboard_input_timeout;
303*6b445a62SJohn Marino   return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
304*6b445a62SJohn Marino #else
305*6b445a62SJohn Marino 
306*6b445a62SJohn Marino #if defined (FIONREAD)
307*6b445a62SJohn Marino   if (ioctl (tty, FIONREAD, &chars_avail) == 0)
308*6b445a62SJohn Marino     return (chars_avail);
309*6b445a62SJohn Marino #endif
310*6b445a62SJohn Marino 
311*6b445a62SJohn Marino #endif
312*6b445a62SJohn Marino 
313*6b445a62SJohn Marino #if defined (__MINGW32__)
314*6b445a62SJohn Marino   if (isatty (tty))
315*6b445a62SJohn Marino     return (_kbhit ());
316*6b445a62SJohn Marino #endif
317*6b445a62SJohn Marino 
318*6b445a62SJohn Marino   return 0;
319*6b445a62SJohn Marino }
320*6b445a62SJohn Marino 
321*6b445a62SJohn Marino int
_rl_input_queued(t)322*6b445a62SJohn Marino _rl_input_queued (t)
323*6b445a62SJohn Marino      int t;
324*6b445a62SJohn Marino {
325*6b445a62SJohn Marino   int old_timeout, r;
326*6b445a62SJohn Marino 
327*6b445a62SJohn Marino   old_timeout = rl_set_keyboard_input_timeout (t);
328*6b445a62SJohn Marino   r = _rl_input_available ();
329*6b445a62SJohn Marino   rl_set_keyboard_input_timeout (old_timeout);
330*6b445a62SJohn Marino   return r;
331*6b445a62SJohn Marino }
332*6b445a62SJohn Marino 
333*6b445a62SJohn Marino void
_rl_insert_typein(c)334*6b445a62SJohn Marino _rl_insert_typein (c)
335*6b445a62SJohn Marino      int c;
336*6b445a62SJohn Marino {
337*6b445a62SJohn Marino   int key, t, i;
338*6b445a62SJohn Marino   char *string;
339*6b445a62SJohn Marino 
340*6b445a62SJohn Marino   i = key = 0;
341*6b445a62SJohn Marino   string = (char *)xmalloc (ibuffer_len + 1);
342*6b445a62SJohn Marino   string[i++] = (char) c;
343*6b445a62SJohn Marino 
344*6b445a62SJohn Marino   while ((t = rl_get_char (&key)) &&
345*6b445a62SJohn Marino 	 _rl_keymap[key].type == ISFUNC &&
346*6b445a62SJohn Marino 	 _rl_keymap[key].function == rl_insert)
347*6b445a62SJohn Marino     string[i++] = key;
348*6b445a62SJohn Marino 
349*6b445a62SJohn Marino   if (t)
350*6b445a62SJohn Marino     _rl_unget_char (key);
351*6b445a62SJohn Marino 
352*6b445a62SJohn Marino   string[i] = '\0';
353*6b445a62SJohn Marino   rl_insert_text (string);
354*6b445a62SJohn Marino   xfree (string);
355*6b445a62SJohn Marino }
356*6b445a62SJohn Marino 
357*6b445a62SJohn Marino /* Add KEY to the buffer of characters to be read.  Returns 1 if the
358*6b445a62SJohn Marino    character was stuffed correctly; 0 otherwise. */
359*6b445a62SJohn Marino int
rl_stuff_char(key)360*6b445a62SJohn Marino rl_stuff_char (key)
361*6b445a62SJohn Marino      int key;
362*6b445a62SJohn Marino {
363*6b445a62SJohn Marino   if (ibuffer_space () == 0)
364*6b445a62SJohn Marino     return 0;
365*6b445a62SJohn Marino 
366*6b445a62SJohn Marino   if (key == EOF)
367*6b445a62SJohn Marino     {
368*6b445a62SJohn Marino       key = NEWLINE;
369*6b445a62SJohn Marino       rl_pending_input = EOF;
370*6b445a62SJohn Marino       RL_SETSTATE (RL_STATE_INPUTPENDING);
371*6b445a62SJohn Marino     }
372*6b445a62SJohn Marino   ibuffer[push_index++] = key;
373*6b445a62SJohn Marino #if 0
374*6b445a62SJohn Marino   if (push_index >= ibuffer_len)
375*6b445a62SJohn Marino #else
376*6b445a62SJohn Marino   if (push_index > ibuffer_len)
377*6b445a62SJohn Marino #endif
378*6b445a62SJohn Marino     push_index = 0;
379*6b445a62SJohn Marino 
380*6b445a62SJohn Marino   return 1;
381*6b445a62SJohn Marino }
382*6b445a62SJohn Marino 
383*6b445a62SJohn Marino /* Make C be the next command to be executed. */
384*6b445a62SJohn Marino int
rl_execute_next(c)385*6b445a62SJohn Marino rl_execute_next (c)
386*6b445a62SJohn Marino      int c;
387*6b445a62SJohn Marino {
388*6b445a62SJohn Marino   rl_pending_input = c;
389*6b445a62SJohn Marino   RL_SETSTATE (RL_STATE_INPUTPENDING);
390*6b445a62SJohn Marino   return 0;
391*6b445a62SJohn Marino }
392*6b445a62SJohn Marino 
393*6b445a62SJohn Marino /* Clear any pending input pushed with rl_execute_next() */
394*6b445a62SJohn Marino int
rl_clear_pending_input()395*6b445a62SJohn Marino rl_clear_pending_input ()
396*6b445a62SJohn Marino {
397*6b445a62SJohn Marino   rl_pending_input = 0;
398*6b445a62SJohn Marino   RL_UNSETSTATE (RL_STATE_INPUTPENDING);
399*6b445a62SJohn Marino   return 0;
400*6b445a62SJohn Marino }
401*6b445a62SJohn Marino 
402*6b445a62SJohn Marino /* **************************************************************** */
403*6b445a62SJohn Marino /*								    */
404*6b445a62SJohn Marino /*			     Character Input			    */
405*6b445a62SJohn Marino /*								    */
406*6b445a62SJohn Marino /* **************************************************************** */
407*6b445a62SJohn Marino 
408*6b445a62SJohn Marino /* Read a key, including pending input. */
409*6b445a62SJohn Marino int
rl_read_key()410*6b445a62SJohn Marino rl_read_key ()
411*6b445a62SJohn Marino {
412*6b445a62SJohn Marino   int c;
413*6b445a62SJohn Marino 
414*6b445a62SJohn Marino   rl_key_sequence_length++;
415*6b445a62SJohn Marino 
416*6b445a62SJohn Marino   if (rl_pending_input)
417*6b445a62SJohn Marino     {
418*6b445a62SJohn Marino       c = rl_pending_input;
419*6b445a62SJohn Marino       rl_clear_pending_input ();
420*6b445a62SJohn Marino     }
421*6b445a62SJohn Marino   else
422*6b445a62SJohn Marino     {
423*6b445a62SJohn Marino       /* If input is coming from a macro, then use that. */
424*6b445a62SJohn Marino       if (c = _rl_next_macro_key ())
425*6b445a62SJohn Marino 	return (c);
426*6b445a62SJohn Marino 
427*6b445a62SJohn Marino       /* If the user has an event function, then call it periodically. */
428*6b445a62SJohn Marino       if (rl_event_hook)
429*6b445a62SJohn Marino 	{
430*6b445a62SJohn Marino 	  while (rl_event_hook)
431*6b445a62SJohn Marino 	    {
432*6b445a62SJohn Marino 	      if (rl_gather_tyi () < 0)	/* XXX - EIO */
433*6b445a62SJohn Marino 		{
434*6b445a62SJohn Marino 		  rl_done = 1;
435*6b445a62SJohn Marino 		  return ('\n');
436*6b445a62SJohn Marino 		}
437*6b445a62SJohn Marino 	      RL_CHECK_SIGNALS ();
438*6b445a62SJohn Marino 	      if (rl_get_char (&c) != 0)
439*6b445a62SJohn Marino 		break;
440*6b445a62SJohn Marino 	      if (rl_done)		/* XXX - experimental */
441*6b445a62SJohn Marino 		return ('\n');
442*6b445a62SJohn Marino 	      (*rl_event_hook) ();
443*6b445a62SJohn Marino 	    }
444*6b445a62SJohn Marino 	}
445*6b445a62SJohn Marino       else
446*6b445a62SJohn Marino 	{
447*6b445a62SJohn Marino 	  if (rl_get_char (&c) == 0)
448*6b445a62SJohn Marino 	    c = (*rl_getc_function) (rl_instream);
449*6b445a62SJohn Marino 	  RL_CHECK_SIGNALS ();
450*6b445a62SJohn Marino 	}
451*6b445a62SJohn Marino     }
452*6b445a62SJohn Marino 
453*6b445a62SJohn Marino   return (c);
454*6b445a62SJohn Marino }
455*6b445a62SJohn Marino 
456*6b445a62SJohn Marino int
rl_getc(stream)457*6b445a62SJohn Marino rl_getc (stream)
458*6b445a62SJohn Marino      FILE *stream;
459*6b445a62SJohn Marino {
460*6b445a62SJohn Marino   int result;
461*6b445a62SJohn Marino   unsigned char c;
462*6b445a62SJohn Marino 
463*6b445a62SJohn Marino   while (1)
464*6b445a62SJohn Marino     {
465*6b445a62SJohn Marino       RL_CHECK_SIGNALS ();
466*6b445a62SJohn Marino 
467*6b445a62SJohn Marino #if defined (__MINGW32__)
468*6b445a62SJohn Marino       if (isatty (fileno (stream)))
469*6b445a62SJohn Marino 	return (getch ());
470*6b445a62SJohn Marino #endif
471*6b445a62SJohn Marino       result = read (fileno (stream), &c, sizeof (unsigned char));
472*6b445a62SJohn Marino 
473*6b445a62SJohn Marino       if (result == sizeof (unsigned char))
474*6b445a62SJohn Marino 	return (c);
475*6b445a62SJohn Marino 
476*6b445a62SJohn Marino       /* If zero characters are returned, then the file that we are
477*6b445a62SJohn Marino 	 reading from is empty!  Return EOF in that case. */
478*6b445a62SJohn Marino       if (result == 0)
479*6b445a62SJohn Marino 	return (EOF);
480*6b445a62SJohn Marino 
481*6b445a62SJohn Marino #if defined (__BEOS__)
482*6b445a62SJohn Marino       if (errno == EINTR)
483*6b445a62SJohn Marino 	continue;
484*6b445a62SJohn Marino #endif
485*6b445a62SJohn Marino 
486*6b445a62SJohn Marino #if defined (EWOULDBLOCK)
487*6b445a62SJohn Marino #  define X_EWOULDBLOCK EWOULDBLOCK
488*6b445a62SJohn Marino #else
489*6b445a62SJohn Marino #  define X_EWOULDBLOCK -99
490*6b445a62SJohn Marino #endif
491*6b445a62SJohn Marino 
492*6b445a62SJohn Marino #if defined (EAGAIN)
493*6b445a62SJohn Marino #  define X_EAGAIN EAGAIN
494*6b445a62SJohn Marino #else
495*6b445a62SJohn Marino #  define X_EAGAIN -99
496*6b445a62SJohn Marino #endif
497*6b445a62SJohn Marino 
498*6b445a62SJohn Marino       if (errno == X_EWOULDBLOCK || errno == X_EAGAIN)
499*6b445a62SJohn Marino 	{
500*6b445a62SJohn Marino 	  if (sh_unset_nodelay_mode (fileno (stream)) < 0)
501*6b445a62SJohn Marino 	    return (EOF);
502*6b445a62SJohn Marino 	  continue;
503*6b445a62SJohn Marino 	}
504*6b445a62SJohn Marino 
505*6b445a62SJohn Marino #undef X_EWOULDBLOCK
506*6b445a62SJohn Marino #undef X_EAGAIN
507*6b445a62SJohn Marino 
508*6b445a62SJohn Marino       /* If the error that we received was SIGINT, then try again,
509*6b445a62SJohn Marino 	 this is simply an interrupted system call to read ().
510*6b445a62SJohn Marino 	 Otherwise, some error ocurred, also signifying EOF. */
511*6b445a62SJohn Marino       if (errno != EINTR)
512*6b445a62SJohn Marino 	return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
513*6b445a62SJohn Marino     }
514*6b445a62SJohn Marino }
515*6b445a62SJohn Marino 
516*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
517*6b445a62SJohn Marino /* read multibyte char */
518*6b445a62SJohn Marino int
_rl_read_mbchar(mbchar,size)519*6b445a62SJohn Marino _rl_read_mbchar (mbchar, size)
520*6b445a62SJohn Marino      char *mbchar;
521*6b445a62SJohn Marino      int size;
522*6b445a62SJohn Marino {
523*6b445a62SJohn Marino   int mb_len, c;
524*6b445a62SJohn Marino   size_t mbchar_bytes_length;
525*6b445a62SJohn Marino   wchar_t wc;
526*6b445a62SJohn Marino   mbstate_t ps, ps_back;
527*6b445a62SJohn Marino 
528*6b445a62SJohn Marino   memset(&ps, 0, sizeof (mbstate_t));
529*6b445a62SJohn Marino   memset(&ps_back, 0, sizeof (mbstate_t));
530*6b445a62SJohn Marino 
531*6b445a62SJohn Marino   mb_len = 0;
532*6b445a62SJohn Marino   while (mb_len < size)
533*6b445a62SJohn Marino     {
534*6b445a62SJohn Marino       RL_SETSTATE(RL_STATE_MOREINPUT);
535*6b445a62SJohn Marino       c = rl_read_key ();
536*6b445a62SJohn Marino       RL_UNSETSTATE(RL_STATE_MOREINPUT);
537*6b445a62SJohn Marino 
538*6b445a62SJohn Marino       if (c < 0)
539*6b445a62SJohn Marino 	break;
540*6b445a62SJohn Marino 
541*6b445a62SJohn Marino       mbchar[mb_len++] = c;
542*6b445a62SJohn Marino 
543*6b445a62SJohn Marino       mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
544*6b445a62SJohn Marino       if (mbchar_bytes_length == (size_t)(-1))
545*6b445a62SJohn Marino 	break;		/* invalid byte sequence for the current locale */
546*6b445a62SJohn Marino       else if (mbchar_bytes_length == (size_t)(-2))
547*6b445a62SJohn Marino 	{
548*6b445a62SJohn Marino 	  /* shorted bytes */
549*6b445a62SJohn Marino 	  ps = ps_back;
550*6b445a62SJohn Marino 	  continue;
551*6b445a62SJohn Marino 	}
552*6b445a62SJohn Marino       else if (mbchar_bytes_length == 0)
553*6b445a62SJohn Marino 	{
554*6b445a62SJohn Marino 	  mbchar[0] = '\0';	/* null wide character */
555*6b445a62SJohn Marino 	  mb_len = 1;
556*6b445a62SJohn Marino 	  break;
557*6b445a62SJohn Marino 	}
558*6b445a62SJohn Marino       else if (mbchar_bytes_length > (size_t)(0))
559*6b445a62SJohn Marino 	break;
560*6b445a62SJohn Marino     }
561*6b445a62SJohn Marino 
562*6b445a62SJohn Marino   return mb_len;
563*6b445a62SJohn Marino }
564*6b445a62SJohn Marino 
565*6b445a62SJohn Marino /* Read a multibyte-character string whose first character is FIRST into
566*6b445a62SJohn Marino    the buffer MB of length MLEN.  Returns the last character read, which
567*6b445a62SJohn Marino    may be FIRST.  Used by the search functions, among others.  Very similar
568*6b445a62SJohn Marino    to _rl_read_mbchar. */
569*6b445a62SJohn Marino int
_rl_read_mbstring(first,mb,mlen)570*6b445a62SJohn Marino _rl_read_mbstring (first, mb, mlen)
571*6b445a62SJohn Marino      int first;
572*6b445a62SJohn Marino      char *mb;
573*6b445a62SJohn Marino      int mlen;
574*6b445a62SJohn Marino {
575*6b445a62SJohn Marino   int i, c;
576*6b445a62SJohn Marino   mbstate_t ps;
577*6b445a62SJohn Marino 
578*6b445a62SJohn Marino   c = first;
579*6b445a62SJohn Marino   memset (mb, 0, mlen);
580*6b445a62SJohn Marino   for (i = 0; c >= 0 && i < mlen; i++)
581*6b445a62SJohn Marino     {
582*6b445a62SJohn Marino       mb[i] = (char)c;
583*6b445a62SJohn Marino       memset (&ps, 0, sizeof (mbstate_t));
584*6b445a62SJohn Marino       if (_rl_get_char_len (mb, &ps) == -2)
585*6b445a62SJohn Marino 	{
586*6b445a62SJohn Marino 	  /* Read more for multibyte character */
587*6b445a62SJohn Marino 	  RL_SETSTATE (RL_STATE_MOREINPUT);
588*6b445a62SJohn Marino 	  c = rl_read_key ();
589*6b445a62SJohn Marino 	  RL_UNSETSTATE (RL_STATE_MOREINPUT);
590*6b445a62SJohn Marino 	}
591*6b445a62SJohn Marino       else
592*6b445a62SJohn Marino 	break;
593*6b445a62SJohn Marino     }
594*6b445a62SJohn Marino   return c;
595*6b445a62SJohn Marino }
596*6b445a62SJohn Marino #endif /* HANDLE_MULTIBYTE */
597