svn commit: r317559 - head/bin/sh
Jilles Tjoelker
jilles at FreeBSD.org
Fri Apr 28 16:16:24 UTC 2017
Author: jilles
Date: Fri Apr 28 16:16:22 2017
New Revision: 317559
URL: https://svnweb.freebsd.org/changeset/base/317559
Log:
sh: Simplify handling of newlines in command substitution.
Unless we need to split on newlines, just append them as normal and remove
them at the end.
Modified:
head/bin/sh/expand.c
Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c Fri Apr 28 15:38:34 2017 (r317558)
+++ head/bin/sh/expand.c Fri Apr 28 16:16:22 2017 (r317559)
@@ -462,6 +462,7 @@ expbackq(union node *cmd, int quoted, in
int quotes = flag & (EXP_GLOB | EXP_CASE);
size_t nnl;
const char *ifs;
+ int startloc;
INTOFF;
p = grabstackstr(dest);
@@ -469,6 +470,7 @@ expbackq(union node *cmd, int quoted, in
ungrabstackstr(p, dest);
p = in.buf;
+ startloc = dest - stackblock();
nnl = 0;
if (!quoted && flag & EXP_SPLIT)
ifs = ifsset() ? ifsval() : " \t\n";
@@ -490,31 +492,24 @@ expbackq(union node *cmd, int quoted, in
lastc = *p++;
if (lastc == '\0')
continue;
- if (lastc == '\n') {
- nnl++;
- } else {
- if (nnl > 0) {
- if (strchr(ifs, '\n') != NULL) {
- NEXTWORD('\n', flag, dest, dst);
- nnl = 0;
- } else {
- CHECKSTRSPACE(nnl + 2, dest);
- while (nnl > 0) {
- nnl--;
- USTPUTC('\n', dest);
- }
- }
- }
- if (strchr(ifs, lastc) != NULL)
+ if (nnl > 0 && lastc != '\n') {
+ NEXTWORD('\n', flag, dest, dst);
+ nnl = 0;
+ }
+ if (strchr(ifs, lastc) != NULL) {
+ if (lastc == '\n')
+ nnl++;
+ else
NEXTWORD(lastc, flag, dest, dst);
- else {
- CHECKSTRSPACE(2, dest);
- if (quotes && syntax[(int)lastc] == CCTL)
- USTPUTC(CTLESC, dest);
- USTPUTC(lastc, dest);
- }
+ } else {
+ CHECKSTRSPACE(2, dest);
+ if (quotes && syntax[(int)lastc] == CCTL)
+ USTPUTC(CTLESC, dest);
+ USTPUTC(lastc, dest);
}
}
+ while (dest > stackblock() + startloc && STTOPC(dest) == '\n')
+ STUNPUTC(dest);
if (in.fd >= 0)
close(in.fd);
More information about the svn-src-all
mailing list