Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Apr 2017 16:16:22 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r317559 - head/bin/sh
Message-ID:  <201704281616.v3SGGMH5036815@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704281616.v3SGGMH5036815>