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