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