int preadbuffer(void) { char *p, *q; int more; int something; char savec; if (parsefile->strpush) { popstring(); if (--parsenleft >= 0) return (*parsenextc++); } if (parsenleft == EOF_NLEFT || parsefile->buf == NULL) return PEOF; flushout(&output); flushout(&errout); again: if (parselleft <= 0) { if ((parselleft = preadfd()) == -1) { parselleft = parsenleft = EOF_NLEFT; return PEOF; } } q = p = parsenextc; /* delete nul characters */ something = 0; for (more = 1; more;) { switch (*p) { case '\0': p++; /* Skip nul */ goto check; case '\t': case ' ': break; case '\n': parsenleft = q - parsenextc; more = 0; /* Stop processing here */ break; default: something = 1; break; } *q++ = *p++; check: if (--parselleft <= 0) { parsenleft = q - parsenextc - 1; if (parsenleft < 0) goto again; *q = '\0'; more = 0; } } savec = *q; *q = '\0'; #ifndef NO_HISTORY if (parsefile->fd == 0 && hist && something) { HistEvent he; INTOFF; history(hist, &he, whichprompt == 1 ? H_ENTER : H_ADD, parsenextc); INTON; } #endif if (vflag) { out2str(parsenextc); flushout(out2); } *q = savec; return *parsenextc++; }
static int preadbuffer(void) { char *q; int more; #ifdef USE_LINENOISE int something; #endif char savec; if (unlikely(parsefile->strpush)) { if ( parsefile->nleft == -1 && parsefile->strpush->ap && parsefile->nextc[-1] != ' ' && parsefile->nextc[-1] != '\t' ) { return PEOA; } popstring(); return pgetc(); } if (unlikely(parsefile->nleft == EOF_NLEFT || parsefile->buf == NULL)) return PEOF; flushall(); more = parsefile->lleft; if (more <= 0) { again: if ((more = preadfd()) <= 0) { parsefile->lleft = parsefile->nleft = EOF_NLEFT; return PEOF; } } q = parsefile->nextc; /* delete nul characters */ #ifdef USE_LINENOISE something = 0; #endif for (;;) { int c; more--; c = *q; if (!c) memmove(q, q + 1, more); else { q++; if (c == '\n') { parsefile->nleft = q - parsefile->nextc - 1; break; } #ifdef USE_LINENOISE switch (c) { default: something = 1; /* fall through */ case '\t': case ' ': break; } #endif } if (more <= 0) { parsefile->nleft = q - parsefile->nextc - 1; if (parsefile->nleft < 0) goto again; break; } } parsefile->lleft = more; savec = *q; *q = '\0'; #ifdef USE_LINENOISE if (parsefile->fd == 0 && iflag && something) { // linenoise doesn't expect the command terminator at the end of the history // entry. char command_terminator = q[-1]; q[-1] = '\0'; addtohistory(parsefile->nextc, strlen(parsefile->nextc)); // Restore the command terminator. q[-1] = command_terminator; } #endif if (vflag) { out2str(parsefile->nextc); #ifdef FLUSHERR flushout(out2); #endif } *q = savec; return (signed char)*parsefile->nextc++; }