diff options
author | rsc <devnull@localhost> | 2007-03-26 17:27:08 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2007-03-26 17:27:08 +0000 |
commit | 6c4c5c5b959ec8a2e85510bdf85339582f638f36 (patch) | |
tree | 29e27c708e67bf46d8ee4f5580a09dbc06f34ae6 /src/cmd/mk | |
parent | edd308cfa28421761db073542ecd538a13949d13 (diff) | |
download | plan9port-6c4c5c5b959ec8a2e85510bdf85339582f638f36.tar.gz plan9port-6c4c5c5b959ec8a2e85510bdf85339582f638f36.tar.bz2 plan9port-6c4c5c5b959ec8a2e85510bdf85339582f638f36.zip |
fix empty string interpolation bugs (Michael Teichgräber)
Diffstat (limited to 'src/cmd/mk')
-rw-r--r-- | src/cmd/mk/varsub.c | 12 | ||||
-rw-r--r-- | 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 index 223ba78d..f858a92a 100644 --- a/src/cmd/mk/varsub.c +++ b/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; } diff --git a/src/cmd/mk/word.c b/src/cmd/mk/word.c index b0e344ea..f94c4fd7 100644 --- a/src/cmd/mk/word.c +++ b/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; } |