input.c revision 165670
1/* input.c -- character input functions for readline. */
2
3/* Copyright (C) 1994-2005 Free Software Foundation, Inc.
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,
21   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22#define READLINE_LIBRARY
23
24#if defined (__TANDEM)
25#  include <floss.h>
26#endif
27
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"
70#include "rlmbutil.h"
71
72/* Some standard library routines. */
73#include "readline.h"
74
75#include "rlprivate.h"
76#include "rlshell.h"
77#include "xmalloc.h"
78
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
84/* Non-null means it is a pointer to a function to run while waiting for
85   character input. */
86rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
87
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));
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
114/* Return the amount of space available in the buffer for stuffing
115   characters. */
116static int
117ibuffer_space ()
118{
119  if (pop_index > push_index)
120    return (pop_index - push_index - 1);
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. */
146int
147_rl_unget_char (key)
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
161int
162_rl_pushed_input_available ()
163{
164  return (push_index != pop_index);
165}
166
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
171rl_gather_tyi ()
172{
173  int tty;
174  register int tem, result;
175  int chars_avail, k;
176  char input;
177#if defined(HAVE_SELECT)
178  fd_set readfds, exceptfds;
179  struct timeval timeout;
180#endif
181
182  chars_avail = 0;
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;
191  timeout.tv_usec = _keyboard_input_timeout;
192  result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
193  if (result <= 0)
194    return 0;	/* Nothing to read. */
195#endif
196
197  result = -1;
198#if defined (FIONREAD)
199  errno = 0;
200  result = ioctl (tty, FIONREAD, &chars_avail);
201  if (result == -1 && errno == EIO)
202    return -1;
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)
215	return 0;
216      if (chars_avail == 0)	/* EOF */
217	{
218	  rl_stuff_char (EOF);
219	  return (0);
220	}
221    }
222#endif /* O_NDELAY */
223
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
231  /* If there's nothing available, don't waste time trying to read
232     something. */
233  if (chars_avail <= 0)
234    return 0;
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--)
251	{
252	  k = (*rl_getc_function) (rl_instream);
253	  rl_stuff_char (k);
254	  if (k == NEWLINE || k == RETURN)
255	    break;
256	}
257    }
258  else
259    {
260      if (chars_avail)
261	rl_stuff_char (input);
262    }
263
264  return 1;
265}
266
267int
268rl_set_keyboard_input_timeout (u)
269     int u;
270{
271  int o;
272
273  o = _keyboard_input_timeout;
274  if (u >= 0)
275    _keyboard_input_timeout = u;
276  return (o);
277}
278
279/* Is there input available to be read on the readline input file
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. */
285int
286_rl_input_available ()
287{
288#if defined(HAVE_SELECT)
289  fd_set readfds, exceptfds;
290  struct timeval timeout;
291#endif
292#if !defined (HAVE_SELECT) && defined(FIONREAD)
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;
305  timeout.tv_usec = _keyboard_input_timeout;
306  return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
307#else
308
309#if defined (FIONREAD)
310  if (ioctl (tty, FIONREAD, &chars_avail) == 0)
311    return (chars_avail);
312#endif
313
314#endif
315
316#if defined (__MINGW32__)
317  if (isatty (tty))
318    return (_kbhit ());
319#endif
320
321  return 0;
322}
323
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
336void
337_rl_insert_typein (c)
338     int c;
339{
340  int key, t, i;
341  char *string;
342
343  i = key = 0;
344  string = (char *)xmalloc (ibuffer_len + 1);
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)
353    _rl_unget_char (key);
354
355  string[i] = '\0';
356  rl_insert_text (string);
357  free (string);
358}
359
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;
373      RL_SETSTATE (RL_STATE_INPUTPENDING);
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;
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);
398  return 0;
399}
400
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;
418      rl_clear_pending_input ();
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) ();
432	      if (rl_done)		/* XXX - experimental */
433		return ('\n');
434	      if (rl_gather_tyi () < 0)	/* XXX - EIO */
435		{
436		  rl_done = 1;
437		  return ('\n');
438		}
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{
455  int result;
456  unsigned char c;
457
458  while (1)
459    {
460#if defined (__MINGW32__)
461      if (isatty (fileno (stream)))
462	return (getch ());
463#endif
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
474#if defined (__BEOS__)
475      if (errno == EINTR)
476	continue;
477#endif
478
479#if defined (EWOULDBLOCK)
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)
492	{
493	  if (sh_unset_nodelay_mode (fileno (stream)) < 0)
494	    return (EOF);
495	  continue;
496	}
497
498#undef X_EWOULDBLOCK
499#undef X_EAGAIN
500
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)
505	return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
506    }
507}
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	}
539      else if (mbchar_bytes_length == 0)
540	{
541	  mbchar[0] = '\0';	/* null wide character */
542	  mb_len = 1;
543	  break;
544	}
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
553   the buffer MB of length MLEN.  Returns the last character read, which
554   may be FIRST.  Used by the search functions, among others.  Very similar
555   to _rl_read_mbchar. */
556int
557_rl_read_mbstring (first, mb, mlen)
558     int first;
559     char *mb;
560     int mlen;
561{
562  int i, c;
563  mbstate_t ps;
564
565  c = first;
566  memset (mb, 0, mlen);
567  for (i = 0; i < mlen; i++)
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 */
584