Commit Diff


commit - edd308cfa28421761db073542ecd538a13949d13
commit + 6c4c5c5b959ec8a2e85510bdf85339582f638f36
blob - 223ba78dfd812344a02bfb0b31897d9b0e6ca907
blob + f858a92afe8ef57202d4ae5bc9e04aee62d87623
--- src/cmd/mk/varsub.c
+++ src/cmd/mk/varsub.c
@@ -5,7 +5,7 @@ static	Word		*expandvar(char**);
 static	Bufblock	*varname(char**);
 static	Word		*extractpat(char*, char**, char*, char*);
 static	int		submatch(char*, Word*, Word*, int*, char**);
-static	Word		*varmatch(char *, char**);
+static	Word		*varmatch(char *);
 
 Word *
 varsub(char **s)
@@ -20,7 +20,7 @@ varsub(char **s)
 	if(b == 0)
 		return 0;
 
-	w = varmatch(b->start, s);
+	w = varmatch(b->start);
 	freebuf(b);
 	return w;
 }
@@ -57,11 +57,10 @@ varname(char **s)
 }
 
 static Word*
-varmatch(char *name, char **s)
+varmatch(char *name)
 {
 	Word *w;
 	Symtab *sym;
-	char *cp;
 	
 	sym = symlook(name, S_VAR, 0);
 	if(sym){
@@ -70,9 +69,6 @@ varmatch(char *name, char **s)
 			if(w->s && *w->s)
 				return wdup(w);
 	}
-	for(cp = *s; *cp == ' ' || *cp == '\t'; cp++)	/* skip trailing whitespace */
-			;
-	*s = cp;
 	return 0;
 }
 
@@ -92,7 +88,7 @@ expandvar(char **s)
 	cp = *s;
 	if (*cp == '}') {				/* ${name} variant*/
 		(*s)++;					/* skip the '}' */
-		w = varmatch(buf->start, s);
+		w = varmatch(buf->start);
 		freebuf(buf);
 		return w;
 	}
blob - b0e344eabd834a2e3d6c518914f215d90b33f95d
blob + f94c4fd7960931595d31bbc412354485bf88f4ce
--- src/cmd/mk/word.c
+++ src/cmd/mk/word.c
@@ -97,12 +97,15 @@ nextword(char **s)
 	Word *head, *tail, *w;
 	Rune r;
 	char *cp;
+	int empty;
 
 	cp = *s;
 	b = newbuf();
+restart:
 	head = tail = 0;
 	while(*cp == ' ' || *cp == '\t')		/* leading white space */
 		cp++;
+	empty = 1;
 	while(*cp){
 		cp += chartorune(&r, cp);
 		switch(r)
@@ -114,6 +117,7 @@ nextword(char **s)
 		case '\\':
 		case '\'':
 		case '"':
+			empty = 0;
 			cp = shellt->expandquote(cp, r, b);
 			if(cp == 0){
 				fprint(2, "missing closing quote: %s\n", *s);
@@ -122,8 +126,12 @@ nextword(char **s)
 			break;
 		case '$':
 			w = varsub(&cp);
-			if(w == 0)
+			if(w == 0){
+				if(empty)
+					goto restart;
 				break;
+			}
+			empty = 0;
 			if(b->current != b->start){
 				bufcpy(b, w->s, strlen(w->s));
 				insert(b, 0);
@@ -147,6 +155,7 @@ nextword(char **s)
 				tail = tail->next;
 			break;
 		default:
+			empty = 0;
 			rinsert(b, r);
 			break;
 		}