blob: 8fc5647638a4536f3da36253c2d32fd67f98c708 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is read.def, from which is created read.c.
2It implements the builtin "read" in Bash.
3
Jari Aalto31859422009-01-12 13:36:28 +00004Copyright (C) 1987-2009 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
6This file is part of GNU Bash, the Bourne Again SHell.
7
Jari Aalto31859422009-01-12 13:36:28 +00008Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
Jari Aalto726f6381996-08-26 18:22:31 +000020
21$PRODUCES read.c
22
23$BUILTIN read
24$FUNCTION read_builtin
Jari Aalto31859422009-01-12 13:36:28 +000025$SHORT_DOC read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
26Read a line from the standard input and split it into fields.
Jari Aaltobb706242000-03-17 21:46:59 +000027
Jari Aalto31859422009-01-12 13:36:28 +000028Reads a single line from the standard input, or from file descriptor FD
29if the -u option is supplied. The line is split into fields as with word
30splitting, and the first word is assigned to the first NAME, the second
31word to the second NAME, and so on, with any leftover words assigned to
32the last NAME. Only the characters found in $IFS are recognized as word
33delimiters.
34
35If no NAMEs are supplied, the line read is stored in the REPLY variable.
36
37Options:
38 -a array assign the words read to sequential indices of the array
39 variable ARRAY, starting at zero
40 -d delim continue until the first character of DELIM is read, rather
41 than newline
42 -e use Readline to obtain the line in an interactive shell
43 -i text Use TEXT as the initial text for Readline
44 -n nchars return after reading NCHARS characters rather than waiting
45 for a newline
46 -p prompt output the string PROMPT without a trailing newline before
47 attempting to read
48 -r do not allow backslashes to escape any characters
49 -s do not echo input coming from a terminal
50 -t timeout time out and return failure if a complete line of input is
51 not read withint TIMEOUT seconds. The value of the TMOUT
52 variable is the default timeout. TIMEOUT may be a
53 fractional number. If TIMEOUT is 0, read returns success only
54 if input is available on the specified file descriptor. The
55 exit status is greater than 128 if the timeout is exceeded
56 -u fd read from file descriptor FD instead of the standard input
57
58Exit Status:
59The return code is zero, unless end-of-file is encountered, read times out,
60or an invalid file descriptor is supplied as the argument to -u.
Jari Aalto726f6381996-08-26 18:22:31 +000061$END
62
Jari Aaltoccc6cda1996-12-23 17:02:34 +000063#include <config.h>
64
Jari Aaltobb706242000-03-17 21:46:59 +000065#include "bashtypes.h"
66#include "posixstat.h"
67
Jari Aalto726f6381996-08-26 18:22:31 +000068#include <stdio.h>
Jari Aaltoccc6cda1996-12-23 17:02:34 +000069
Jari Aalto31859422009-01-12 13:36:28 +000070#include "bashansi.h"
71
Jari Aaltoccc6cda1996-12-23 17:02:34 +000072#if defined (HAVE_UNISTD_H)
73# include <unistd.h>
74#endif
75
Jari Aaltobb706242000-03-17 21:46:59 +000076#include <signal.h>
Jari Aaltoe8ce7751997-09-22 20:22:27 +000077#include <errno.h>
78
Jari Aalto28ef6c32001-04-06 19:14:31 +000079#ifdef __CYGWIN__
80# include <fcntl.h>
81# include <io.h>
82#endif
83
Jari Aaltob80f6442004-07-27 13:29:18 +000084#include "../bashintl.h"
85
Jari Aalto726f6381996-08-26 18:22:31 +000086#include "../shell.h"
87#include "common.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000088#include "bashgetopt.h"
Jari Aalto726f6381996-08-26 18:22:31 +000089
Jari Aaltobb706242000-03-17 21:46:59 +000090#include <shtty.h>
91
Jari Aaltoccc6cda1996-12-23 17:02:34 +000092#if defined (READLINE)
93#include "../bashline.h"
94#include <readline/readline.h>
95#endif
Jari Aalto726f6381996-08-26 18:22:31 +000096
Jari Aalto95732b42005-12-07 14:08:12 +000097#if defined (BUFFERED_INPUT)
98# include "input.h"
99#endif
100
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000101#if !defined(errno)
102extern int errno;
103#endif
104
Jari Aalto31859422009-01-12 13:36:28 +0000105struct ttsave
106{
107 int fd;
108 TTYSTRUCT *attrs;
109};
110
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000111#if defined (READLINE)
Jari Aalto06285672006-10-10 14:15:34 +0000112static void reset_attempted_completion_function __P((char *));
Jari Aalto31859422009-01-12 13:36:28 +0000113static int set_itext __P((void));
114static char *edit_line __P((char *, char *));
Jari Aaltof73dda02001-11-13 17:56:06 +0000115static void set_eol_delim __P((int));
116static void reset_eol_delim __P((char *));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000117#endif
Jari Aaltof73dda02001-11-13 17:56:06 +0000118static SHELL_VAR *bind_read_variable __P((char *, char *));
Jari Aalto31859422009-01-12 13:36:28 +0000119#if defined (HANDLE_MULTIBYTE)
120static int read_mbchar __P((int, char *, int, int, int));
121#endif
122static void ttyrestore __P((struct ttsave *));
Jari Aaltof73dda02001-11-13 17:56:06 +0000123
124static sighandler sigalrm __P((int));
125static void reset_alarm __P((void));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000126
Jari Aaltobb706242000-03-17 21:46:59 +0000127static procenv_t alrmbuf;
128static SigHandler *old_alrm;
Jari Aaltof73dda02001-11-13 17:56:06 +0000129static unsigned char delim;
Jari Aaltobb706242000-03-17 21:46:59 +0000130
131static sighandler
132sigalrm (s)
133 int s;
134{
135 longjmp (alrmbuf, 1);
136}
137
138static void
139reset_alarm ()
140{
141 set_signal_handler (SIGALRM, old_alrm);
Jari Aalto31859422009-01-12 13:36:28 +0000142 falarm (0, 0);
Jari Aaltobb706242000-03-17 21:46:59 +0000143}
144
Jari Aalto726f6381996-08-26 18:22:31 +0000145/* Read the value of the shell variables whose names follow.
146 The reading is done from the current input stream, whatever
147 that may be. Successive words of the input line are assigned
148 to the variables mentioned in LIST. The last variable in LIST
149 gets the remainder of the words on the line. If no variables
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000150 are mentioned in LIST, then the default variable is $REPLY. */
151int
Jari Aalto726f6381996-08-26 18:22:31 +0000152read_builtin (list)
153 WORD_LIST *list;
154{
155 register char *varname;
Jari Aaltof1be6662008-11-18 13:15:12 +0000156 int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
157 int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000158 int raw, edit, nchars, silent, have_timeout, fd;
Jari Aalto31859422009-01-12 13:36:28 +0000159 unsigned int tmsec, tmusec;
160 long ival, uval;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000161 intmax_t intval;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000162 char c;
163 char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
Jari Aaltof1be6662008-11-18 13:15:12 +0000164 char *e, *t, *t1, *ps2, *tofree;
Jari Aaltobb706242000-03-17 21:46:59 +0000165 struct stat tsb;
Jari Aalto726f6381996-08-26 18:22:31 +0000166 SHELL_VAR *var;
Jari Aalto31859422009-01-12 13:36:28 +0000167 TTYSTRUCT ttattrs, ttset;
168 struct ttsave termsave;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000169#if defined (ARRAY_VARS)
170 WORD_LIST *alist;
171#endif
172#if defined (READLINE)
Jari Aalto31859422009-01-12 13:36:28 +0000173 char *rlbuf, *itext;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000174 int rlind;
175#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000176
Jari Aaltof73dda02001-11-13 17:56:06 +0000177 USE_VAR(size);
178 USE_VAR(i);
179 USE_VAR(pass_next);
Jari Aaltof1be6662008-11-18 13:15:12 +0000180 USE_VAR(print_ps2);
Jari Aaltof73dda02001-11-13 17:56:06 +0000181 USE_VAR(saw_escape);
182 USE_VAR(input_is_pipe);
183/* USE_VAR(raw); */
184 USE_VAR(edit);
Jari Aalto31859422009-01-12 13:36:28 +0000185 USE_VAR(tmsec);
186 USE_VAR(tmusec);
Jari Aaltof73dda02001-11-13 17:56:06 +0000187 USE_VAR(nchars);
188 USE_VAR(silent);
189 USE_VAR(ifs_chars);
190 USE_VAR(prompt);
191 USE_VAR(arrayname);
192#if defined (READLINE)
193 USE_VAR(rlbuf);
194 USE_VAR(rlind);
Jari Aalto31859422009-01-12 13:36:28 +0000195 USE_VAR(itext);
Jari Aaltof73dda02001-11-13 17:56:06 +0000196#endif
197 USE_VAR(list);
Jari Aaltof1be6662008-11-18 13:15:12 +0000198 USE_VAR(ps2);
Jari Aaltof73dda02001-11-13 17:56:06 +0000199
Jari Aalto726f6381996-08-26 18:22:31 +0000200 i = 0; /* Index into the string that we are reading. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000201 raw = edit = 0; /* Not reading raw input by default. */
Jari Aaltobb706242000-03-17 21:46:59 +0000202 silent = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000203 arrayname = prompt = (char *)NULL;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000204 fd = 0; /* file descriptor to read from */
Jari Aalto726f6381996-08-26 18:22:31 +0000205
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000206#if defined (READLINE)
Jari Aalto31859422009-01-12 13:36:28 +0000207 rlbuf = itext = (char *)0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000208 rlind = 0;
209#endif
210
Jari Aalto31859422009-01-12 13:36:28 +0000211 tmsec = tmusec = 0; /* no timeout */
Jari Aalto95732b42005-12-07 14:08:12 +0000212 nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0;
Jari Aaltobb706242000-03-17 21:46:59 +0000213 delim = '\n'; /* read until newline */
214
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000215 reset_internal_getopt ();
Jari Aalto31859422009-01-12 13:36:28 +0000216 while ((opt = internal_getopt (list, "ersa:d:i:n:p:t:u:")) != -1)
Jari Aalto726f6381996-08-26 18:22:31 +0000217 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000218 switch (opt)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000219 {
220 case 'r':
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000221 raw = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000222 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000223 case 'p':
224 prompt = list_optarg;
225 break;
Jari Aaltobb706242000-03-17 21:46:59 +0000226 case 's':
227 silent = 1;
228 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000229 case 'e':
230#if defined (READLINE)
231 edit = 1;
232#endif
233 break;
Jari Aalto31859422009-01-12 13:36:28 +0000234 case 'i':
235#if defined (READLINE)
236 itext = list_optarg;
237#endif
238 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000239#if defined (ARRAY_VARS)
240 case 'a':
241 arrayname = list_optarg;
242 break;
243#endif
Jari Aaltobb706242000-03-17 21:46:59 +0000244 case 't':
Jari Aalto31859422009-01-12 13:36:28 +0000245 code = uconvert (list_optarg, &ival, &uval);
246 if (code == 0 || ival < 0 || uval < 0)
Jari Aaltobb706242000-03-17 21:46:59 +0000247 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000248 builtin_error (_("%s: invalid timeout specification"), list_optarg);
Jari Aaltobb706242000-03-17 21:46:59 +0000249 return (EXECUTION_FAILURE);
250 }
251 else
Jari Aaltof73dda02001-11-13 17:56:06 +0000252 {
253 have_timeout = 1;
Jari Aalto31859422009-01-12 13:36:28 +0000254 tmsec = ival;
255 tmusec = uval;
Jari Aaltof73dda02001-11-13 17:56:06 +0000256 }
Jari Aaltobb706242000-03-17 21:46:59 +0000257 break;
258 case 'n':
Jari Aalto7117c2d2002-07-17 14:10:11 +0000259 code = legal_number (list_optarg, &intval);
260 if (code == 0 || intval < 0 || intval != (int)intval)
Jari Aaltobb706242000-03-17 21:46:59 +0000261 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000262 sh_invalidnum (list_optarg);
Jari Aaltobb706242000-03-17 21:46:59 +0000263 return (EXECUTION_FAILURE);
264 }
265 else
Jari Aalto7117c2d2002-07-17 14:10:11 +0000266 nchars = intval;
267 break;
268 case 'u':
269 code = legal_number (list_optarg, &intval);
270 if (code == 0 || intval < 0 || intval != (int)intval)
271 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000272 builtin_error (_("%s: invalid file descriptor specification"), list_optarg);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000273 return (EXECUTION_FAILURE);
274 }
275 else
276 fd = intval;
277 if (sh_validfd (fd) == 0)
278 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000279 builtin_error (_("%d: invalid file descriptor: %s"), fd, strerror (errno));
Jari Aalto7117c2d2002-07-17 14:10:11 +0000280 return (EXECUTION_FAILURE);
281 }
Jari Aaltobb706242000-03-17 21:46:59 +0000282 break;
283 case 'd':
284 delim = *list_optarg;
285 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000286 default:
287 builtin_usage ();
Jari Aalto726f6381996-08-26 18:22:31 +0000288 return (EX_USAGE);
289 }
Jari Aalto726f6381996-08-26 18:22:31 +0000290 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000291 list = loptend;
Jari Aalto726f6381996-08-26 18:22:31 +0000292
Jari Aalto17345e52009-02-19 22:21:29 +0000293 /* `read -t 0 var' tests whether input is available with select/FIONREAD,
294 and fails if those are unavailable */
Jari Aalto31859422009-01-12 13:36:28 +0000295 if (have_timeout && tmsec == 0 && tmusec == 0)
296#if 0
Jari Aaltobb706242000-03-17 21:46:59 +0000297 return (EXECUTION_FAILURE);
Jari Aalto31859422009-01-12 13:36:28 +0000298#else
299 return (input_avail (fd) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
300#endif
Jari Aaltobb706242000-03-17 21:46:59 +0000301
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000302 /* IF IFS is unset, we use the default of " \t\n". */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000303 ifs_chars = getifs ();
304 if (ifs_chars == 0) /* XXX - shouldn't happen */
305 ifs_chars = "";
Jari Aalto31859422009-01-12 13:36:28 +0000306 for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++)
307 skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL;
Jari Aalto726f6381996-08-26 18:22:31 +0000308
Jari Aalto7117c2d2002-07-17 14:10:11 +0000309 input_string = (char *)xmalloc (size = 112); /* XXX was 128 */
Jari Aalto31859422009-01-12 13:36:28 +0000310 input_string[0] = '\0';
Jari Aalto7117c2d2002-07-17 14:10:11 +0000311
312 /* $TMOUT, if set, is the default timeout for read. */
313 if (have_timeout == 0 && (e = get_string_value ("TMOUT")))
314 {
Jari Aalto31859422009-01-12 13:36:28 +0000315 code = uconvert (e, &ival, &uval);
316 if (code == 0 || ival < 0 || uval < 0)
317 tmsec = tmusec = 0;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000318 else
Jari Aalto31859422009-01-12 13:36:28 +0000319 {
320 tmsec = ival;
321 tmusec = uval;
322 }
Jari Aalto7117c2d2002-07-17 14:10:11 +0000323 }
Jari Aalto726f6381996-08-26 18:22:31 +0000324
325 begin_unwind_frame ("read_builtin");
Jari Aalto726f6381996-08-26 18:22:31 +0000326
Jari Aalto95732b42005-12-07 14:08:12 +0000327#if defined (BUFFERED_INPUT)
328 if (interactive == 0 && default_buffered_input >= 0 && fd_is_bash_input (fd))
329 sync_buffered_stream (default_buffered_input);
330#endif
331
Jari Aalto7117c2d2002-07-17 14:10:11 +0000332 input_is_tty = isatty (fd);
Jari Aaltobb706242000-03-17 21:46:59 +0000333 if (input_is_tty == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000334#ifndef __CYGWIN__
Jari Aalto95732b42005-12-07 14:08:12 +0000335 input_is_pipe = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
Jari Aaltobb706242000-03-17 21:46:59 +0000336#else
337 input_is_pipe = 1;
338#endif
339
340 /* If the -p, -e or -s flags were given, but input is not coming from the
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000341 terminal, turn them off. */
Jari Aaltobb706242000-03-17 21:46:59 +0000342 if ((prompt || edit || silent) && input_is_tty == 0)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000343 {
344 prompt = (char *)NULL;
Jari Aalto31859422009-01-12 13:36:28 +0000345#if defined (READLINE)
346 itext = (char *)NULL;
347#endif
Jari Aaltobb706242000-03-17 21:46:59 +0000348 edit = silent = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000349 }
350
Jari Aalto7117c2d2002-07-17 14:10:11 +0000351#if defined (READLINE)
352 if (edit)
353 add_unwind_protect (xfree, rlbuf);
354#endif
355
Jari Aalto726f6381996-08-26 18:22:31 +0000356 pass_next = 0; /* Non-zero signifies last char was backslash. */
357 saw_escape = 0; /* Non-zero signifies that we saw an escape char */
358
Jari Aalto31859422009-01-12 13:36:28 +0000359 if (tmsec > 0 || tmusec > 0)
Jari Aaltobb706242000-03-17 21:46:59 +0000360 {
361 /* Turn off the timeout if stdin is a regular file (e.g. from
362 input redirection). */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000363 if ((fstat (fd, &tsb) < 0) || S_ISREG (tsb.st_mode))
Jari Aalto31859422009-01-12 13:36:28 +0000364 tmsec = tmusec = 0;
Jari Aaltobb706242000-03-17 21:46:59 +0000365 }
366
Jari Aalto31859422009-01-12 13:36:28 +0000367 if (tmsec > 0 || tmusec > 0)
Jari Aaltobb706242000-03-17 21:46:59 +0000368 {
369 code = setjmp (alrmbuf);
370 if (code)
371 {
Chet Ramey89a92862011-11-21 20:49:12 -0500372 /* Tricky. The top of the unwind-protect stack is the free of
373 input_string. We want to run all the rest and use input_string,
374 so we have to remove it from the stack. */
375 remove_unwind_protect ();
Jari Aaltobb706242000-03-17 21:46:59 +0000376 run_unwind_frame ("read_builtin");
Jari Aalto31859422009-01-12 13:36:28 +0000377 input_string[i] = '\0'; /* make sure it's terminated */
Chet Ramey89a92862011-11-21 20:49:12 -0500378 retval = 128+SIGALRM;
Jari Aalto31859422009-01-12 13:36:28 +0000379 goto assign_vars;
Jari Aaltobb706242000-03-17 21:46:59 +0000380 }
381 old_alrm = set_signal_handler (SIGALRM, sigalrm);
382 add_unwind_protect (reset_alarm, (char *)NULL);
Jari Aalto06285672006-10-10 14:15:34 +0000383#if defined (READLINE)
384 if (edit)
385 add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
386#endif
Jari Aalto31859422009-01-12 13:36:28 +0000387 falarm (tmsec, tmusec);
Jari Aaltobb706242000-03-17 21:46:59 +0000388 }
389
390 /* If we've been asked to read only NCHARS chars, or we're using some
391 character other than newline to terminate the line, do the right
392 thing to readline or the tty. */
393 if (nchars > 0 || delim != '\n')
394 {
395#if defined (READLINE)
396 if (edit)
397 {
398 if (nchars > 0)
399 {
400 unwind_protect_int (rl_num_chars_to_read);
401 rl_num_chars_to_read = nchars;
402 }
403 if (delim != '\n')
404 {
405 set_eol_delim (delim);
406 add_unwind_protect (reset_eol_delim, (char *)NULL);
407 }
408 }
409 else
410#endif
411 if (input_is_tty)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000412 {
Jari Aalto31859422009-01-12 13:36:28 +0000413 /* ttsave() */
414 termsave.fd = fd;
415 ttgetattr (fd, &ttattrs);
416 termsave.attrs = &ttattrs;
417
418 ttset = ttattrs;
Jari Aalto17345e52009-02-19 22:21:29 +0000419 i = silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar (fd, &ttset);
420 if (i < 0)
421 sh_ttyerror (1);
Jari Aalto31859422009-01-12 13:36:28 +0000422 add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
Jari Aaltobb706242000-03-17 21:46:59 +0000423 }
424 }
425 else if (silent) /* turn off echo but leave term in canonical mode */
426 {
Jari Aalto31859422009-01-12 13:36:28 +0000427 /* ttsave (); */
428 termsave.fd = fd;
429 ttgetattr (fd, &ttattrs);
430 termsave.attrs = &ttattrs;
431
432 ttset = ttattrs;
Jari Aalto17345e52009-02-19 22:21:29 +0000433 i = ttfd_noecho (fd, &ttset); /* ttnoecho (); */
434 if (i < 0)
435 sh_ttyerror (1);
Jari Aalto31859422009-01-12 13:36:28 +0000436
437 add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
Jari Aaltobb706242000-03-17 21:46:59 +0000438 }
439
Jari Aalto28ef6c32001-04-06 19:14:31 +0000440 /* This *must* be the top unwind-protect on the stack, so the manipulation
441 of the unwind-protect stack after the realloc() works right. */
442 add_unwind_protect (xfree, input_string);
443 interrupt_immediately++;
Jari Aalto31859422009-01-12 13:36:28 +0000444 terminate_immediately++;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000445
Jari Aaltobb706242000-03-17 21:46:59 +0000446 unbuffered_read = (nchars > 0) || (delim != '\n') || input_is_pipe;
447
Jari Aalto31859422009-01-12 13:36:28 +0000448 if (prompt && edit == 0)
449 {
450 fprintf (stderr, "%s", prompt);
451 fflush (stderr);
452 }
453
Jari Aalto28ef6c32001-04-06 19:14:31 +0000454#if defined (__CYGWIN__) && defined (O_TEXT)
455 setmode (0, O_TEXT);
456#endif
457
Jari Aaltof1be6662008-11-18 13:15:12 +0000458 ps2 = 0;
459 for (print_ps2 = eof = retval = 0;;)
Jari Aalto726f6381996-08-26 18:22:31 +0000460 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000461#if defined (READLINE)
462 if (edit)
463 {
464 if (rlbuf && rlbuf[rlind] == '\0')
465 {
Jari Aaltod166f041997-06-05 14:59:13 +0000466 xfree (rlbuf);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000467 rlbuf = (char *)0;
468 }
469 if (rlbuf == 0)
470 {
Jari Aalto31859422009-01-12 13:36:28 +0000471 rlbuf = edit_line (prompt ? prompt : "", itext);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000472 rlind = 0;
473 }
474 if (rlbuf == 0)
475 {
476 eof = 1;
477 break;
478 }
479 c = rlbuf[rlind++];
480 }
481 else
Jari Aaltob72432f1999-02-19 17:11:39 +0000482 {
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000483#endif
484
Jari Aaltof1be6662008-11-18 13:15:12 +0000485 if (print_ps2)
486 {
487 if (ps2 == 0)
488 ps2 = get_string_value ("PS2");
489 fprintf (stderr, "%s", ps2 ? ps2 : "");
490 fflush (stderr);
491 print_ps2 = 0;
492 }
493
Jari Aaltobb706242000-03-17 21:46:59 +0000494 if (unbuffered_read)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000495 retval = zread (fd, &c, 1);
Jari Aaltobb706242000-03-17 21:46:59 +0000496 else
Jari Aalto7117c2d2002-07-17 14:10:11 +0000497 retval = zreadc (fd, &c);
Jari Aaltobb706242000-03-17 21:46:59 +0000498
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000499 if (retval <= 0)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000500 {
501 eof = 1;
502 break;
503 }
504
Jari Aaltob72432f1999-02-19 17:11:39 +0000505#if defined (READLINE)
506 }
507#endif
508
Jari Aalto31859422009-01-12 13:36:28 +0000509 if (i + 4 >= size) /* XXX was i + 2; use i + 4 for multibyte/read_mbchar */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000510 {
Jari Aaltof73dda02001-11-13 17:56:06 +0000511 input_string = (char *)xrealloc (input_string, size += 128);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000512 remove_unwind_protect ();
513 add_unwind_protect (xfree, input_string);
514 }
Jari Aalto726f6381996-08-26 18:22:31 +0000515
516 /* If the next character is to be accepted verbatim, a backslash
517 newline pair still disappears from the input. */
518 if (pass_next)
519 {
Jari Aalto95732b42005-12-07 14:08:12 +0000520 pass_next = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000521 if (c == '\n')
Jari Aaltof1be6662008-11-18 13:15:12 +0000522 {
523 i--; /* back up over the CTLESC */
524 if (interactive && input_is_tty && raw == 0)
525 print_ps2 = 1;
526 }
Jari Aalto726f6381996-08-26 18:22:31 +0000527 else
Jari Aalto95732b42005-12-07 14:08:12 +0000528 goto add_char;
Jari Aalto726f6381996-08-26 18:22:31 +0000529 continue;
530 }
531
Jari Aalto31859422009-01-12 13:36:28 +0000532 /* This may cause problems if IFS contains CTLESC */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000533 if (c == '\\' && raw == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000534 {
535 pass_next++;
Jari Aalto31859422009-01-12 13:36:28 +0000536 if (skip_ctlesc == 0)
537 {
538 saw_escape++;
539 input_string[i++] = CTLESC;
540 }
Jari Aalto726f6381996-08-26 18:22:31 +0000541 continue;
542 }
543
Jari Aaltof73dda02001-11-13 17:56:06 +0000544 if ((unsigned char)c == delim)
Jari Aalto726f6381996-08-26 18:22:31 +0000545 break;
546
Jari Aalto31859422009-01-12 13:36:28 +0000547 if ((skip_ctlesc == 0 && c == CTLESC) || (skip_ctlnul == 0 && c == CTLNUL))
Jari Aalto726f6381996-08-26 18:22:31 +0000548 {
549 saw_escape++;
550 input_string[i++] = CTLESC;
551 }
552
Jari Aalto95732b42005-12-07 14:08:12 +0000553add_char:
Jari Aalto726f6381996-08-26 18:22:31 +0000554 input_string[i++] = c;
Jari Aalto31859422009-01-12 13:36:28 +0000555
556#if defined (HANDLE_MULTIBYTE)
557 if (nchars > 0 && MB_CUR_MAX > 1)
558 {
559 input_string[i] = '\0'; /* for simplicity and debugging */
560 i += read_mbchar (fd, input_string, i, c, unbuffered_read);
561 }
562#endif
563
Jari Aalto95732b42005-12-07 14:08:12 +0000564 nr++;
Jari Aaltobb706242000-03-17 21:46:59 +0000565
Jari Aalto95732b42005-12-07 14:08:12 +0000566 if (nchars > 0 && nr >= nchars)
Jari Aaltobb706242000-03-17 21:46:59 +0000567 break;
Jari Aalto726f6381996-08-26 18:22:31 +0000568 }
569 input_string[i] = '\0';
570
Jari Aalto7117c2d2002-07-17 14:10:11 +0000571#if 1
572 if (retval < 0)
573 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000574 builtin_error (_("read error: %d: %s"), fd, strerror (errno));
Jari Aalto06285672006-10-10 14:15:34 +0000575 run_unwind_frame ("read_builtin");
Jari Aalto7117c2d2002-07-17 14:10:11 +0000576 return (EXECUTION_FAILURE);
577 }
578#endif
579
Jari Aalto31859422009-01-12 13:36:28 +0000580 if (tmsec > 0 || tmusec > 0)
Jari Aaltobb706242000-03-17 21:46:59 +0000581 reset_alarm ();
582
583 if (nchars > 0 || delim != '\n')
584 {
585#if defined (READLINE)
586 if (edit)
587 {
588 if (nchars > 0)
589 rl_num_chars_to_read = 0;
590 if (delim != '\n')
Jari Aaltof73dda02001-11-13 17:56:06 +0000591 reset_eol_delim ((char *)NULL);
Jari Aaltobb706242000-03-17 21:46:59 +0000592 }
593 else
594#endif
595 if (input_is_tty)
Jari Aalto31859422009-01-12 13:36:28 +0000596 ttyrestore (&termsave);
Jari Aaltobb706242000-03-17 21:46:59 +0000597 }
598 else if (silent)
Jari Aalto31859422009-01-12 13:36:28 +0000599 ttyrestore (&termsave);
Jari Aaltobb706242000-03-17 21:46:59 +0000600
601 if (unbuffered_read == 0)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000602 zsyncfd (fd);
Jari Aaltobb706242000-03-17 21:46:59 +0000603
Jari Aalto726f6381996-08-26 18:22:31 +0000604 discard_unwind_frame ("read_builtin");
605
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000606 retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
Jari Aalto726f6381996-08-26 18:22:31 +0000607
Jari Aalto31859422009-01-12 13:36:28 +0000608assign_vars:
609
Chet Ramey89a92862011-11-21 20:49:12 -0500610 interrupt_immediately--;
611 terminate_immediately--;
612
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000613#if defined (ARRAY_VARS)
614 /* If -a was given, take the string read, break it into a list of words,
615 an assign them to `arrayname' in turn. */
616 if (arrayname)
Jari Aalto726f6381996-08-26 18:22:31 +0000617 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000618 if (legal_identifier (arrayname) == 0)
619 {
620 sh_invalidid (arrayname);
621 xfree (input_string);
622 return (EXECUTION_FAILURE);
623 }
624
Jari Aaltof73dda02001-11-13 17:56:06 +0000625 var = find_or_make_array_variable (arrayname, 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000626 if (var == 0)
Jari Aalto06285672006-10-10 14:15:34 +0000627 {
628 xfree (input_string);
629 return EXECUTION_FAILURE; /* readonly or noassign */
630 }
Jari Aalto7117c2d2002-07-17 14:10:11 +0000631 array_flush (array_cell (var));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000632
633 alist = list_string (input_string, ifs_chars, 0);
634 if (alist)
635 {
Jari Aalto06285672006-10-10 14:15:34 +0000636 if (saw_escape)
637 dequote_list (alist);
638 else
639 word_list_remove_quoted_nulls (alist);
Jari Aalto95732b42005-12-07 14:08:12 +0000640 assign_array_var_from_word_list (var, alist, 0);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000641 dispose_words (alist);
642 }
Jari Aaltod166f041997-06-05 14:59:13 +0000643 xfree (input_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000644 return (retval);
Jari Aalto726f6381996-08-26 18:22:31 +0000645 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000646#endif /* ARRAY_VARS */
Jari Aalto726f6381996-08-26 18:22:31 +0000647
Jari Aaltod166f041997-06-05 14:59:13 +0000648 /* If there are no variables, save the text of the line read to the
649 variable $REPLY. ksh93 strips leading and trailing IFS whitespace,
650 so that `read x ; echo "$x"' and `read ; echo "$REPLY"' behave the
651 same way, but I believe that the difference in behaviors is useful
652 enough to not do it. Without the bash behavior, there is no way
Jari Aalto28ef6c32001-04-06 19:14:31 +0000653 to read a line completely without interpretation or modification
654 unless you mess with $IFS (e.g., setting it to the empty string).
Jari Aaltod166f041997-06-05 14:59:13 +0000655 If you disagree, change the occurrences of `#if 0' to `#if 1' below. */
656 if (list == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000657 {
Jari Aaltod166f041997-06-05 14:59:13 +0000658#if 0
659 orig_input_string = input_string;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000660 for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t); t++)
Jari Aaltod166f041997-06-05 14:59:13 +0000661 ;
662 input_string = t;
663 input_string = strip_trailing_ifs_whitespace (input_string, ifs_chars, saw_escape);
664#endif
665
Jari Aalto726f6381996-08-26 18:22:31 +0000666 if (saw_escape)
667 {
668 t = dequote_string (input_string);
Jari Aalto95732b42005-12-07 14:08:12 +0000669 var = bind_variable ("REPLY", t, 0);
Jari Aalto726f6381996-08-26 18:22:31 +0000670 free (t);
671 }
672 else
Jari Aalto95732b42005-12-07 14:08:12 +0000673 var = bind_variable ("REPLY", input_string, 0);
Jari Aaltobb706242000-03-17 21:46:59 +0000674 VUNSETATTR (var, att_invisible);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000675
Jari Aalto726f6381996-08-26 18:22:31 +0000676 free (input_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000677 return (retval);
Jari Aalto726f6381996-08-26 18:22:31 +0000678 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000679
680 /* This code implements the Posix.2 spec for splitting the words
681 read and assigning them to variables. */
682 orig_input_string = input_string;
683
684 /* Remove IFS white space at the beginning of the input string. If
685 $IFS is null, no field splitting is performed. */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000686 for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t); t++)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000687 ;
688 input_string = t;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000689 for (; list->next; list = list->next)
Jari Aalto726f6381996-08-26 18:22:31 +0000690 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000691 varname = list->word->word;
692#if defined (ARRAY_VARS)
693 if (legal_identifier (varname) == 0 && valid_array_reference (varname) == 0)
694#else
695 if (legal_identifier (varname) == 0)
696#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000697 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000698 sh_invalidid (varname);
Jari Aaltof73dda02001-11-13 17:56:06 +0000699 xfree (orig_input_string);
Jari Aalto726f6381996-08-26 18:22:31 +0000700 return (EXECUTION_FAILURE);
701 }
702
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000703 /* If there are more variables than words read from the input,
704 the remaining variables are set to the empty string. */
705 if (*input_string)
Jari Aalto726f6381996-08-26 18:22:31 +0000706 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000707 /* This call updates INPUT_STRING. */
708 t = get_word_from_string (&input_string, ifs_chars, &e);
709 if (t)
710 *e = '\0';
711 /* Don't bother to remove the CTLESC unless we added one
712 somewhere while reading the string. */
713 if (t && saw_escape)
714 {
715 t1 = dequote_string (t);
716 var = bind_read_variable (varname, t1);
Jari Aaltof73dda02001-11-13 17:56:06 +0000717 xfree (t1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000718 }
719 else
720 var = bind_read_variable (varname, t);
Jari Aalto726f6381996-08-26 18:22:31 +0000721 }
722 else
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000723 {
724 t = (char *)0;
725 var = bind_read_variable (varname, "");
726 }
727
728 FREE (t);
729 if (var == 0)
730 {
Jari Aaltof73dda02001-11-13 17:56:06 +0000731 xfree (orig_input_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000732 return (EXECUTION_FAILURE);
733 }
734
735 stupidly_hack_special_variables (varname);
Jari Aaltobb706242000-03-17 21:46:59 +0000736 VUNSETATTR (var, att_invisible);
Jari Aalto726f6381996-08-26 18:22:31 +0000737 }
738
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000739 /* Now assign the rest of the line to the last variable argument. */
740#if defined (ARRAY_VARS)
741 if (legal_identifier (list->word->word) == 0 && valid_array_reference (list->word->word) == 0)
742#else
743 if (legal_identifier (list->word->word) == 0)
744#endif
745 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000746 sh_invalidid (list->word->word);
Jari Aaltof73dda02001-11-13 17:56:06 +0000747 xfree (orig_input_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000748 return (EXECUTION_FAILURE);
749 }
750
Jari Aalto95732b42005-12-07 14:08:12 +0000751#if 0
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000752 /* This has to be done this way rather than using string_list
753 and list_string because Posix.2 says that the last variable gets the
754 remaining words and their intervening separators. */
755 input_string = strip_trailing_ifs_whitespace (input_string, ifs_chars, saw_escape);
Jari Aalto95732b42005-12-07 14:08:12 +0000756#else
757 /* Check whether or not the number of fields is exactly the same as the
758 number of variables. */
Jari Aaltof1be6662008-11-18 13:15:12 +0000759 tofree = NULL;
Jari Aalto95732b42005-12-07 14:08:12 +0000760 if (*input_string)
761 {
762 t1 = input_string;
763 t = get_word_from_string (&input_string, ifs_chars, &e);
764 if (*input_string == 0)
Jari Aaltof1be6662008-11-18 13:15:12 +0000765 tofree = input_string = t;
Jari Aalto95732b42005-12-07 14:08:12 +0000766 else
Chet Ramey89a92862011-11-21 20:49:12 -0500767 {
768 input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
769 tofree = t;
770 }
Jari Aalto95732b42005-12-07 14:08:12 +0000771 }
772#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000773
774 if (saw_escape)
775 {
776 t = dequote_string (input_string);
777 var = bind_read_variable (list->word->word, t);
Jari Aaltof73dda02001-11-13 17:56:06 +0000778 xfree (t);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000779 }
780 else
781 var = bind_read_variable (list->word->word, input_string);
782 stupidly_hack_special_variables (list->word->word);
Jari Aaltof1be6662008-11-18 13:15:12 +0000783 FREE (tofree);
784
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000785 if (var)
Jari Aaltobb706242000-03-17 21:46:59 +0000786 VUNSETATTR (var, att_invisible);
Jari Aaltof73dda02001-11-13 17:56:06 +0000787 xfree (orig_input_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000788
Jari Aalto726f6381996-08-26 18:22:31 +0000789 return (retval);
790}
791
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000792static SHELL_VAR *
793bind_read_variable (name, value)
794 char *name, *value;
Jari Aalto726f6381996-08-26 18:22:31 +0000795{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000796#if defined (ARRAY_VARS)
797 if (valid_array_reference (name) == 0)
Jari Aalto95732b42005-12-07 14:08:12 +0000798 return (bind_variable (name, value, 0));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000799 else
Jari Aalto95732b42005-12-07 14:08:12 +0000800 return (assign_array_element (name, value, 0));
Jari Aaltof73dda02001-11-13 17:56:06 +0000801#else /* !ARRAY_VARS */
Jari Aalto95732b42005-12-07 14:08:12 +0000802 return bind_variable (name, value, 0);
Jari Aaltof73dda02001-11-13 17:56:06 +0000803#endif /* !ARRAY_VARS */
Jari Aalto726f6381996-08-26 18:22:31 +0000804}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000805
Jari Aalto31859422009-01-12 13:36:28 +0000806#if defined (HANDLE_MULTIBYTE)
807static int
808read_mbchar (fd, string, ind, ch, unbuffered)
809 int fd;
810 char *string;
811 int ind, ch, unbuffered;
812{
813 char mbchar[MB_LEN_MAX + 1];
814 int i, n, r;
815 char c;
816 size_t ret;
817 mbstate_t ps, ps_back;
818 wchar_t wc;
819
820 memset (&ps, '\0', sizeof (mbstate_t));
821 memset (&ps_back, '\0', sizeof (mbstate_t));
822
823 mbchar[0] = ch;
824 i = 1;
825 for (n = 0; n <= MB_LEN_MAX; n++)
826 {
827 ps_back = ps;
828 ret = mbrtowc (&wc, mbchar, i, &ps);
829 if (ret == (size_t)-2)
830 {
831 ps = ps_back;
832 if (unbuffered)
833 r = zread (fd, &c, 1);
834 else
835 r = zreadc (fd, &c);
836 if (r < 0)
837 goto mbchar_return;
838 mbchar[i++] = c;
839 continue;
840 }
841 else if (ret == (size_t)-1 || ret == (size_t)0 || ret > (size_t)0)
842 break;
843 }
844
845mbchar_return:
846 if (i > 1) /* read a multibyte char */
847 /* mbchar[0] is already string[ind-1] */
848 for (r = 1; r < i; r++)
849 string[ind+r-1] = mbchar[r];
850 return i - 1;
851}
852#endif
853
854
855static void
856ttyrestore (ttp)
857 struct ttsave *ttp;
858{
859 ttsetattr (ttp->fd, ttp->attrs);
860}
861
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000862#if defined (READLINE)
Jari Aalto06285672006-10-10 14:15:34 +0000863static rl_completion_func_t *old_attempted_completion_function = 0;
Jari Aalto31859422009-01-12 13:36:28 +0000864static rl_hook_func_t *old_startup_hook;
865static char *deftext;
Jari Aalto06285672006-10-10 14:15:34 +0000866
867static void
868reset_attempted_completion_function (cp)
869 char *cp;
870{
871 if (rl_attempted_completion_function == 0 && old_attempted_completion_function)
872 rl_attempted_completion_function = old_attempted_completion_function;
873}
Jari Aalto7117c2d2002-07-17 14:10:11 +0000874
Jari Aalto31859422009-01-12 13:36:28 +0000875static int
876set_itext ()
877{
878 int r1, r2;
879
880 r1 = r2 = 0;
881 if (old_startup_hook)
882 r1 = (*old_startup_hook) ();
883 if (deftext)
884 {
885 r2 = rl_insert_text (deftext);
886 deftext = (char *)NULL;
887 rl_startup_hook = old_startup_hook;
888 old_startup_hook = (rl_hook_func_t *)NULL;
889 }
890 return (r1 || r2);
891}
892
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000893static char *
Jari Aalto31859422009-01-12 13:36:28 +0000894edit_line (p, itext)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000895 char *p;
Jari Aalto31859422009-01-12 13:36:28 +0000896 char *itext;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000897{
898 char *ret;
899 int len;
900
Jari Aalto95732b42005-12-07 14:08:12 +0000901 if (bash_readline_initialized == 0)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000902 initialize_readline ();
Jari Aalto06285672006-10-10 14:15:34 +0000903
Jari Aalto7117c2d2002-07-17 14:10:11 +0000904 old_attempted_completion_function = rl_attempted_completion_function;
905 rl_attempted_completion_function = (rl_completion_func_t *)NULL;
Jari Aalto31859422009-01-12 13:36:28 +0000906 if (itext)
907 {
908 old_startup_hook = rl_startup_hook;
909 rl_startup_hook = set_itext;
910 deftext = itext;
911 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000912 ret = readline (p);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000913 rl_attempted_completion_function = old_attempted_completion_function;
Jari Aalto06285672006-10-10 14:15:34 +0000914 old_attempted_completion_function = (rl_completion_func_t *)NULL;
915
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000916 if (ret == 0)
917 return ret;
918 len = strlen (ret);
Jari Aaltof73dda02001-11-13 17:56:06 +0000919 ret = (char *)xrealloc (ret, len + 2);
Jari Aaltobb706242000-03-17 21:46:59 +0000920 ret[len++] = delim;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000921 ret[len] = '\0';
922 return ret;
923}
Jari Aaltobb706242000-03-17 21:46:59 +0000924
925static int old_delim_ctype;
Jari Aaltof73dda02001-11-13 17:56:06 +0000926static rl_command_func_t *old_delim_func;
Jari Aaltobb706242000-03-17 21:46:59 +0000927static int old_newline_ctype;
Jari Aaltof73dda02001-11-13 17:56:06 +0000928static rl_command_func_t *old_newline_func;
Jari Aaltobb706242000-03-17 21:46:59 +0000929
Jari Aaltof73dda02001-11-13 17:56:06 +0000930static unsigned char delim_char;
Jari Aaltobb706242000-03-17 21:46:59 +0000931
932static void
933set_eol_delim (c)
934 int c;
935{
936 Keymap cmap;
937
938 if (bash_readline_initialized == 0)
939 initialize_readline ();
940 cmap = rl_get_keymap ();
941
942 /* Change newline to self-insert */
943 old_newline_ctype = cmap[RETURN].type;
944 old_newline_func = cmap[RETURN].function;
945 cmap[RETURN].type = ISFUNC;
946 cmap[RETURN].function = rl_insert;
947
948 /* Bind the delimiter character to accept-line. */
949 old_delim_ctype = cmap[c].type;
950 old_delim_func = cmap[c].function;
951 cmap[c].type = ISFUNC;
952 cmap[c].function = rl_newline;
953
954 delim_char = c;
955}
956
957static void
Jari Aaltof73dda02001-11-13 17:56:06 +0000958reset_eol_delim (cp)
959 char *cp;
Jari Aaltobb706242000-03-17 21:46:59 +0000960{
961 Keymap cmap;
962
963 cmap = rl_get_keymap ();
964
965 cmap[RETURN].type = old_newline_ctype;
966 cmap[RETURN].function = old_newline_func;
967
968 cmap[delim_char].type = old_delim_ctype;
969 cmap[delim_char].function = old_delim_func;
970}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000971#endif