make el_gets set the count to -1 on error to distinguish between EOF and

error.
This commit is contained in:
christos 2009-03-10 20:46:15 +00:00
parent 1cc1109801
commit ae87843e53
2 changed files with 43 additions and 24 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: editline.3,v 1.62 2009/03/09 19:24:27 joerg Exp $
.\" $NetBSD: editline.3,v 1.63 2009/03/10 20:46:15 christos Exp $
.\"
.\" Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
.\" All rights reserved.
@ -26,7 +26,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd April 5, 2008
.Dd March 10, 2009
.Dt EDITLINE 3
.Os
.Sh NAME
@ -157,6 +157,13 @@ is modified to contain the number of characters read.
Returns the line read if successful, or
.Dv NULL
if no characters were read or if an error occurred.
If an error occurred,
.Fa count
is set to
.Dv -1
and
.Dv errno
contains the error code that caused it.
.It Fn el_getc
Read a character from the tty.
.Fa ch

View File

@ -1,4 +1,4 @@
/* $NetBSD: read.c,v 1.48 2009/02/21 23:35:10 christos Exp $ */
/* $NetBSD: read.c,v 1.49 2009/03/10 20:46:15 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: read.c,v 1.48 2009/02/21 23:35:10 christos Exp $");
__RCSID("$NetBSD: read.c,v 1.49 2009/03/10 20:46:15 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@ -240,7 +240,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
el->el_errno = 0;
do {
if ((num = el_getc(el, ch)) != 1) { /* if EOF or error */
el->el_errno = errno;
el->el_errno = num == 0 ? 0 : errno;
return (num);
}
@ -414,10 +414,14 @@ el_gets(EditLine *el, int *nread)
int num; /* how many chars we have read at NL */
char ch;
int crlf = 0;
int nrb;
#ifdef FIONREAD
c_macro_t *ma = &el->el_chared.c_macro;
#endif /* FIONREAD */
if (nread == NULL)
nread = &nrb;
if (el->el_flags & NO_TTY) {
char *cp = el->el_line.buffer;
size_t idx;
@ -436,14 +440,16 @@ el_gets(EditLine *el, int *nread)
if (cp[-1] == '\r' || cp[-1] == '\n')
break;
}
if (num == -1 && errno == EINTR)
cp = el->el_line.buffer;
if (num == -1) {
if (errno == EINTR)
cp = el->el_line.buffer;
el->el_errno = errno;
}
el->el_line.cursor = el->el_line.lastchar = cp;
*cp = '\0';
if (nread)
*nread = (int)(el->el_line.cursor - el->el_line.buffer);
return (*nread ? el->el_line.buffer : NULL);
*nread = (int)(el->el_line.cursor - el->el_line.buffer);
goto done;
}
@ -454,8 +460,8 @@ el_gets(EditLine *el, int *nread)
(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
if (chrs == 0) {
if (tty_rawmode(el) < 0) {
if (nread)
*nread = 0;
errno = 0;
*nread = 0;
return (NULL);
}
}
@ -491,14 +497,16 @@ el_gets(EditLine *el, int *nread)
if (crlf)
break;
}
if (num == -1 && errno == EINTR)
cp = el->el_line.buffer;
if (num == -1) {
if (errno == EINTR)
cp = el->el_line.buffer;
el->el_errno = errno;
}
el->el_line.cursor = el->el_line.lastchar = cp;
*cp = '\0';
if (nread)
*nread = (int)(el->el_line.cursor - el->el_line.buffer);
return (*nread ? el->el_line.buffer : NULL);
goto done;
}
for (num = OKCMD; num == OKCMD;) { /* while still editing this
@ -518,7 +526,6 @@ el_gets(EditLine *el, int *nread)
el->el_line.buffer[0] = '\0';
el->el_line.lastchar =
el->el_line.cursor = el->el_line.buffer;
num = 0;
break;
}
if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) { /* BUG CHECK command */
@ -638,12 +645,17 @@ el_gets(EditLine *el, int *nread)
/* make sure the tty is set up correctly */
if ((el->el_flags & UNBUFFERED) == 0) {
read_finish(el);
if (nread)
*nread = num;
*nread = num != -1 ? num : 0;
} else {
if (nread)
*nread =
(int)(el->el_line.lastchar - el->el_line.buffer);
*nread = (int)(el->el_line.lastchar - el->el_line.buffer);
}
return (num ? el->el_line.buffer : NULL);
done:
if (*nread == 0) {
if (num == -1) {
*nread = -1;
errno = el->el_errno;
}
return NULL;
} else
return el->el_line.buffer;
}