[v3 PATCH 10/13] input: Always push in setinputfile

Herbert Xu
2024-05-05T09:15:23Z

Push the input file even in the case of "sh file". This is because
the base parsefile will be used for read(1).

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---
src/input.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/src/input.c b/src/input.c
index bedc581..1712e5f 100644
--- a/src/input.c
+++ b/src/input.c
@@ -61,6 +61,7 @@

MKINIT struct parsefile basepf; /* top level input file */
MKINIT char basebuf[IBUFSIZ]; /* buffer for top level input file */
+MKINIT struct parsefile *toppf = &basepf;
struct parsefile *parsefile = &basepf; /* current input file */
int whichprompt; /* 1 == PS1, 2 == PS2 */

@@ -89,8 +90,8 @@ RESET {
popallfiles();

c = PEOF;
- if (basepf.nextc - basebuf > basepf.unget)
- c = basepf.nextc[-basepf.unget - 1];
+ if (toppf->nextc - toppf->buf > toppf->unget)
+ c = toppf->nextc[-toppf->unget - 1];
while (c != '\n' && c != PEOF && !int_pending())
c = pgetc();
}
@@ -473,13 +474,11 @@ out:
static void
setinputfd(int fd, int push)
{
- if (push) {
- pushfile();
- parsefile->buf = 0;
- }
+ pushfile();
+ if (!push)
+ toppf = parsefile;
parsefile->fd = fd;
- if (parsefile->buf == NULL)
- parsefile->nextc = parsefile->buf = ckmalloc(IBUFSIZ);
+ parsefile->nextc = parsefile->buf = ckmalloc(IBUFSIZ);
input_set_lleft(parsefile, parsefile->nleft = 0);
plinno = 1;
}
@@ -560,5 +559,5 @@ void unwindfiles(struct parsefile *stop)
void
popallfiles(void)
{
- unwindfiles(&basepf);
+ unwindfiles(toppf);
}
--
2.39.2