diff options
| author | Jilles Tjoelker <jilles@FreeBSD.org> | 2016-02-19 21:53:12 +0000 |
|---|---|---|
| committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2016-02-19 21:53:12 +0000 |
| commit | dcd95d8a010c87b954128824c40a6cb3b28a3688 (patch) | |
| tree | 364d164003fdb849c6de6c7622e31b279a793585 /bin/sh/input.c | |
| parent | 34b133bcd50a6c2e2dbb59817323d97007e122ba (diff) | |
Notes
Diffstat (limited to 'bin/sh/input.c')
| -rw-r--r-- | bin/sh/input.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/bin/sh/input.c b/bin/sh/input.c index 412f1442b08c0..5921e082da091 100644 --- a/bin/sh/input.c +++ b/bin/sh/input.c @@ -195,8 +195,7 @@ retry: int preadbuffer(void) { - char *p, *q; - int more; + char *p, *q, *r, *end; char savec; while (parsefile->strpush) { @@ -224,34 +223,31 @@ again: } } - q = p = parsefile->buf + (parsenextc - parsefile->buf); - - /* delete nul characters */ - for (more = 1; more;) { - switch (*p) { - case '\0': - p++; /* Skip nul */ - goto check; - - case '\n': - parsenleft = q - parsenextc; - more = 0; /* Stop processing here */ - break; - - default: - break; - } - - *q++ = *p++; -check: - if (--parselleft <= 0) { - parsenleft = q - parsenextc - 1; - if (parsenleft < 0) - goto again; - *q = '\0'; - more = 0; + p = parsefile->buf + (parsenextc - parsefile->buf); + end = p + parselleft; + *end = '\0'; + q = strchrnul(p, '\n'); + if (q != end && *q == '\0') { + /* delete nul characters */ + for (r = q; q != end; q++) { + if (*q != '\0') + *r++ = *q; } + parselleft -= end - r; + if (parselleft == 0) + goto again; + end = p + parselleft; + *end = '\0'; + q = strchrnul(p, '\n'); + } + if (q == end) { + parsenleft = parselleft; + parselleft = 0; + } else /* *q == '\n' */ { + parsenleft = q - parsenextc + 1; + parselleft -= parsenleft; } + parsenleft--; savec = *q; *q = '\0'; |
