tfix empty string interpolation bugs (Michael Teichgräber) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6c4c5c5b959ec8a2e85510bdf85339582f638f36
 (DIR) parent edd308cfa28421761db073542ecd538a13949d13
 (HTM) 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(-)
       ---
 (DIR) 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 whitespace */
       -                        ;
       -        *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;
                }
 (DIR) 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;
                        }