1 This file is read.def
, from which is created read.c.
2 It implements the builtin
"read" in Bush.
4 Copyright (C
) 1987-2020 Free Software Foundation
, Inc.
6 This file is part of GNU Bush
, the Bourne Again SHell.
8 Bush 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.
13 Bush 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.
18 You should have received a copy of the GNU General Public License
19 along with Bush. If not
, see
<http
://www.gnu.org
/licenses
/>.
24 $FUNCTION read_builtin
25 $SHORT_DOC read
[-ers
] [-a array
] [-d delim
] [-i text
] [-n nchars
] [-N nchars
] [-p prompt
] [-t timeout
] [-u fd
] [name ...
]
26 Read a line from the standard input and split it into fields.
28 Reads a single line from the standard input
, or from file descriptor FD
29 if the
-u option is supplied. The line is split into fields as with word
30 splitting
, and the first word is assigned to the first NAME
, the second
31 word to the second NAME
, and so on
, with any leftover words assigned to
32 the last NAME. Only the characters found in $IFS are recognized as word
35 If no NAMEs are supplied
, the line read is stored in the REPLY variable.
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
42 -e use Readline to obtain the line
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
, but honor a delimiter if fewer than
46 NCHARS characters are read before the delimiter
47 -N nchars return only after reading exactly NCHARS characters
, unless
48 EOF is encountered or read times out
, ignoring any
50 -p prompt output the string PROMPT without a trailing newline before
52 -r do not allow backslashes to escape any characters
53 -s do not echo input coming from a terminal
54 -t timeout time out and return failure if a complete line of
55 input is not read within TIMEOUT seconds. The value of the
56 TMOUT variable is the default timeout. TIMEOUT may be a
57 fractional number. If TIMEOUT is
0, read returns
58 immediately
, without trying to read any data
, returning
59 success only if input is available on the specified
60 file descriptor. The exit status is greater than
128
61 if the timeout is exceeded
62 -u fd read from file descriptor FD instead of the standard input
65 The return code is zero
, unless end
-of
-file is encountered
, read times out
66 (in which case it
's greater than 128), a variable assignment error occurs,
67 or an invalid file descriptor is supplied as the argument to -u.
72 #include "bushtypes.h"
73 #include "posixstat.h"
79 #if defined (HAVE_UNISTD_H)
91 #include "../src/bushintl.h"
93 #include "../src/shell.h"
95 #include "bushgetopt.h"
100 #if defined (READLINE)
101 #include "../src/bushline.h"
102 #include <readline/readline.h>
105 #if defined (BUFFERED_INPUT)
109 #include "shmbutil.h"
121 #if defined (READLINE)
122 static void reset_attempted_completion_function PARAMS((char *));
123 static int set_itext PARAMS((void));
124 static char *edit_line PARAMS((char *, char *));
125 static void set_eol_delim PARAMS((int));
126 static void reset_eol_delim PARAMS((char *));
128 static SHELL_VAR *bind_read_variable PARAMS((char *, char *));
129 #if defined (HANDLE_MULTIBYTE)
130 static int read_mbchar PARAMS((int, char *, int, int, int));
132 static void ttyrestore PARAMS((struct ttsave *));
134 static sighandler sigalrm PARAMS((int));
135 static void reset_alarm PARAMS((void));
137 /* Try this to see what the rest of the shell can do with the information. */
141 static int reading, tty_modified;
142 static SigHandler *old_alrm;
143 static unsigned char delim;
145 static struct ttsave termsave;
147 /* In all cases, SIGALRM just sets a flag that we check periodically. This
148 avoids problems with the semi-tricky stuff we do with the xfree of
149 input_string at the top of the unwind-protect list (see below). */
151 /* Set a flag that CHECK_ALRM can check. This relies on zread or read_builtin
152 calling trap.c:check_signals(), which knows about sigalrm_seen and alrmbuf. */
163 /* Cancel alarm before restoring signal handler. */
165 set_signal_handler (SIGALRM, old_alrm);
168 /* Read the value of the shell variables whose names follow.
169 The reading is done from the current input stream, whatever
170 that may be. Successive words of the input line are assigned
171 to the variables mentioned in LIST. The last variable in LIST
172 gets the remainder of the words on the line. If no variables
173 are mentioned in LIST, then the default variable is $REPLY. */
178 register char *varname;
179 int size, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2, nflag;
181 int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
182 int raw, edit, nchars, silent, have_timeout, ignore_delim, fd;
183 int lastsig, t_errno;
185 unsigned int tmsec, tmusec;
189 char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
190 char *e, *t, *t1, *ps2, *tofree;
193 TTYSTRUCT ttattrs, ttset;
194 #if defined (ARRAY_VARS)
198 #if defined (READLINE)
209 USE_VAR(input_is_pipe);
219 #if defined (READLINE)
228 sigalrm_seen = reading = tty_modified = 0;
230 i = 0; /* Index into the string that we are reading. */
231 raw = edit = 0; /* Not reading raw input by default. */
233 arrayname = prompt = (char *)NULL;
234 fd = 0; /* file descriptor to read from */
236 #if defined (READLINE)
237 rlbuf = itext = (char *)0;
241 mb_cur_max = MB_CUR_MAX;
242 tmsec = tmusec = 0; /* no timeout */
243 nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0;
244 delim = '\n'; /* read until newline */
245 ignore_delim = nflag = 0;
247 reset_internal_getopt ();
248 while ((opt = internal_getopt (list, "ersa:d:i:n:p:t:u:N:")) != -1)
256 prompt = list_optarg;
262 #if defined (READLINE)
267 #if defined (READLINE)
271 #if defined (ARRAY_VARS)
273 arrayname = list_optarg;
277 code = uconvert (list_optarg, &ival, &uval, (char **)NULL);
278 if (code == 0 || ival < 0 || uval < 0)
280 builtin_error (_("%s: invalid timeout specification"), list_optarg);
281 return (EXECUTION_FAILURE);
295 code = legal_number (list_optarg, &intval);
296 if (code == 0 || intval < 0 || intval != (int)intval)
298 sh_invalidnum (list_optarg);
299 return (EXECUTION_FAILURE);
305 code = legal_number (list_optarg, &intval);
306 if (code == 0 || intval < 0 || intval != (int)intval)
308 builtin_error (_("%s: invalid file descriptor specification"), list_optarg);
309 return (EXECUTION_FAILURE);
313 if (sh_validfd (fd) == 0)
315 builtin_error (_("%d: invalid file descriptor: %s"), fd, strerror (errno));
316 return (EXECUTION_FAILURE);
320 delim = *list_optarg;
330 /* `read -t 0 var' tests whether input is available with select
/FIONREAD
,
331 and fails if those are unavailable
*/
332 if (have_timeout
&& tmsec
== 0 && tmusec
== 0)
334 return (EXECUTION_FAILURE
);
336 return (input_avail (fd
) ? EXECUTION_SUCCESS
: EXECUTION_FAILURE
);
339 /* Convenience
: check early whether or not the first of possibly several
340 variable names is a valid identifier
, and bail early if so.
*/
341 #if
defined (ARRAY_VARS
)
342 vflags
= assoc_expand_once ?
(VA_NOEXPAND|VA_ONEWORD
) : 0;
343 if (list
&& legal_identifier (list
->word
->word
) == 0 && valid_array_reference (list
->word
->word
, vflags
) == 0)
345 if (list
&& legal_identifier (list
->word
->word
) == 0)
348 sh_invalidid (list
->word
->word
);
349 return (EXECUTION_FAILURE
);
352 /* If we
're asked to ignore the delimiter, make sure we do. */
356 /* IF IFS is unset, we use the default of " \t\n". */
357 ifs_chars = getifs ();
358 if (ifs_chars == 0) /* XXX - shouldn't happen
*/
360 /* If we want to read exactly NCHARS chars
, don
't split on IFS */
363 for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++)
364 skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL;
366 input_string = (char *)xmalloc (size = 112); /* XXX was 128 */
367 input_string[0] = '\
0';
369 /* More input and options validation */
370 if (nflag == 1 && nchars == 0)
372 retval = read (fd, &c, 0);
373 retval = (retval >= 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
374 goto assign_vars; /* bail early if asked to read 0 chars */
377 /* $TMOUT, if set, is the default timeout for read. */
378 if (have_timeout == 0 && (e = get_string_value ("TMOUT")))
380 code = uconvert (e, &ival, &uval, (char **)NULL);
381 if (code == 0 || ival < 0 || uval < 0)
390 begin_unwind_frame ("read_builtin");
392 #if defined (BUFFERED_INPUT)
393 if (interactive == 0 && default_buffered_input >= 0 && fd_is_bush_input (fd))
394 sync_buffered_stream (default_buffered_input);
398 input_is_tty = isatty (fd);
402 if (input_is_tty == 0)
404 input_is_pipe = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
409 /* If the -p, -e or -s flags were given, but input is not coming from the
410 terminal, turn them off. */
411 if ((prompt || edit || silent) && input_is_tty == 0)
413 prompt = (char *)NULL;
414 #if defined (READLINE)
415 itext = (char *)NULL;
420 #if defined (READLINE)
422 add_unwind_protect (xfree, rlbuf);
425 pass_next = 0; /* Non-zero signifies last char was backslash. */
426 saw_escape = 0; /* Non-zero signifies that we saw an escape char */
428 if (tmsec > 0 || tmusec > 0)
430 /* Turn off the timeout if stdin is a regular file (e.g. from
431 input redirection). */
432 if ((fstat (fd, &tsb) < 0) || S_ISREG (tsb.st_mode))
436 if (tmsec > 0 || tmusec > 0)
438 code = setjmp_nosigs (alrmbuf);
442 /* Tricky. The top of the unwind-protect stack is the free of
443 input_string. We want to run all the rest and use input_string,
444 so we have to save input_string temporarily, run the unwind-
445 protects, then restore input_string so we can use it later */
446 orig_input_string = 0;
447 input_string[i] = '\
0'; /* make sure it's terminated
*/
450 t
= (char *)
xmalloc (1);
454 t
= savestring (input_string
);
456 run_unwind_frame ("read_builtin");
458 retval
= 128+SIGALRM
;
461 if (interactive_shell
== 0)
462 initialize_terminating_signals ();
463 old_alrm
= set_signal_handler (SIGALRM
, sigalrm
);
464 add_unwind_protect (reset_alarm
, (char *)NULL
);
465 #if
defined (READLINE
)
468 add_unwind_protect (reset_attempted_completion_function
, (char *)NULL
);
469 add_unwind_protect (bushline_reset_event_hook
, (char *)NULL
);
472 falarm (tmsec
, tmusec
);
475 /* If we
've been asked to read only NCHARS chars, or we're using some
476 character other than newline to terminate the line
, do the right
477 thing to readline or the tty.
*/
478 if (nchars
> 0 || delim
!= '\n')
480 #if
defined (READLINE
)
485 unwind_protect_int (rl_num_chars_to_read
);
486 rl_num_chars_to_read
= nchars
;
490 set_eol_delim (delim
);
491 add_unwind_protect (reset_eol_delim
, (char *)NULL
);
500 ttgetattr (fd
, &ttattrs
);
501 termsave.attrs
= ttattrs
;
504 i
= silent ?
ttfd_cbreak (fd
, &ttset
) : ttfd_onechar (fd
, &ttset
);
508 add_unwind_protect ((Function *)ttyrestore
, (char *)
&termsave
);
509 if (interactive_shell
== 0)
510 initialize_terminating_signals ();
513 else
if (silent
) /* turn off echo but leave term in canonical mode
*/
517 ttgetattr (fd
, &ttattrs
);
518 termsave.attrs
= ttattrs
;
521 i
= ttfd_noecho (fd
, &ttset
); /* ttnoecho (); */
526 add_unwind_protect ((Function *)ttyrestore
, (char *)
&termsave
);
527 if (interactive_shell
== 0)
528 initialize_terminating_signals ();
531 #if
defined (READLINE
)
535 if (bush_readline_initialized
== 0)
536 initialize_readline ();
538 unwind_protect_var (rl_instream
);
539 save_instream
= rl_instream
;
540 rl_instream
= fdopen (fd
, "r");
544 /* This
*must
* be the top unwind
-protect on the stack
, so the manipulation
545 of the unwind
-protect stack after the
realloc() works right.
*/
546 add_unwind_protect (xfree
, input_string
);
549 if ((nchars
> 0) && (input_is_tty
== 0) && ignore_delim
) /* read
-N
*/
551 else
if ((nchars
> 0) ||
(delim
!= '\n') || input_is_pipe
)
554 if (prompt
&& edit
== 0)
556 fprintf (stderr
, "%s", prompt
);
560 #if
defined (__CYGWIN__
) && defined (O_TEXT
)
565 for (print_ps2
= eof
= retval
= 0;;)
569 #if
defined (READLINE
)
572 /* If we have a null delimiter
, don
't treat NULL as ending the line */
573 if (rlbuf && rlbuf[rlind] == '\
0' && delim != '\
0')
581 rlbuf = edit_line (prompt ? prompt : "", itext);
599 ps2 = get_string_value ("PS2");
600 fprintf (stderr, "%s", ps2 ? ps2 : "");
608 if (unbuffered_read == 2)
609 retval = posixly_correct ? zreadintr (fd, &c, 1) : zreadn (fd, &c, nchars - nr);
610 else if (unbuffered_read)
611 retval = posixly_correct ? zreadintr (fd, &c, 1) : zread (fd, &c, 1);
613 retval = posixly_correct ? zreadcintr (fd, &c) : zreadc (fd, &c);
621 if (retval < 0 && errno == EINTR)
623 check_signals (); /* in case we didn't call zread via zreadc
*/
626 lastsig
= trapped_signal_received
;
628 run_pending_traps (); /* because interrupt_immediately is not set
*/
633 if (terminating_signal
&& tty_modified
)
634 ttyrestore (&termsave
); /* fix terminal before exiting
*/
637 errno
= t
; /* preserve it for the error message below
*/
641 QUIT
; /* in case we didn
't call check_signals() */
642 #if defined (READLINE)
646 if (retval <= 0) /* XXX shouldn't happen
*/
649 /* XXX
-- use i
+ mb_cur_max (at least
4) for multibyte
/read_mbchar
*/
650 if (i
+ (mb_cur_max
> 4 ? mb_cur_max
: 4) >= size
)
653 t
= (char *)
xrealloc (input_string
, size
+= 128);
655 /* Only need to change unwind
-protect if input_string changes
*/
656 if (t
!= input_string
)
659 remove_unwind_protect ();
660 add_unwind_protect (xfree
, input_string
);
664 /* If the next character is to be accepted verbatim
, a backslash
665 newline pair still disappears from the input.
*/
671 if (skip_ctlesc
== 0 && i
> 0)
672 i
--; /* back up over the CTLESC
*/
673 if (interactive
&& input_is_tty
&& raw
== 0)
681 /* This may cause problems if IFS contains CTLESC
*/
682 if (c
== '\\' && raw
== 0)
685 if (skip_ctlesc
== 0)
688 input_string
[i
++] = CTLESC
;
693 if (ignore_delim
== 0 && (unsigned char
)c
== delim
)
696 if (c
== '\0' && delim
!= '\0')
697 continue
; /* skip NUL bytes in input
*/
699 if ((skip_ctlesc
== 0 && c
== CTLESC
) ||
(skip_ctlnul
== 0 && c
== CTLNUL
))
702 input_string
[i
++] = CTLESC
;
706 input_string
[i
++] = c
;
709 #if
defined (HANDLE_MULTIBYTE
)
710 /* XXX
- what if C
== 127? Can DEL introduce a multibyte sequence?
*/
711 if (mb_cur_max
> 1 && is_basic (c
) == 0)
713 input_string
[i
] = '\0'; /* for simplicity and debugging
*/
714 /* If we got input from readline
, grab the next multibyte char from
716 # if
defined (READLINE
)
720 clen
= mbrlen (rlbuf
+ rlind
- 1, mb_cur_max
, (mbstate_t *)NULL
);
721 /* We only deal with valid multibyte sequences longer than one
722 byte. If we get anything else
, we leave the one character
723 copied and move on to the next.
*/
726 memcpy (input_string
+i
, rlbuf
+rlind
, clen
-1);
733 if (locale_utf8locale
== 0 ||
((c
& 0x80) != 0))
734 i
+= read_mbchar (fd
, input_string
, i
, c
, unbuffered_read
);
740 if (nchars
> 0 && nr
>= nchars
)
743 input_string
[i
] = '\0';
746 #if
defined (READLINE
)
755 builtin_error (_("read error: %d: %s"), fd
, strerror (errno
));
756 run_unwind_frame ("read_builtin");
757 return ((t_errno
!= EINTR
) ? EXECUTION_FAILURE
: 128+lastsig
);
760 if (tmsec
> 0 || tmusec
> 0)
763 if (nchars
> 0 || delim
!= '\n')
765 #if
defined (READLINE
)
769 rl_num_chars_to_read
= 0;
771 reset_eol_delim ((char *)NULL
);
776 ttyrestore (&termsave
);
779 ttyrestore (&termsave
);
781 if (unbuffered_read
== 0)
784 #if
defined (READLINE
)
786 rl_instream
= save_instream
; /* can
't portably free it */
789 discard_unwind_frame ("read_builtin");
791 retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
795 #if defined (ARRAY_VARS)
796 /* If -a was given, take the string read, break it into a list of words,
797 an assign them to `arrayname' in turn.
*/
800 if (legal_identifier (arrayname
) == 0)
802 sh_invalidid (arrayname
);
804 return (EXECUTION_FAILURE
);
807 var
= find_or_make_array_variable (arrayname
, 1);
811 return EXECUTION_FAILURE
; /* readonly or noassign
*/
815 builtin_error (_("%s: cannot convert associative to indexed array"), arrayname
);
817 return EXECUTION_FAILURE
; /* existing associative array
*/
819 else
if (invisible_p (var
))
820 VUNSETATTR (var
, att_invisible
);
821 array_flush (array_cell (var
));
823 alist
= list_string (input_string
, ifs_chars
, 0);
827 dequote_list (alist
);
829 word_list_remove_quoted_nulls (alist
);
830 assign_array_var_from_word_list (var
, alist
, 0);
831 dispose_words (alist
);
836 #endif
/* ARRAY_VARS
*/
838 /* If there are no variables
, save the text of the line read to the
839 variable $REPLY. ksh93 strips leading and trailing IFS whitespace
,
840 so that `read x
; echo
"$x"' and `read ; echo "$REPLY"' behave the
841 same way
, but I believe that the difference in behaviors is useful
842 enough to not do it. Without the bush behavior
, there is no way
843 to read a line completely without interpretation or modification
844 unless you mess with $
IFS (e.g.
, setting it to the empty string
).
845 If you disagree
, change the occurrences of `#if
0' to `#if 1' below.
*/
849 orig_input_string
= input_string
;
850 for (t
= input_string
; ifs_chars
&& *ifs_chars
&& spctabnl(*t) && isifs(*t); t++)
853 input_string = strip_trailing_ifs_whitespace (input_string, ifs_chars, saw_escape);
858 t = dequote_string (input_string);
859 var = bind_variable ("REPLY", t, 0);
863 var = bind_variable ("REPLY", input_string, 0);
864 if (var == 0 || readonly_p (var) || noassign_p (var))
865 retval = EXECUTION_FAILURE;
867 VUNSETATTR (var, att_invisible);
873 /* This code implements the Posix.2 spec for splitting the words
874 read and assigning them to variables. */
875 orig_input_string = input_string;
877 /* Remove IFS white space at the beginning of the input string. If
878 $IFS is null, no field splitting is performed. */
879 for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t); t++)
882 for (; list->next; list = list->next)
884 varname = list->word->word;
885 #if defined (ARRAY_VARS)
886 if (legal_identifier (varname) == 0 && valid_array_reference (varname, vflags) == 0)
888 if (legal_identifier (varname) == 0)
891 sh_invalidid (varname);
892 free (orig_input_string);
893 return (EXECUTION_FAILURE);
896 /* If there are more variables than words read from the input,
897 the remaining variables are set to the empty string. */
900 /* This call updates INPUT_STRING. */
901 t = get_word_from_string (&input_string, ifs_chars, &e);
904 /* Don't bother to remove the CTLESC unless we added one
905 somewhere while reading the string. */
908 t1 = dequote_string (t);
909 var = bind_read_variable (varname, t1);
913 var = bind_read_variable (varname, t ? t : "");
918 var
= bind_read_variable (varname
, "");
924 free (orig_input_string
);
925 return (EXECUTION_FAILURE
);
928 stupidly_hack_special_variables (varname
);
929 VUNSETATTR (var
, att_invisible
);
932 /* Now assign the rest of the line to the last variable argument.
*/
933 #if
defined (ARRAY_VARS
)
934 if (legal_identifier (list
->word
->word
) == 0 && valid_array_reference (list
->word
->word
, vflags
) == 0)
936 if (legal_identifier (list
->word
->word
) == 0)
939 sh_invalidid (list
->word
->word
);
940 free (orig_input_string
);
941 return (EXECUTION_FAILURE
);
945 /* This has to be done this way rather than using string_list
946 and list_string because Posix
.2 says that the last variable gets the
947 remaining words and their intervening separators.
*/
948 input_string
= strip_trailing_ifs_whitespace (input_string
, ifs_chars
, saw_escape
);
950 /* Check whether or not the number of fields is exactly the same as the
951 number of variables.
*/
956 t = get_word_from_string (&input_string, ifs_chars, &e);
957 if (*input_string == 0)
958 tofree = input_string = t;
961 input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
967 if (saw_escape && input_string && *input_string)
969 t = dequote_string (input_string);
970 var = bind_read_variable (list->word->word, t);
974 var = bind_read_variable (list->word->word, input_string ? input_string : "");
978 stupidly_hack_special_variables (list->word->word);
979 VUNSETATTR (var, att_invisible);
982 retval = EXECUTION_FAILURE;
985 free (orig_input_string);
991 bind_read_variable (name, value)
996 v = builtin_bind_variable (name, value, 0);
998 : ((readonly_p (v) || noassign_p (v)) ? (SHELL_VAR *)NULL
: v
));
1001 #if
defined (HANDLE_MULTIBYTE
)
1003 read_mbchar (fd
, string
, ind
, ch
, unbuffered
)
1006 int ind
, ch
, unbuffered
;
1008 char mbchar
[MB_LEN_MAX
+ 1];
1012 mbstate_t ps
, ps_back
;
1015 memset (&ps
, '\0', sizeof (mbstate_t
));
1016 memset (&ps_back
, '\0', sizeof (mbstate_t
));
1020 for (n
= 0; n
<= MB_LEN_MAX
; n
++)
1023 ret
= mbrtowc (&wc
, mbchar
, i
, &ps
);
1024 if (ret
== (size_t
)-2)
1028 /* We don
't want to be interrupted during a multibyte char read */
1029 if (unbuffered == 2)
1030 r = zreadn (fd, &c, 1);
1031 else if (unbuffered)
1032 r = zread (fd, &c, 1);
1034 r = zreadc (fd, &c);
1040 else if (ret == (size_t)-1 || ret == (size_t)0 || ret > (size_t)0)
1045 if (i > 1) /* read a multibyte char */
1046 /* mbchar[0] is already string[ind-1] */
1047 for (r = 1; r < i; r++)
1048 string[ind+r-1] = mbchar[r];
1058 ttsetattr (ttp->fd, &(ttp->attrs));
1066 ttyrestore (&termsave);
1070 read_tty_modified ()
1072 return (tty_modified);
1075 #if defined (READLINE)
1076 static rl_completion_func_t *old_attempted_completion_function = 0;
1077 static rl_hook_func_t *old_startup_hook;
1078 static char *deftext;
1081 reset_attempted_completion_function (cp)
1084 if (rl_attempted_completion_function == 0 && old_attempted_completion_function)
1085 rl_attempted_completion_function = old_attempted_completion_function;
1094 if (old_startup_hook)
1095 r1 = (*old_startup_hook) ();
1098 r2 = rl_insert_text (deftext);
1099 deftext = (char *)NULL;
1100 rl_startup_hook = old_startup_hook;
1101 old_startup_hook = (rl_hook_func_t *)NULL;
1107 edit_line (p, itext)
1114 if (bush_readline_initialized == 0)
1115 initialize_readline ();
1117 old_attempted_completion_function = rl_attempted_completion_function;
1118 rl_attempted_completion_function = (rl_completion_func_t *)NULL;
1119 bushline_set_event_hook ();
1122 old_startup_hook = rl_startup_hook;
1123 rl_startup_hook = set_itext;
1129 rl_attempted_completion_function = old_attempted_completion_function;
1130 old_attempted_completion_function = (rl_completion_func_t *)NULL;
1131 bushline_reset_event_hook ();
1136 ret = (char *)xrealloc (ret, len + 2);
1142 static int old_delim_ctype;
1143 static rl_command_func_t *old_delim_func;
1144 static int old_newline_ctype;
1145 static rl_command_func_t *old_newline_func;
1147 static unsigned char delim_char;
1155 if (bush_readline_initialized == 0)
1156 initialize_readline ();
1157 cmap = rl_get_keymap ();
1159 /* Save the old delimiter char binding */
1160 old_newline_ctype = cmap[RETURN].type;
1161 old_newline_func = cmap[RETURN].function;
1162 old_delim_ctype = cmap[c].type;
1163 old_delim_func = cmap[c].function;
1165 /* Change newline to self-insert */
1166 cmap[RETURN].type = ISFUNC;
1167 cmap[RETURN].function = rl_insert;
1169 /* Bind the delimiter character to accept-line. */
1170 cmap[c].type = ISFUNC;
1171 cmap[c].function = rl_newline;
1177 reset_eol_delim (cp)
1182 cmap = rl_get_keymap ();
1184 cmap[RETURN].type = old_newline_ctype;
1185 cmap[RETURN].function = old_newline_func;
1187 cmap[delim_char].type = old_delim_ctype;
1188 cmap[delim_char].function = old_delim_func;