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