Home | History | Annotate | Line # | Download | only in libedit
read.c revision 1.4
      1  1.4  christos /*	$NetBSD: read.c,v 1.4 1997/04/11 17:52:47 christos Exp $	*/
      2  1.2     lukem 
      3  1.1       cgd /*-
      4  1.1       cgd  * Copyright (c) 1992, 1993
      5  1.1       cgd  *	The Regents of the University of California.  All rights reserved.
      6  1.1       cgd  *
      7  1.1       cgd  * This code is derived from software contributed to Berkeley by
      8  1.1       cgd  * Christos Zoulas of Cornell University.
      9  1.1       cgd  *
     10  1.1       cgd  * Redistribution and use in source and binary forms, with or without
     11  1.1       cgd  * modification, are permitted provided that the following conditions
     12  1.1       cgd  * are met:
     13  1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     14  1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     15  1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     17  1.1       cgd  *    documentation and/or other materials provided with the distribution.
     18  1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     19  1.1       cgd  *    must display the following acknowledgement:
     20  1.1       cgd  *	This product includes software developed by the University of
     21  1.1       cgd  *	California, Berkeley and its contributors.
     22  1.1       cgd  * 4. Neither the name of the University nor the names of its contributors
     23  1.1       cgd  *    may be used to endorse or promote products derived from this software
     24  1.1       cgd  *    without specific prior written permission.
     25  1.1       cgd  *
     26  1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27  1.1       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28  1.1       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  1.1       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30  1.1       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31  1.1       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32  1.1       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33  1.1       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34  1.1       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35  1.1       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36  1.1       cgd  * SUCH DAMAGE.
     37  1.1       cgd  */
     38  1.1       cgd 
     39  1.1       cgd #if !defined(lint) && !defined(SCCSID)
     40  1.2     lukem #if 0
     41  1.1       cgd static char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/4/93";
     42  1.2     lukem #else
     43  1.4  christos static char rcsid[] = "$NetBSD: read.c,v 1.4 1997/04/11 17:52:47 christos Exp $";
     44  1.2     lukem #endif
     45  1.2     lukem #endif /* not lint && not SCCSID */
     46  1.1       cgd 
     47  1.1       cgd /*
     48  1.1       cgd  * read.c: Clean this junk up! This is horrible code.
     49  1.1       cgd  *	   Terminal read functions
     50  1.1       cgd  */
     51  1.1       cgd #include "sys.h"
     52  1.1       cgd #include <sys/errno.h>
     53  1.1       cgd #include <unistd.h>
     54  1.1       cgd #include <stdlib.h>
     55  1.1       cgd extern int errno;
     56  1.1       cgd #include "el.h"
     57  1.1       cgd 
     58  1.1       cgd #define OKCMD -1
     59  1.1       cgd 
     60  1.1       cgd private int read__fixio		__P((int, int));
     61  1.1       cgd private int read_preread	__P((EditLine *));
     62  1.1       cgd private int read_getcmd		__P((EditLine *, el_action_t *, char *));
     63  1.1       cgd 
     64  1.1       cgd #ifdef DEBUG_EDIT
     65  1.1       cgd private void
     66  1.1       cgd read_debug(el)
     67  1.1       cgd     EditLine *el;
     68  1.1       cgd {
     69  1.1       cgd 
     70  1.1       cgd     if (el->el_line.cursor > el->el_line.lastchar)
     71  1.1       cgd 	(void) fprintf(el->el_errfile, "cursor > lastchar\r\n");
     72  1.1       cgd     if (el->el_line.cursor < el->el_line.buffer)
     73  1.1       cgd 	(void) fprintf(el->el_errfile, "cursor < buffer\r\n");
     74  1.1       cgd     if (el->el_line.cursor > el->el_line.limit)
     75  1.1       cgd 	(void) fprintf(el->el_errfile, "cursor > limit\r\n");
     76  1.1       cgd     if (el->el_line.lastchar > el->el_line.limit)
     77  1.1       cgd 	(void) fprintf(el->el_errfile, "lastchar > limit\r\n");
     78  1.1       cgd     if (el->el_line.limit != &el->el_line.buffer[EL_BUFSIZ - 2])
     79  1.1       cgd 	(void) fprintf(el->el_errfile, "limit != &buffer[EL_BUFSIZ-2]\r\n");
     80  1.1       cgd }
     81  1.1       cgd #endif /* DEBUG_EDIT */
     82  1.1       cgd 
     83  1.1       cgd /* read__fixio():
     84  1.1       cgd  *	Try to recover from a read error
     85  1.1       cgd  */
     86  1.1       cgd private int
     87  1.1       cgd read__fixio(fd, e)
     88  1.1       cgd     int fd, e;
     89  1.1       cgd {
     90  1.1       cgd     switch (e) {
     91  1.1       cgd     case -1:	/* Make sure that the code is reachable */
     92  1.1       cgd 
     93  1.1       cgd #ifdef EWOULDBLOCK
     94  1.1       cgd     case EWOULDBLOCK:
     95  1.4  christos # ifndef TRY_AGAIN
     96  1.4  christos #  define TRY_AGAIN
     97  1.4  christos # endif
     98  1.1       cgd #endif /* EWOULDBLOCK */
     99  1.1       cgd 
    100  1.1       cgd #if defined(POSIX) && defined(EAGAIN)
    101  1.1       cgd # if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
    102  1.1       cgd     case EAGAIN:
    103  1.4  christos #  ifndef TRY_AGAIN
    104  1.4  christos #   define TRY_AGAIN
    105  1.4  christos #  endif
    106  1.1       cgd # endif /* EWOULDBLOCK && EWOULDBLOCK != EAGAIN */
    107  1.1       cgd #endif /* POSIX && EAGAIN */
    108  1.1       cgd 
    109  1.1       cgd 	e = 0;
    110  1.1       cgd #ifdef TRY_AGAIN
    111  1.1       cgd # if defined(F_SETFL) && defined(O_NDELAY)
    112  1.1       cgd 	if ((e = fcntl(fd, F_GETFL, 0)) == -1)
    113  1.1       cgd 	    return -1;
    114  1.1       cgd 
    115  1.1       cgd 	if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1)
    116  1.1       cgd 	    return -1;
    117  1.1       cgd 	else
    118  1.1       cgd 	    e = 1;
    119  1.1       cgd # endif /* F_SETFL && O_NDELAY */
    120  1.1       cgd 
    121  1.1       cgd # ifdef FIONBIO
    122  1.1       cgd 	if (ioctl(fd, FIONBIO, (ioctl_t) &e) == -1)
    123  1.1       cgd 	    return -1;
    124  1.1       cgd 	else
    125  1.1       cgd 	    e = 1;
    126  1.1       cgd # endif	/* FIONBIO */
    127  1.1       cgd 
    128  1.1       cgd #endif /* TRY_AGAIN */
    129  1.1       cgd 	return e ? 0 : -1;
    130  1.1       cgd 
    131  1.1       cgd     case EINTR:
    132  1.1       cgd 	return 0;
    133  1.1       cgd 
    134  1.1       cgd     default:
    135  1.1       cgd 	return -1;
    136  1.1       cgd     }
    137  1.1       cgd }
    138  1.1       cgd 
    139  1.1       cgd 
    140  1.1       cgd /* read_preread():
    141  1.1       cgd  *	Try to read the stuff in the input queue;
    142  1.1       cgd  */
    143  1.1       cgd private int
    144  1.1       cgd read_preread(el)
    145  1.1       cgd     EditLine *el;
    146  1.1       cgd {
    147  1.1       cgd     int    chrs = 0;
    148  1.1       cgd 
    149  1.1       cgd     if (el->el_chared.c_macro.nline) {
    150  1.1       cgd 	el_free((ptr_t) el->el_chared.c_macro.nline);
    151  1.1       cgd 	el->el_chared.c_macro.nline = NULL;
    152  1.1       cgd     }
    153  1.1       cgd 
    154  1.1       cgd     if (el->el_tty.t_mode == ED_IO)
    155  1.1       cgd 	return 0;
    156  1.1       cgd 
    157  1.1       cgd #ifdef FIONREAD
    158  1.1       cgd     (void) ioctl(el->el_infd, FIONREAD, (ioctl_t) &chrs);
    159  1.1       cgd     if (chrs > 0) {
    160  1.1       cgd 	char    buf[EL_BUFSIZ];
    161  1.1       cgd 
    162  1.1       cgd 	chrs = read(el->el_infd, buf, (size_t) MIN(chrs, EL_BUFSIZ - 1));
    163  1.1       cgd 	if (chrs > 0) {
    164  1.1       cgd 	    buf[chrs] = '\0';
    165  1.1       cgd 	    el->el_chared.c_macro.nline = strdup(buf);
    166  1.1       cgd 	    el_push(el->el_chared.c_macro.nline);
    167  1.1       cgd 	}
    168  1.1       cgd     }
    169  1.1       cgd #endif  /* FIONREAD */
    170  1.1       cgd 
    171  1.1       cgd     return chrs > 0;
    172  1.1       cgd }
    173  1.1       cgd 
    174  1.1       cgd 
    175  1.1       cgd /* el_push():
    176  1.1       cgd  *	Push a macro
    177  1.1       cgd  */
    178  1.1       cgd public void
    179  1.1       cgd el_push(el, str)
    180  1.1       cgd     EditLine *el;
    181  1.1       cgd     const char   *str;
    182  1.1       cgd {
    183  1.1       cgd     c_macro_t *ma = &el->el_chared.c_macro;
    184  1.1       cgd 
    185  1.1       cgd     if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
    186  1.1       cgd 	ma->level++;
    187  1.1       cgd 	ma->macro[ma->level] = (char *) str;
    188  1.1       cgd     }
    189  1.1       cgd     else {
    190  1.1       cgd 	term_beep(el);
    191  1.1       cgd 	term__flush();
    192  1.1       cgd     }
    193  1.1       cgd }
    194  1.1       cgd 
    195  1.1       cgd 
    196  1.1       cgd /* read_getcmd():
    197  1.1       cgd  *	Return next command from the input stream.
    198  1.1       cgd  */
    199  1.1       cgd private int
    200  1.1       cgd read_getcmd(el, cmdnum, ch)
    201  1.1       cgd     EditLine *el;
    202  1.1       cgd     el_action_t *cmdnum;
    203  1.1       cgd     char *ch;
    204  1.1       cgd {
    205  1.1       cgd     el_action_t  cmd = 0;
    206  1.1       cgd     int     num;
    207  1.1       cgd 
    208  1.1       cgd     while (cmd == 0 || cmd == ED_SEQUENCE_LEAD_IN) {
    209  1.1       cgd 	if ((num = el_getc(el, ch)) != 1)	/* if EOF or error */
    210  1.1       cgd 	    return num;
    211  1.1       cgd 
    212  1.1       cgd #ifdef	KANJI
    213  1.1       cgd 	if ((*ch & 0200)) {
    214  1.1       cgd 	    el->el_state.metanext = 0;
    215  1.1       cgd 	    cmd = CcViMap[' '];
    216  1.1       cgd 	    break;
    217  1.1       cgd 	}
    218  1.1       cgd 	else
    219  1.1       cgd #endif /* KANJI */
    220  1.1       cgd 
    221  1.1       cgd 	if (el->el_state.metanext) {
    222  1.1       cgd 	    el->el_state.metanext = 0;
    223  1.1       cgd 	    *ch |= 0200;
    224  1.1       cgd 	}
    225  1.1       cgd 	cmd = el->el_map.current[(unsigned char) *ch];
    226  1.1       cgd 	if (cmd == ED_SEQUENCE_LEAD_IN) {
    227  1.1       cgd 	    key_value_t val;
    228  1.1       cgd 	    switch (key_get(el, ch, &val)) {
    229  1.1       cgd 	    case XK_CMD:
    230  1.1       cgd 		cmd = val.cmd;
    231  1.1       cgd 		break;
    232  1.1       cgd 	    case XK_STR:
    233  1.1       cgd 		el_push(el, val.str);
    234  1.1       cgd 		break;
    235  1.1       cgd #ifdef notyet
    236  1.1       cgd 	    case XK_EXE:
    237  1.1       cgd 		/* XXX: In the future to run a user function */
    238  1.1       cgd 		RunCommand(val.str);
    239  1.1       cgd 		break;
    240  1.1       cgd #endif
    241  1.1       cgd 	    default:
    242  1.1       cgd 		abort();
    243  1.1       cgd 		break;
    244  1.1       cgd 	    }
    245  1.1       cgd 	}
    246  1.1       cgd 	if (el->el_map.alt == NULL)
    247  1.1       cgd 	    el->el_map.current = el->el_map.key;
    248  1.1       cgd     }
    249  1.1       cgd     *cmdnum = cmd;
    250  1.1       cgd     return OKCMD;
    251  1.1       cgd }
    252  1.1       cgd 
    253  1.1       cgd 
    254  1.1       cgd /* el_getc():
    255  1.1       cgd  *	Read a character
    256  1.1       cgd  */
    257  1.1       cgd public int
    258  1.1       cgd el_getc(el, cp)
    259  1.1       cgd     EditLine *el;
    260  1.1       cgd     char *cp;
    261  1.1       cgd {
    262  1.1       cgd     int num_read;
    263  1.1       cgd     unsigned char tcp;
    264  1.1       cgd     int tried = 0;
    265  1.1       cgd 
    266  1.1       cgd     c_macro_t *ma = &el->el_chared.c_macro;
    267  1.1       cgd 
    268  1.1       cgd     term__flush();
    269  1.1       cgd     for (;;) {
    270  1.1       cgd 	if (ma->level < 0) {
    271  1.1       cgd 	    if (!read_preread(el))
    272  1.1       cgd 		break;
    273  1.1       cgd 	}
    274  1.1       cgd 	if (ma->level < 0)
    275  1.1       cgd 	    break;
    276  1.1       cgd 
    277  1.1       cgd 	if (*ma->macro[ma->level] == 0) {
    278  1.1       cgd 	    ma->level--;
    279  1.1       cgd 	    continue;
    280  1.1       cgd 	}
    281  1.1       cgd 	*cp = *ma->macro[ma->level]++ & 0377;
    282  1.1       cgd 	if (*ma->macro[ma->level] == 0) {	/* Needed for QuoteMode On */
    283  1.1       cgd 	    ma->level--;
    284  1.1       cgd 	}
    285  1.1       cgd 	return 1;
    286  1.1       cgd     }
    287  1.1       cgd 
    288  1.1       cgd #ifdef DEBUG_READ
    289  1.1       cgd     (void) fprintf(el->el_errfile, "Turning raw mode on\n");
    290  1.1       cgd #endif /* DEBUG_READ */
    291  1.1       cgd     if (tty_rawmode(el) < 0)	/* make sure the tty is set up correctly */
    292  1.1       cgd 	return 0;
    293  1.1       cgd 
    294  1.1       cgd #ifdef DEBUG_READ
    295  1.1       cgd     (void) fprintf(el->el_errfile, "Reading a character\n");
    296  1.1       cgd #endif /* DEBUG_READ */
    297  1.1       cgd     while ((num_read = read(el->el_infd, (char *) &tcp, 1)) == -1)
    298  1.1       cgd 	if (!tried && read__fixio(el->el_infd, errno) == 0)
    299  1.1       cgd 	    tried = 1;
    300  1.1       cgd 	else {
    301  1.1       cgd 	    *cp = '\0';
    302  1.1       cgd 	    return -1;
    303  1.1       cgd 	}
    304  1.1       cgd #ifdef DEBUG_READ
    305  1.1       cgd     (void) fprintf(el->el_errfile, "Got it %c\n", tcp);
    306  1.1       cgd #endif /* DEBUG_READ */
    307  1.1       cgd     *cp = tcp;
    308  1.1       cgd     return num_read;
    309  1.1       cgd }
    310  1.1       cgd 
    311  1.1       cgd 
    312  1.1       cgd 
    313  1.1       cgd public const char *
    314  1.1       cgd el_gets(el, nread)
    315  1.1       cgd     EditLine *el;
    316  1.1       cgd     int *nread;
    317  1.1       cgd {
    318  1.1       cgd     int retval;
    319  1.1       cgd     el_action_t  cmdnum = 0;
    320  1.1       cgd     int     num;		/* how many chars we have read at NL */
    321  1.1       cgd     char    ch;
    322  1.1       cgd 
    323  1.1       cgd     if (el->el_flags & HANDLE_SIGNALS)
    324  1.1       cgd 	sig_set(el);
    325  1.1       cgd 
    326  1.1       cgd     re_clear_display(el);		/* reset the display stuff */
    327  1.1       cgd     ch_reset(el);
    328  1.1       cgd 
    329  1.1       cgd #ifdef FIONREAD
    330  1.1       cgd     if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
    331  1.1       cgd 	long    chrs = 0;
    332  1.1       cgd 
    333  1.1       cgd 	(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) &chrs);
    334  1.1       cgd 	if (chrs == 0) {
    335  1.1       cgd 	    if (tty_rawmode(el) < 0) {
    336  1.1       cgd 		if (nread)
    337  1.1       cgd 			*nread = 0;
    338  1.1       cgd 		return NULL;
    339  1.1       cgd 	    }
    340  1.1       cgd 	}
    341  1.1       cgd     }
    342  1.1       cgd #endif /* FIONREAD */
    343  1.1       cgd 
    344  1.1       cgd     re_refresh(el);			/* print the prompt */
    345  1.1       cgd 
    346  1.1       cgd     for (num = OKCMD; num == OKCMD;) {	/* while still editing this line */
    347  1.1       cgd #ifdef DEBUG_EDIT
    348  1.1       cgd 	read_debug(el);
    349  1.1       cgd #endif /* DEBUG_EDIT */
    350  1.1       cgd 	/* if EOF or error */
    351  1.1       cgd 	if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
    352  1.1       cgd #ifdef DEBUG_READ
    353  1.1       cgd 	    (void) fprintf(el->el_errfile, "Returning from el_gets %d\n", num);
    354  1.1       cgd #endif /* DEBUG_READ */
    355  1.1       cgd 	    break;
    356  1.1       cgd 	}
    357  1.1       cgd 
    358  1.1       cgd 	if (cmdnum >= el->el_map.nfunc) {	/* BUG CHECK command */
    359  1.1       cgd #ifdef DEBUG_EDIT
    360  1.1       cgd 	    (void) fprintf(el->el_errfile,
    361  1.1       cgd 			   "ERROR: illegal command from key 0%o\r\n", ch);
    362  1.1       cgd #endif /* DEBUG_EDIT */
    363  1.1       cgd 	    continue;		/* try again */
    364  1.1       cgd 	}
    365  1.1       cgd 
    366  1.1       cgd 	/* now do the real command */
    367  1.1       cgd #ifdef DEBUG_READ
    368  1.1       cgd 	{
    369  1.1       cgd 	    el_bindings_t *b;
    370  1.1       cgd 	    for (b = el->el_map.help; b->name; b++)
    371  1.1       cgd 		if (b->func == cmdnum)
    372  1.1       cgd 		    break;
    373  1.1       cgd 	    if (b->name)
    374  1.1       cgd 		(void) fprintf(el->el_errfile, "Executing %s\n", b->name);
    375  1.1       cgd 	    else
    376  1.1       cgd 		(void) fprintf(el->el_errfile, "Error command = %d\n", cmdnum);
    377  1.1       cgd 	}
    378  1.1       cgd #endif /* DEBUG_READ */
    379  1.1       cgd 	retval = (*el->el_map.func[cmdnum])(el, ch);
    380  1.1       cgd 
    381  1.1       cgd 	/* save the last command here */
    382  1.1       cgd 	el->el_state.lastcmd = cmdnum;
    383  1.1       cgd 
    384  1.1       cgd 	/* use any return value */
    385  1.1       cgd 	switch (retval) {
    386  1.1       cgd 	case CC_CURSOR:
    387  1.1       cgd 	    el->el_state.argument = 1;
    388  1.1       cgd 	    el->el_state.doingarg = 0;
    389  1.1       cgd 	    re_refresh_cursor(el);
    390  1.1       cgd 	    break;
    391  1.3     lukem 
    392  1.3     lukem 	case CC_REDISPLAY:
    393  1.3     lukem 	    re_clear_lines(el);
    394  1.3     lukem 	    re_clear_display(el);
    395  1.3     lukem 		/* FALLTHROUGH */
    396  1.1       cgd 
    397  1.1       cgd 	case CC_REFRESH:
    398  1.1       cgd 	    el->el_state.argument = 1;
    399  1.1       cgd 	    el->el_state.doingarg = 0;
    400  1.1       cgd 	    re_refresh(el);
    401  1.1       cgd 	    break;
    402  1.1       cgd 
    403  1.1       cgd 	case CC_NORM:		/* normal char */
    404  1.1       cgd 	    el->el_state.argument = 1;
    405  1.1       cgd 	    el->el_state.doingarg = 0;
    406  1.1       cgd 	    break;
    407  1.1       cgd 
    408  1.1       cgd 	case CC_ARGHACK:	/* Suggested by Rich Salz */
    409  1.1       cgd 	    /* <rsalz (at) pineapple.bbn.com> */
    410  1.1       cgd 	    break;		/* keep going... */
    411  1.1       cgd 
    412  1.1       cgd 	case CC_EOF:		/* end of file typed */
    413  1.1       cgd 	    num = 0;
    414  1.1       cgd 	    break;
    415  1.1       cgd 
    416  1.1       cgd 	case CC_NEWLINE:	/* normal end of line */
    417  1.1       cgd 	    num = el->el_line.lastchar - el->el_line.buffer;
    418  1.1       cgd 	    break;
    419  1.1       cgd 
    420  1.1       cgd 	case CC_FATAL:		/* fatal error, reset to known state */
    421  1.1       cgd #ifdef DEBUG_READ
    422  1.1       cgd 	    (void) fprintf(el->el_errfile, "*** editor fatal ERROR ***\r\n\n");
    423  1.1       cgd #endif /* DEBUG_READ */
    424  1.1       cgd 	    /* put (real) cursor in a known place */
    425  1.1       cgd 	    re_clear_display(el);	/* reset the display stuff */
    426  1.1       cgd 	    ch_reset(el);		/* reset the input pointers */
    427  1.1       cgd 	    re_refresh(el);		/* print the prompt again */
    428  1.1       cgd 	    el->el_state.argument = 1;
    429  1.1       cgd 	    el->el_state.doingarg = 0;
    430  1.1       cgd 	    break;
    431  1.1       cgd 
    432  1.1       cgd 	case CC_ERROR:
    433  1.1       cgd 	default:		/* functions we don't know about */
    434  1.1       cgd #ifdef DEBUG_READ
    435  1.1       cgd 	    (void) fprintf(el->el_errfile, "*** editor ERROR ***\r\n\n");
    436  1.1       cgd #endif /* DEBUG_READ */
    437  1.1       cgd 	    el->el_state.argument = 1;
    438  1.1       cgd 	    el->el_state.doingarg = 0;
    439  1.1       cgd 	    term_beep(el);
    440  1.1       cgd 	    term__flush();
    441  1.1       cgd 	    break;
    442  1.1       cgd 	}
    443  1.1       cgd     }
    444  1.1       cgd 
    445  1.1       cgd     (void) tty_cookedmode(el);	/* make sure the tty is set up correctly */
    446  1.1       cgd     term__flush();		/* flush any buffered output */
    447  1.1       cgd     if (el->el_flags & HANDLE_SIGNALS)
    448  1.1       cgd 	sig_clr(el);
    449  1.1       cgd     if (nread)
    450  1.1       cgd 	    *nread = num;
    451  1.1       cgd     return num ? el->el_line.buffer : NULL;
    452  1.1       cgd }
    453