tfix empty string interpolation bugs (Michael Teichgräber) - plan9port - [fork… | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 6c4c5c5b959ec8a2e85510bdf85339582f638f36 | |
parent edd308cfa28421761db073542ecd538a13949d13 | |
Author: rsc <devnull@localhost> | |
Date: Mon, 26 Mar 2007 17:27:08 +0000 | |
fix empty string interpolation bugs (Michael Teichgräber) | |
Diffstat: | |
M src/cmd/mk/varsub.c | 12 ++++-------- | |
M src/cmd/mk/word.c | 11 ++++++++++- | |
2 files changed, 14 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/src/cmd/mk/varsub.c b/src/cmd/mk/varsub.c | |
t@@ -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) | |
t@@ -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; | |
} | |
t@@ -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){ | |
t@@ -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 … | |
- ; | |
- *s = cp; | |
return 0; | |
} | |
t@@ -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; | |
} | |
diff --git a/src/cmd/mk/word.c b/src/cmd/mk/word.c | |
t@@ -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) | |
t@@ -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); | |
t@@ -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); | |
t@@ -147,6 +155,7 @@ nextword(char **s) | |
tail = tail->next; | |
break; | |
default: | |
+ empty = 0; | |
rinsert(b, r); | |
break; | |
} |