Deleted Added
full compact
36c36
< * $Id: input.c,v 1.2 1994/09/24 02:57:39 davidg Exp $
---
> * $Id: input.c,v 1.3 1995/05/30 00:07:15 rgrimes Exp $
67a68
> int prevlleft;
81c82,83
< int nleft; /* number of chars left in buffer */
---
> int nleft; /* number of chars left in line */
> int lleft; /* number of lines left in buffer */
90a93
> MKINIT int parselleft; /* copy of parsefile->lleft */
95,96d97
< char *pushedstring; /* copy of parsenextc when text pushed back */
< int pushednleft; /* copy of parsenleft when text pushed back */
122c123
< parsenleft = 0; /* clear input buffer */
---
> parselleft = parsenleft = 0; /* clear input buffer */
170a172,175
> static int
> pread()
> {
> int nr;
171a177,214
> parsenextc = parsefile->buf;
> retry:
> if (parsefile->fd == 0 && el) {
> const char *rl_cp;
> int len;
>
> rl_cp = el_gets(el, &nr);
> if (rl_cp == NULL)
> nr = 0;
> else {
> /* XXX - BUFSIZE should redesign so not necessary */
> strcpy(parsenextc, rl_cp);
> }
>
> } else {
> nr = read(parsefile->fd, parsenextc, BUFSIZ - 1);
> }
>
> if (nr <= 0) {
> if (nr < 0) {
> if (errno == EINTR)
> goto retry;
> if (parsefile->fd == 0 && errno == EWOULDBLOCK) {
> int flags = fcntl(0, F_GETFL, 0);
> if (flags >= 0 && flags & O_NONBLOCK) {
> flags &=~ O_NONBLOCK;
> if (fcntl(0, F_SETFL, flags) >= 0) {
> out2str("sh: turning off NDELAY mode\n");
> goto retry;
> }
> }
> }
> }
> nr = -1;
> }
> return nr;
> }
>
178,179c221,222
< * 3) Call read to read in the characters.
< * 4) Delete all nul characters from the buffer.
---
> * 3) If there is more in the buffer, use it; else call read to fill it.
> * 4) Process input up to next newline, deleting nul characters.
184,186c227,229
< register char *p, *q;
< register int i;
< register int something;
---
> char *p, *q;
> int more;
> int something;
187a231
> char savec;
198,202d241
< retry:
< p = parsenextc = parsefile->buf;
< if (parsefile->fd == 0 && el) {
< const char *rl_cp;
< int len;
204,207c243,247
< rl_cp = el_gets(el, &len);
< if (rl_cp == NULL) {
< i = 0;
< goto eof;
---
> again:
> if (parselleft <= 0) {
> if ((parselleft = pread()) == -1) {
> parselleft = parsenleft = EOF_NLEFT;
> return PEOF;
209,214d248
< strcpy(p, rl_cp); /* XXX - BUFSIZE should redesign so not necessary */
< i = len;
<
< } else {
< regular_read:
< i = read(parsefile->fd, p, BUFSIZ - 1);
216,235d249
< eof:
< if (i <= 0) {
< if (i < 0) {
< if (errno == EINTR)
< goto retry;
< if (parsefile->fd == 0 && errno == EWOULDBLOCK) {
< int flags = fcntl(0, F_GETFL, 0);
< if (flags >= 0 && flags & O_NONBLOCK) {
< flags &=~ O_NONBLOCK;
< if (fcntl(0, F_SETFL, flags) >= 0) {
< out2str("sh: turning off NDELAY mode\n");
< goto retry;
< }
< }
< }
< }
< parsenleft = EOF_NLEFT;
< return PEOF;
< }
< parsenleft = i - 1; /* we're returning one char in this call */
236a251,252
> q = p = parsenextc;
>
239,240c255,262
< for (;;) {
< if (*p == '\0')
---
> for (more = 1; more;) {
> switch (*p) {
> case '\0':
> p++; /* Skip nul */
> goto check;
>
> case '\t':
> case ' ':
242c264,270
< if (*p != ' ' && *p != '\t' && *p != '\n')
---
>
> case '\n':
> parsenleft = q - parsenextc;
> more = 0; /* Stop processing here */
> break;
>
> default:
244,247c272
< p++;
< if (--i <= 0) {
< *p = '\0';
< goto done; /* no nul characters */
---
> break;
248a274,283
>
> *q++ = *p++;
> check:
> if (--parselleft <= 0) {
> parsenleft = q - parsenextc - 1;
> if (parsenleft < 0)
> goto again;
> *q = '\0';
> more = 0;
> }
250,258c285,286
< /*
< * remove nuls
< */
< q = p++;
< while (--i > 0) {
< if (*p != '\0')
< *q++ = *p;
< p++;
< }
---
>
> savec = *q;
260,262d287
< if (q == parsefile->buf)
< goto retry; /* buffer contained nothing but nuls */
< parsenleft = q - parsefile->buf - 1;
264c289
< done:
---
>
267,268c292
< history(hist, whichprompt == 1 ? H_ENTER : H_ADD,
< parsefile->buf);
---
> history(hist, whichprompt == 1 ? H_ENTER : H_ADD, parsenextc);
270a295,296
>
>
272,280c298
< /*
< * This isn't right. Most shells coordinate it with
< * reading a line at a time. I honestly don't know if its
< * worth it.
< */
< i = parsenleft + 1;
< p = parsefile->buf;
< for (; i--; p++)
< out2c(*p)
---
> out2str(parsenextc);
282a301,303
>
> *q = savec;
>
318a340
> sp->prevlleft = parselleft;
333a356
> parselleft = sp->prevlleft;
386c409
< parsenleft = 0;
---
> parselleft = parsenleft = 0;
403c426
< parsenleft = strlen(string);
---
> parselleft = parsenleft = strlen(string);
420a444
> parsefile->lleft = parselleft;
445a470
> parselleft = parsefile->lleft;