diff options
author | dim <dim@FreeBSD.org> | 2016-02-21 13:49:26 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2016-02-21 13:49:26 +0000 |
commit | 2e1a0cbbd8f5a5ca7ec73c85311451ed1ac4242c (patch) | |
tree | bb5f550a5fd2ee1357495987f5076839273e5998 /bin/sh/input.c | |
parent | f393760a8a7c87242739a64002290b7bda94cb27 (diff) | |
parent | 579b7ad49fdbcb4dd1e016603c5d0774b32c12d1 (diff) | |
download | FreeBSD-src-2e1a0cbbd8f5a5ca7ec73c85311451ed1ac4242c.zip FreeBSD-src-2e1a0cbbd8f5a5ca7ec73c85311451ed1ac4242c.tar.gz |
Merge ^/head r295601 through r295844.
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 412f144..5921e08 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'; |