import of readlilne 5.1
[deliverable/binutils-gdb.git] / readline / input.c
CommitLineData
d60d9f65
SS
1/* input.c -- character input functions for readline. */
2
b585a9fa 3/* Copyright (C) 1994-2005 Free Software Foundation, Inc.
d60d9f65
SS
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,
f9267e15 21 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
d60d9f65
SS
22#define READLINE_LIBRARY
23
b585a9fa
EZ
24#if defined (__TANDEM)
25# include <floss.h>
26#endif
27
d60d9f65
SS
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"
84041b4c 70#include "rlmbutil.h"
d60d9f65
SS
71
72/* Some standard library routines. */
73#include "readline.h"
74
f9267e15
EZ
75#include "rlprivate.h"
76#include "rlshell.h"
77#include "xmalloc.h"
78
d60d9f65
SS
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
d60d9f65
SS
84/* Non-null means it is a pointer to a function to run while waiting for
85 character input. */
84041b4c 86rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
d60d9f65 87
84041b4c
EZ
88rl_getc_func_t *rl_getc_function = rl_getc;
89
90static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */
91
92static int ibuffer_space PARAMS((void));
93static int rl_get_char PARAMS((int *));
94static int rl_gather_tyi PARAMS((void));
d60d9f65
SS
95
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
c862e87b
JM
114/* Return the amount of space available in the buffer for stuffing
115 characters. */
d60d9f65
SS
116static int
117ibuffer_space ()
118{
119 if (pop_index > push_index)
c862e87b 120 return (pop_index - push_index - 1);
d60d9f65
SS
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. */
84041b4c
EZ
146int
147_rl_unget_char (key)
d60d9f65
SS
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
b585a9fa
EZ
161int
162_rl_pushed_input_available ()
163{
164 return (push_index != pop_index);
165}
166
84041b4c
EZ
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
d60d9f65
SS
171rl_gather_tyi ()
172{
d60d9f65
SS
173 int tty;
174 register int tem, result;
b585a9fa 175 int chars_avail, k;
d60d9f65
SS
176 char input;
177#if defined(HAVE_SELECT)
178 fd_set readfds, exceptfds;
179 struct timeval timeout;
180#endif
181
182 tty = fileno (rl_instream);
183
184#if defined (HAVE_SELECT)
185 FD_ZERO (&readfds);
186 FD_ZERO (&exceptfds);
187 FD_SET (tty, &readfds);
188 FD_SET (tty, &exceptfds);
189 timeout.tv_sec = 0;
84041b4c
EZ
190 timeout.tv_usec = _keyboard_input_timeout;
191 result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
192 if (result <= 0)
193 return 0; /* Nothing to read. */
d60d9f65
SS
194#endif
195
196 result = -1;
197#if defined (FIONREAD)
84041b4c 198 errno = 0;
d60d9f65 199 result = ioctl (tty, FIONREAD, &chars_avail);
84041b4c
EZ
200 if (result == -1 && errno == EIO)
201 return -1;
d60d9f65
SS
202#endif
203
204#if defined (O_NDELAY)
205 if (result == -1)
206 {
207 tem = fcntl (tty, F_GETFL, 0);
208
209 fcntl (tty, F_SETFL, (tem | O_NDELAY));
210 chars_avail = read (tty, &input, 1);
211
212 fcntl (tty, F_SETFL, tem);
213 if (chars_avail == -1 && errno == EAGAIN)
84041b4c 214 return 0;
b585a9fa
EZ
215 if (chars_avail == 0) /* EOF */
216 {
217 rl_stuff_char (EOF);
218 return (0);
219 }
d60d9f65
SS
220 }
221#endif /* O_NDELAY */
222
223 /* If there's nothing available, don't waste time trying to read
224 something. */
225 if (chars_avail <= 0)
84041b4c 226 return 0;
d60d9f65
SS
227
228 tem = ibuffer_space ();
229
230 if (chars_avail > tem)
231 chars_avail = tem;
232
233 /* One cannot read all of the available input. I can only read a single
234 character at a time, or else programs which require input can be
235 thwarted. If the buffer is larger than one character, I lose.
236 Damn! */
237 if (tem < ibuffer_len)
238 chars_avail = 0;
239
240 if (result != -1)
241 {
242 while (chars_avail--)
b585a9fa
EZ
243 {
244 k = (*rl_getc_function) (rl_instream);
245 rl_stuff_char (k);
246 if (k == NEWLINE || k == RETURN)
247 break;
248 }
d60d9f65
SS
249 }
250 else
251 {
252 if (chars_avail)
253 rl_stuff_char (input);
254 }
84041b4c
EZ
255
256 return 1;
257}
258
259int
260rl_set_keyboard_input_timeout (u)
261 int u;
262{
263 int o;
264
265 o = _keyboard_input_timeout;
266 if (u > 0)
267 _keyboard_input_timeout = u;
268 return (o);
d60d9f65
SS
269}
270
271/* Is there input available to be read on the readline input file
84041b4c
EZ
272 descriptor? Only works if the system has select(2) or FIONREAD.
273 Uses the value of _keyboard_input_timeout as the timeout; if another
274 readline function wants to specify a timeout and not leave it up to
275 the user, it should use _rl_input_queued(timeout_value_in_microseconds)
276 instead. */
d60d9f65
SS
277int
278_rl_input_available ()
279{
280#if defined(HAVE_SELECT)
281 fd_set readfds, exceptfds;
282 struct timeval timeout;
283#endif
84041b4c 284#if !defined (HAVE_SELECT) && defined(FIONREAD)
d60d9f65
SS
285 int chars_avail;
286#endif
287 int tty;
288
289 tty = fileno (rl_instream);
290
291#if defined (HAVE_SELECT)
292 FD_ZERO (&readfds);
293 FD_ZERO (&exceptfds);
294 FD_SET (tty, &readfds);
295 FD_SET (tty, &exceptfds);
296 timeout.tv_sec = 0;
84041b4c 297 timeout.tv_usec = _keyboard_input_timeout;
d60d9f65 298 return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
84041b4c 299#else
d60d9f65
SS
300
301#if defined (FIONREAD)
302 if (ioctl (tty, FIONREAD, &chars_avail) == 0)
303 return (chars_avail);
84041b4c
EZ
304#endif
305
d60d9f65
SS
306#endif
307
308 return 0;
309}
310
84041b4c
EZ
311int
312_rl_input_queued (t)
313 int t;
314{
315 int old_timeout, r;
316
317 old_timeout = rl_set_keyboard_input_timeout (t);
318 r = _rl_input_available ();
319 rl_set_keyboard_input_timeout (old_timeout);
320 return r;
321}
322
d60d9f65
SS
323void
324_rl_insert_typein (c)
325 int c;
326{
327 int key, t, i;
328 char *string;
329
330 i = key = 0;
84041b4c 331 string = (char *)xmalloc (ibuffer_len + 1);
d60d9f65
SS
332 string[i++] = (char) c;
333
334 while ((t = rl_get_char (&key)) &&
335 _rl_keymap[key].type == ISFUNC &&
336 _rl_keymap[key].function == rl_insert)
337 string[i++] = key;
338
339 if (t)
84041b4c 340 _rl_unget_char (key);
d60d9f65
SS
341
342 string[i] = '\0';
343 rl_insert_text (string);
344 free (string);
345}
346
c862e87b
JM
347/* Add KEY to the buffer of characters to be read. Returns 1 if the
348 character was stuffed correctly; 0 otherwise. */
349int
350rl_stuff_char (key)
351 int key;
352{
353 if (ibuffer_space () == 0)
354 return 0;
355
356 if (key == EOF)
357 {
358 key = NEWLINE;
359 rl_pending_input = EOF;
84041b4c 360 RL_SETSTATE (RL_STATE_INPUTPENDING);
c862e87b
JM
361 }
362 ibuffer[push_index++] = key;
363 if (push_index >= ibuffer_len)
364 push_index = 0;
365
366 return 1;
367}
368
369/* Make C be the next command to be executed. */
370int
371rl_execute_next (c)
372 int c;
373{
374 rl_pending_input = c;
84041b4c
EZ
375 RL_SETSTATE (RL_STATE_INPUTPENDING);
376 return 0;
377}
378
379/* Clear any pending input pushed with rl_execute_next() */
380int
381rl_clear_pending_input ()
382{
383 rl_pending_input = 0;
384 RL_UNSETSTATE (RL_STATE_INPUTPENDING);
c862e87b
JM
385 return 0;
386}
387
d60d9f65
SS
388/* **************************************************************** */
389/* */
390/* Character Input */
391/* */
392/* **************************************************************** */
393
394/* Read a key, including pending input. */
395int
396rl_read_key ()
397{
398 int c;
399
400 rl_key_sequence_length++;
401
402 if (rl_pending_input)
403 {
404 c = rl_pending_input;
84041b4c 405 rl_clear_pending_input ();
d60d9f65
SS
406 }
407 else
408 {
409 /* If input is coming from a macro, then use that. */
410 if (c = _rl_next_macro_key ())
411 return (c);
412
413 /* If the user has an event function, then call it periodically. */
414 if (rl_event_hook)
415 {
416 while (rl_event_hook && rl_get_char (&c) == 0)
417 {
418 (*rl_event_hook) ();
84041b4c
EZ
419 if (rl_done) /* XXX - experimental */
420 return ('\n');
421 if (rl_gather_tyi () < 0) /* XXX - EIO */
422 {
423 rl_done = 1;
424 return ('\n');
425 }
d60d9f65
SS
426 }
427 }
428 else
429 {
430 if (rl_get_char (&c) == 0)
431 c = (*rl_getc_function) (rl_instream);
432 }
433 }
434
435 return (c);
436}
437
438int
439rl_getc (stream)
440 FILE *stream;
441{
f9267e15 442 int result;
d60d9f65
SS
443 unsigned char c;
444
d60d9f65
SS
445 while (1)
446 {
b585a9fa
EZ
447#if defined (__MINGW32__)
448 if (isatty (fileno (stream)))
449 return (getch ());
450#endif
d60d9f65
SS
451 result = read (fileno (stream), &c, sizeof (unsigned char));
452
453 if (result == sizeof (unsigned char))
454 return (c);
455
456 /* If zero characters are returned, then the file that we are
457 reading from is empty! Return EOF in that case. */
458 if (result == 0)
459 return (EOF);
460
c862e87b
JM
461#if defined (__BEOS__)
462 if (errno == EINTR)
463 continue;
464#endif
465
d60d9f65 466#if defined (EWOULDBLOCK)
f9267e15
EZ
467# define X_EWOULDBLOCK EWOULDBLOCK
468#else
469# define X_EWOULDBLOCK -99
470#endif
471
472#if defined (EAGAIN)
473# define X_EAGAIN EAGAIN
474#else
475# define X_EAGAIN -99
476#endif
477
478 if (errno == X_EWOULDBLOCK || errno == X_EAGAIN)
d60d9f65 479 {
84041b4c 480 if (sh_unset_nodelay_mode (fileno (stream)) < 0)
d60d9f65 481 return (EOF);
d60d9f65
SS
482 continue;
483 }
d60d9f65 484
f9267e15
EZ
485#undef X_EWOULDBLOCK
486#undef X_EAGAIN
d60d9f65 487
d60d9f65
SS
488 /* If the error that we received was SIGINT, then try again,
489 this is simply an interrupted system call to read ().
490 Otherwise, some error ocurred, also signifying EOF. */
491 if (errno != EINTR)
492 return (EOF);
d60d9f65
SS
493 }
494}
84041b4c
EZ
495
496#if defined (HANDLE_MULTIBYTE)
497/* read multibyte char */
498int
499_rl_read_mbchar (mbchar, size)
500 char *mbchar;
501 int size;
502{
503 int mb_len = 0;
504 size_t mbchar_bytes_length;
505 wchar_t wc;
506 mbstate_t ps, ps_back;
507
508 memset(&ps, 0, sizeof (mbstate_t));
509 memset(&ps_back, 0, sizeof (mbstate_t));
510
511 while (mb_len < size)
512 {
513 RL_SETSTATE(RL_STATE_MOREINPUT);
514 mbchar[mb_len++] = rl_read_key ();
515 RL_UNSETSTATE(RL_STATE_MOREINPUT);
516
517 mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
518 if (mbchar_bytes_length == (size_t)(-1))
519 break; /* invalid byte sequence for the current locale */
520 else if (mbchar_bytes_length == (size_t)(-2))
521 {
522 /* shorted bytes */
523 ps = ps_back;
524 continue;
525 }
b585a9fa
EZ
526 else if (mbchar_bytes_length == 0)
527 {
528 mbchar[0] = '\0'; /* null wide character */
529 mb_len = 1;
530 break;
531 }
84041b4c
EZ
532 else if (mbchar_bytes_length > (size_t)(0))
533 break;
534 }
535
536 return mb_len;
537}
538
539/* Read a multibyte-character string whose first character is FIRST into
540 the buffer MB of length MBLEN. Returns the last character read, which
541 may be FIRST. Used by the search functions, among others. Very similar
542 to _rl_read_mbchar. */
543int
544_rl_read_mbstring (first, mb, mblen)
545 int first;
546 char *mb;
547 int mblen;
548{
549 int i, c;
550 mbstate_t ps;
551
552 c = first;
553 memset (mb, 0, mblen);
554 for (i = 0; i < mblen; i++)
555 {
556 mb[i] = (char)c;
557 memset (&ps, 0, sizeof (mbstate_t));
558 if (_rl_get_char_len (mb, &ps) == -2)
559 {
560 /* Read more for multibyte character */
561 RL_SETSTATE (RL_STATE_MOREINPUT);
562 c = rl_read_key ();
563 RL_UNSETSTATE (RL_STATE_MOREINPUT);
564 }
565 else
566 break;
567 }
568 return c;
569}
570#endif /* HANDLE_MULTIBYTE */
This page took 0.043884 seconds and 4 git commands to generate.