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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to