summaryrefslogblamecommitdiffstats
path: root/source/ap/ash/patches/ash-syntax.patch
blob: 43ce78660f5b2eb5d9467b35d2f071dd7f4196c6 (plain) (tree)













































































































































































































































































                                                                                  
diff -urN netbsd-sh/mksyntax.c ash-0.3.7.orig/mksyntax.c
--- netbsd-sh/mksyntax.c	Fri Jan 12 17:50:38 2001
+++ ash-0.3.7.orig/mksyntax.c	Mon Apr 23 22:16:46 2001
@@ -238,14 +238,14 @@
 	add("$", "CVAR");
 	add("}", "CENDVAR");
 	/* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
-	add("!*?[=~:/-", "CCTL");
+	add("!*?[=~:/-]", "CCTL");
 	print("dqsyntax");
 	init();
 	fputs("\n/* syntax table used when in single quotes */\n", cfile);
 	add("\n", "CNL");
 	add("'", "CENDQUOTE");
 	/* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
-	add("!*?[=~:/-", "CCTL");
+	add("!*?[=~:/-]\\", "CCTL");
 	print("sqsyntax");
 	init();
 	fputs("\n/* syntax table used when in arithmetic */\n", cfile);
diff -urN netbsd-sh/parser.c ash-0.3.7.orig/parser.c
--- netbsd-sh/parser.c	Fri Jan 12 17:50:39 2001
+++ ash-0.3.7.orig/parser.c	Mon Apr 23 22:16:46 2001
@@ -221,6 +221,7 @@
 	union node *n1, *n2, *n3;
 	int t;
 
