svn commit: r214281 - in head: bin/sh tools/regression/bin/sh/parser

Jilles Tjoelker jilles at FreeBSD.org
Sun Oct 24 17:06:50 UTC 2010


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


More information about the svn-src-head mailing list