Author: jilles
Date: Sun Oct 24 17:06:49 2010
New Revision: 214281
URL: http://svn.freebsd.org/changeset/base/214281

Log:
  sh: Change ! within a pipeline to start a new pipeline instead.
  
  This is how ksh93 treats ! within a pipeline and makes the ! in
    a | ! b | c
  negate the exit status of the pipeline, as if it were
    a | { ! b | c; }
  
  Side effect: something like
    f() ! a
  is now a syntax error, because a function definition takes a command,
  not a pipeline.
  
  Exp-run done by:      pav (with some other sh(1) changes)

Added:
  head/tools/regression/bin/sh/parser/pipe-not1.0   (contents, props changed)
Modified:
  head/bin/sh/parser.c

Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c        Sun Oct 24 16:55:17 2010        (r214280)
+++ head/bin/sh/parser.c        Sun Oct 24 17:06:49 2010        (r214281)
@@ -328,7 +328,7 @@ pipeline(void)
 {
        union node *n1, *n2, *pipenode;
        struct nodelist *lp, *prev;
-       int negate;
+       int negate, t;
 
        negate = 0;
        checkkwd = 2;
@@ -347,7 +347,13 @@ pipeline(void)
                do {
                        prev = lp;
                        lp = (struct nodelist *)stalloc(sizeof (struct 
nodelist));
-                       lp->n = command();
+                       checkkwd = 2;
+                       t = readtoken();
+                       tokpushback++;
+                       if (t == TNOT)
+                               lp->n = pipeline();
+                       else
+                               lp->n = command();
                        prev->next = lp;
                } while (readtoken() == TPIPE);
                lp->next = NULL;
@@ -372,7 +378,7 @@ command(void)
        union node *ap, **app;
        union node *cp, **cpp;
        union node *redir, **rpp;
-       int t, negate = 0;
+       int t;
 
        checkkwd = 2;
        redir = NULL;
@@ -387,12 +393,6 @@ command(void)
        }
        tokpushback++;
 
-       while (readtoken() == TNOT) {
-               TRACE(("command: TNOT recognized\n"));
-               negate = !negate;
-       }
-       tokpushback++;
-
        switch (readtoken()) {
        case TIF:
                n1 = (union node *)stalloc(sizeof (struct nif));
@@ -573,7 +573,7 @@ TRACE(("expecting DO got %s %s\n", tokna
        case TRP:
                tokpushback++;
                n1 = simplecmd(rpp, redir);
-               goto checkneg;
+               return n1;
        default:
                synexpect(-1);
        }
@@ -596,15 +596,7 @@ TRACE(("expecting DO got %s %s\n", tokna
                n1->nredir.redirect = redir;
        }
 
-checkneg:
-       if (negate) {
-               n2 = (union node *)stalloc(sizeof (struct nnot));
-               n2->type = NNOT;
-               n2->nnot.com = n1;
-               return n2;
-       }
-       else
-               return n1;
+       return n1;
 }
 
 

Added: head/tools/regression/bin/sh/parser/pipe-not1.0
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/bin/sh/parser/pipe-not1.0     Sun Oct 24 17:06:49 
2010        (r214281)
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+: | ! : | false
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to