annotate readline/input.c @ 3779:3001e15555e9

[project @ 2001-02-07 04:47:51 by jwe]
author jwe
date Wed, 07 Feb 2001 04:48:01 +0000
parents f7e4a95916f2
children e4e25cdb6786
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1 /* input.c -- character input functions for readline. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
2
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
3 /* Copyright (C) 1994 Free Software Foundation, Inc.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
4
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
5 This file is part of the GNU Readline Library, a library for
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
6 reading lines of text with interactive input and history editing.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
7
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
8 The GNU Readline Library is free software; you can redistribute it
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
9 and/or modify it under the terms of the GNU General Public License
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
10 as published by the Free Software Foundation; either version 2, or
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
11 (at your option) any later version.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
12
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
13 The GNU Readline Library is distributed in the hope that it will be
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
15 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
16 GNU General Public License for more details.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
17
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
18 The GNU General Public License is often shipped with GNU software, and
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
19 is generally kept in a file called COPYING or LICENSE. If you do not
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
20 have a copy of the license, write to the Free Software Foundation,
3284
f7e4a95916f2 [project @ 1999-10-13 21:37:04 by jwe]
jwe
parents: 2996
diff changeset
21 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
22 #define READLINE_LIBRARY
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
23
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
24 #if defined (HAVE_CONFIG_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
25 # include <config.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
26 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
27
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
28 #include <sys/types.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
29 #include <fcntl.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
30 #if defined (HAVE_SYS_FILE_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
31 # include <sys/file.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
32 #endif /* HAVE_SYS_FILE_H */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
33
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
34 #if defined (HAVE_UNISTD_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
35 # include <unistd.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
36 #endif /* HAVE_UNISTD_H */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
37
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
38 #if defined (HAVE_STDLIB_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
39 # include <stdlib.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
40 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
41 # include "ansi_stdlib.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
42 #endif /* HAVE_STDLIB_H */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
43
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
44 #if defined (HAVE_SELECT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
45 # if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
46 # include <sys/time.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
47 # endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
48 #endif /* HAVE_SELECT */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
49 #if defined (HAVE_SYS_SELECT_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
50 # include <sys/select.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
51 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
52
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
53 #if defined (FIONREAD_IN_SYS_IOCTL)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
54 # include <sys/ioctl.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
55 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
56
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
57 #include <stdio.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
58 #include <errno.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
59
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
60 #if !defined (errno)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
61 extern int errno;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
62 #endif /* !errno */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
63
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
64 /* System-specific feature definitions and include files. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
65 #include "rldefs.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
66
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
67 /* Some standard library routines. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
68 #include "readline.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
69
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
70 #include "rlprivate.h"
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
71 #include "rlshell.h"
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
72 #include "xmalloc.h"
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
73
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
74 /* What kind of non-blocking I/O do we have? */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
75 #if !defined (O_NDELAY) && defined (O_NONBLOCK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
76 # define O_NDELAY O_NONBLOCK /* Posix style */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
77 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
78
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
79 /* Non-null means it is a pointer to a function to run while waiting for
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
80 character input. */
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
81 rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
82
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
83 rl_getc_func_t *rl_getc_function = rl_getc;
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
84
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
85 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
86 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
87 /* Character Input Buffering */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
88 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
89 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
90
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
91 static int pop_index, push_index;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
92 static unsigned char ibuffer[512];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
93 static int ibuffer_len = sizeof (ibuffer) - 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
94
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
95 #define any_typein (push_index != pop_index)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
96
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
97 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
98 _rl_any_typein ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
99 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
100 return any_typein;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
101 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
102
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
103 /* Return the amount of space available in the buffer for stuffing
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
104 characters. */
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
105 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
106 ibuffer_space ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
107 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
108 if (pop_index > push_index)
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
109 return (pop_index - push_index - 1);
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
110 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
111 return (ibuffer_len - (push_index - pop_index));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
112 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
113
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
114 /* Get a key from the buffer of characters to be read.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
115 Return the key in KEY.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
116 Result is KEY if there was a key, or 0 if there wasn't. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
117 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
118 rl_get_char (key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
119 int *key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
120 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
121 if (push_index == pop_index)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
122 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
123
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
124 *key = ibuffer[pop_index++];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
125
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
126 if (pop_index >= ibuffer_len)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
127 pop_index = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
128
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
129 return (1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
130 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
131
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
132 /* Stuff KEY into the *front* of the input buffer.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
133 Returns non-zero if successful, zero if there is
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
134 no space left in the buffer. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
135 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
136 rl_unget_char (key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
137 int key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
138 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
139 if (ibuffer_space ())
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
140 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
141 pop_index--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
142 if (pop_index < 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
143 pop_index = ibuffer_len - 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
144 ibuffer[pop_index] = key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
145 return (1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
146 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
147 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
148 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
149
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
150 /* If a character is available to be read, then read it
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
151 and stuff it into IBUFFER. Otherwise, just return. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
152 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
153 rl_gather_tyi ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
154 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
155 int tty;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
156 register int tem, result;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
157 int chars_avail;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
158 char input;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
159 #if defined(HAVE_SELECT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
160 fd_set readfds, exceptfds;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
161 struct timeval timeout;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
162 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
163
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
164 tty = fileno (rl_instream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
165
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
166 #if defined (HAVE_SELECT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
167 FD_ZERO (&readfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
168 FD_ZERO (&exceptfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
169 FD_SET (tty, &readfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
170 FD_SET (tty, &exceptfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
171 timeout.tv_sec = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
172 timeout.tv_usec = 100000; /* 0.1 seconds */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
173 if (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) <= 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
174 return; /* Nothing to read. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
175 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
176
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
177 result = -1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
178 #if defined (FIONREAD)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
179 result = ioctl (tty, FIONREAD, &chars_avail);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
180 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
181
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
182 #if defined (O_NDELAY)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
183 if (result == -1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
184 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
185 tem = fcntl (tty, F_GETFL, 0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
186
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
187 fcntl (tty, F_SETFL, (tem | O_NDELAY));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
188 chars_avail = read (tty, &input, 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
189
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
190 fcntl (tty, F_SETFL, tem);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
191 if (chars_avail == -1 && errno == EAGAIN)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
192 return;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
193 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
194 #endif /* O_NDELAY */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
195
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
196 /* If there's nothing available, don't waste time trying to read
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
197 something. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
198 if (chars_avail <= 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
199 return;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
200
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
201 tem = ibuffer_space ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
202
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
203 if (chars_avail > tem)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
204 chars_avail = tem;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
205
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
206 /* One cannot read all of the available input. I can only read a single
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
207 character at a time, or else programs which require input can be
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
208 thwarted. If the buffer is larger than one character, I lose.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
209 Damn! */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
210 if (tem < ibuffer_len)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
211 chars_avail = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
212
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
213 if (result != -1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
214 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
215 while (chars_avail--)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
216 rl_stuff_char ((*rl_getc_function) (rl_instream));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
217 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
218 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
219 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
220 if (chars_avail)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
221 rl_stuff_char (input);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
222 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
223 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
224
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
225 /* Is there input available to be read on the readline input file
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
226 descriptor? Only works if the system has select(2) or FIONREAD. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
227 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
228 _rl_input_available ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
229 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
230 #if defined(HAVE_SELECT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
231 fd_set readfds, exceptfds;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
232 struct timeval timeout;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
233 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
234 #if defined(FIONREAD)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
235 int chars_avail;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
236 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
237 int tty;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
238
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
239 tty = fileno (rl_instream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
240
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
241 #if defined (HAVE_SELECT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
242 FD_ZERO (&readfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
243 FD_ZERO (&exceptfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
244 FD_SET (tty, &readfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
245 FD_SET (tty, &exceptfds);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
246 timeout.tv_sec = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
247 timeout.tv_usec = 100000; /* 0.1 seconds */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
248 return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
249 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
250
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
251 #if defined (FIONREAD)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
252 if (ioctl (tty, FIONREAD, &chars_avail) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
253 return (chars_avail);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
254 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
255
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
256 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
257 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
258
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
259 void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
260 _rl_insert_typein (c)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
261 int c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
262 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
263 int key, t, i;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
264 char *string;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
265
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
266 i = key = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
267 string = xmalloc (ibuffer_len + 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
268 string[i++] = (char) c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
269
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
270 while ((t = rl_get_char (&key)) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
271 _rl_keymap[key].type == ISFUNC &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
272 _rl_keymap[key].function == rl_insert)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
273 string[i++] = key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
274
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
275 if (t)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
276 rl_unget_char (key);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
277
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
278 string[i] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
279 rl_insert_text (string);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
280 free (string);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
281 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
282
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
283 /* Add KEY to the buffer of characters to be read. Returns 1 if the
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
284 character was stuffed correctly; 0 otherwise. */
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
285 int
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
286 rl_stuff_char (key)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
287 int key;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
288 {
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
289 if (ibuffer_space () == 0)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
290 return 0;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
291
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
292 if (key == EOF)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
293 {
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
294 key = NEWLINE;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
295 rl_pending_input = EOF;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
296 RL_SETSTATE (RL_STATE_INPUTPENDING);
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
297 }
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
298 ibuffer[push_index++] = key;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
299 if (push_index >= ibuffer_len)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
300 push_index = 0;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
301
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
302 return 1;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
303 }
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
304
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
305 /* Make C be the next command to be executed. */
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
306 int
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
307 rl_execute_next (c)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
308 int c;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
309 {
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
310 rl_pending_input = c;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
311 RL_SETSTATE (RL_STATE_INPUTPENDING);
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
312 return 0;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
313 }
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
314
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
315 /* Clear any pending input pushed with rl_execute_next() */
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
316 int
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
317 rl_clear_pending_input ()
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
318 {
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
319 rl_pending_input = 0;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
320 RL_UNSETSTATE (RL_STATE_INPUTPENDING);
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
321 return 0;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
322 }
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
323
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
324 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
325 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
326 /* Character Input */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
327 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
328 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
329
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
330 /* Read a key, including pending input. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
331 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
332 rl_read_key ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
333 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
334 int c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
335
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
336 rl_key_sequence_length++;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
337
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
338 if (rl_pending_input)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
339 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
340 c = rl_pending_input;
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
341 rl_clear_pending_input ();
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
342 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
343 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
344 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
345 /* If input is coming from a macro, then use that. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
346 if (c = _rl_next_macro_key ())
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
347 return (c);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
348
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
349 /* If the user has an event function, then call it periodically. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
350 if (rl_event_hook)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
351 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
352 while (rl_event_hook && rl_get_char (&c) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
353 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
354 (*rl_event_hook) ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
355 rl_gather_tyi ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
356 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
357 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
358 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
359 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
360 if (rl_get_char (&c) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
361 c = (*rl_getc_function) (rl_instream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
362 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
363 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
364
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
365 return (c);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
366 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
367
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
368 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
369 rl_getc (stream)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
370 FILE *stream;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
371 {
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
372 int result;
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
373 unsigned char c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
374
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
375 while (1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
376 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
377 result = read (fileno (stream), &c, sizeof (unsigned char));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
378
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
379 if (result == sizeof (unsigned char))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
380 return (c);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
381
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
382 /* If zero characters are returned, then the file that we are
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
383 reading from is empty! Return EOF in that case. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
384 if (result == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
385 return (EOF);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
386
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
387 #if defined (__BEOS__)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
388 if (errno == EINTR)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
389 continue;
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
390 #endif
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
391
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
392 #if defined (EWOULDBLOCK)
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
393 # define X_EWOULDBLOCK EWOULDBLOCK
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
394 #else
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
395 # define X_EWOULDBLOCK -99
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
396 #endif
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
397
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
398 #if defined (EAGAIN)
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
399 # define X_EAGAIN EAGAIN
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
400 #else
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
401 # define X_EAGAIN -99
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
402 #endif
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
403
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
404 if (errno == X_EWOULDBLOCK || errno == X_EAGAIN)
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
405 {
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
406 if (sh_unset_nodelay_mode (fileno (stream)) < 0)
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
407 return (EOF);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
408 continue;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
409 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
410
3779
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
411 #undef X_EWOULDBLOCK
3001e15555e9 [project @ 2001-02-07 04:47:51 by jwe]
jwe
parents: 3284
diff changeset
412 #undef X_EAGAIN
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
413
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
414 /* If the error that we received was SIGINT, then try again,
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
415 this is simply an interrupted system call to read ().
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
416 Otherwise, some error ocurred, also signifying EOF. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
417 if (errno != EINTR)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
418 return (EOF);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
419 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
420 }