+	checkkwd = 1;
 	n1 = pipeline();
 	for (;;) {
 		if ((t = readtoken()) == TAND) {
@@ -231,6 +232,7 @@
 			tokpushback++;
 			return n1;
 		}
+		checkkwd = 2;
 		n2 = pipeline();
 		n3 = (union node *)stalloc(sizeof (struct nbinary));
 		n3->type = t;
@@ -250,9 +252,11 @@
 
 	negate = 0;
 	TRACE(("pipeline: entered\n"));
-	while (readtoken() == TNOT)
+	if (readtoken() == TNOT) {
 		negate = !negate;
-	tokpushback++;
+		checkkwd = 1;
+	} else
+		tokpushback++;
 	n1 = command();
 	if (readtoken() == TPIPE) {
 		pipenode = (union node *)stalloc(sizeof (struct npipe));
@@ -264,6 +268,7 @@
 		do {
 			prev = lp;
 			lp = (struct nodelist *)stalloc(sizeof (struct nodelist));
+			checkkwd = 2;
 			lp->n = command();
 			prev->next = lp;
 		} while (readtoken() == TPIPE);
@@ -288,9 +293,8 @@
 	union node *ap, **app;
 	union node *cp, **cpp;
 	union node *redir, **rpp;
-	int t, negate = 0;
+	int t;
 
-	checkkwd = 2;
 	redir = NULL;
 	n1 = NULL;
 	rpp = &redir;
@@ -303,12 +307,6 @@
 	}
 	tokpushback++;
 
-	while (readtoken() == TNOT) {
-		TRACE(("command: TNOT recognized\n"));
-		negate = !negate;
-	}
-	tokpushback++;
-
 	switch (readtoken()) {
 	case TIF:
 		n1 = (union node *)stalloc(sizeof (struct nif));
@@ -417,6 +415,8 @@
 		cpp = &n1->ncase.cases;
 		checkkwd = 2, readtoken();
 		do {
+			if (lasttoken == TLP)
+				readtoken();
 			*cpp = cp = (union node *)stalloc(sizeof (struct nclist));
 			cp->type = NCLIST;
 			app = &cp->nclist.pattern;
@@ -464,21 +464,22 @@
 		break;
 	/* Handle an empty command like other simple commands.  */
 	case TSEMI:
+	case TAND:
+	case TOR:
+	case TNL:
+	case TEOF:
+	case TRP:
+	case TBACKGND:
 		/*
 		 * An empty command before a ; doesn't make much sense, and
 		 * should certainly be disallowed in the case of `if ;'.
 		 */
 		if (!redir)
 			synexpect(-1);
-	case TAND:
-	case TOR:
-	case TNL:
-	case TEOF:
 	case TWORD:
-	case TRP:
 		tokpushback++;
 		n1 = simplecmd(rpp, redir);
-		goto checkneg;
+		return n1;
 	default:
 		synexpect(-1);
 		/* NOTREACHED */
@@ -502,15 +503,7 @@
 		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;
 }
 
 
@@ -520,8 +513,7 @@
 	{
 	union node *args, **app;
 	union node **orig_rpp = rpp;
-	union node *n = NULL, *n2;
-	int negate = 0;
+	union node *n = NULL;
 
 	/* If we don't have any redirections already, then we must reset */
 	/* rpp to be the address of the local redir variable.  */
@@ -537,12 +529,6 @@
 	 */
 	orig_rpp = rpp;
 
-	while (readtoken() == TNOT) {
-		TRACE(("command: TNOT recognized\n"));
-		negate = !negate;
-	}
-	tokpushback++;
-
 	for (;;) {
 		if (readtoken() == TWORD) {
 			n = (union node *)stalloc(sizeof (struct narg));
@@ -565,8 +551,9 @@
 				synerror("Bad function name");
 #endif
 			n->type = NDEFUN;
+			checkkwd = 2;
 			n->narg.next = command();
-			goto checkneg;
+			return n;
 		} else {
 			tokpushback++;
 			break;
@@ -579,16 +566,7 @@
 	n->ncmd.backgnd = 0;
 	n->ncmd.args = args;
 	n->ncmd.redirect = redir;
-
-checkneg:
-	if (negate) {
-		n2 = (union node *)stalloc(sizeof (struct nnot));
-		n2->type = NNOT;
-		n2->nnot.com = n;
-		return n2;
-	}
-	else
-		return n;
+	return n;
 }
 
 STATIC union node *
@@ -743,7 +721,7 @@
 			}
 		}
 out:
-		checkkwd = (t == TNOT) ? savecheckkwd : 0;
+		checkkwd = 0;
 	}
 #ifdef DEBUG
 	if (!alreadyseen)
@@ -882,6 +860,7 @@
 	int varnest;	/* levels of variables expansion */
 	int arinest;	/* levels of arithmetic expansion */
 	int parenlevel;	/* levels of parens in arithmetic */
+	int dqvarnest;	/* levels of variables expansion within double quotes */
 	int oldstyle;
 	char const *prevsyntax;	/* syntax before arithmetic */
 #if __GNUC__
@@ -892,6 +871,7 @@
 	(void) &varnest;
 	(void) &arinest;
 	(void) &parenlevel;
+	(void) &dqvarnest;
 	(void) &oldstyle;
 	(void) &prevsyntax;
 	(void) &syntax;
@@ -906,6 +886,7 @@
 	varnest = 0;
 	arinest = 0;
 	parenlevel = 0;
+	dqvarnest = 0;
 
 	STARTSTACKSTR(out);
 	loop: {	/* for each line, until end of word */
@@ -938,7 +919,8 @@
 				USTPUTC(c, out);
 				break;
 			case CCTL:
-				if (eofmark == NULL || dblquote)
+				if ((eofmark == NULL || dblquote) &&
+				    dqvarnest == 0)
 					USTPUTC(CTLESC, out);
 				USTPUTC(c, out);
 				break;
@@ -983,7 +965,8 @@
 					if (arinest) {
 						syntax = ARISYNTAX;
 						dblquote = 0;
-					} else if (eofmark == NULL) {
+					} else if (eofmark == NULL &&
+						   dqvarnest == 0) {
 						syntax = BASESYNTAX;
 						dblquote = 0;
 					}
@@ -996,6 +979,9 @@
 			case CENDVAR:	/* '}' */
 				if (varnest > 0) {
 					varnest--;
+					if (dqvarnest > 0) {
+						dqvarnest--;
+					}
 					USTPUTC(CTLENDVAR, out);
 				} else {
 					USTPUTC(c, out);
@@ -1260,8 +1248,12 @@
 		if (dblquote || arinest)
 			flags |= VSQUOTE;
 		*(stackblock() + typeloc) = subtype | flags;
-		if (subtype != VSNORMAL)
+		if (subtype != VSNORMAL) {
 			varnest++;
+			if (dblquote) {
+				dqvarnest++;
+			}
+		}
 	}
 	goto parsesub_return;
 }