ttest: update from Plan 9 - 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 f6d2cbfe4795015d252ef9c6d281adccf069438f
 (DIR) parent 11a3ce57b1bb19192acd653ccee5039159f7727e
 (HTM) Author: David du Colombier <0intro@gmail.com>
       Date:   Tue, 16 Aug 2011 16:11:48 -0400
       
       ttest: update from Plan 9
       
       R=rsc
       CC=plan9port.codebot
       http://codereview.appspot.com/4847051
       
       Diffstat:
         M man/man1/test.1                     |       7 +++++++
         M src/cmd/test.c                      |     155 +++++++++++++++----------------
       
       2 files changed, 84 insertions(+), 78 deletions(-)
       ---
 (DIR) diff --git a/man/man1/test.1 b/man/man1/test.1
       t@@ -209,3 +209,10 @@ is in the current directory.
        .B \*9/src/cmd/test.c
        .SH "SEE ALSO"
        .IR rc (1) 
       +.SH BUGS
       +Won't complain about extraneous arguments
       +since there may be arguments left unprocessed by
       +short-circuit evaluation of
       +.B -a
       +or
       +.BR -o .
 (DIR) diff --git a/src/cmd/test.c b/src/cmd/test.c
       t@@ -230,92 +230,77 @@ tio(char *a, int f)
                return access (a, f) >= 0;
        }
        
       -/* copy to local memory; clear names for safety */
       -int
       -localstat(char *f, Dir *dir)
       -{
       -        Dir *d;
       -
       -        d = dirstat(f);
       -        if(d == nil)
       -                return(-1);
       -        *dir = *d;
       -        free(d);
       -        dir->name = 0;
       -        dir->uid = 0;
       -        dir->gid = 0;
       -        dir->muid = 0;
       -        return 0;
       -}
       -
       -/* copy to local memory; clear names for safety */
       -int
       -localfstat(int f, Dir *dir)
       -{
       -        Dir *d;
       -
       -        d = dirfstat(f);
       -        if(d == nil)
       -                return(-1);
       -        *dir = *d;
       -        free(d);
       -        dir->name = 0;
       -        dir->uid = 0;
       -        dir->gid = 0;
       -        dir->muid = 0;
       -        return 0;
       -}
       +/*
       + * note that the name strings pointed to by Dir members are
       + * allocated with the Dir itself (by the same call to malloc),
       + * but are not included in sizeof(Dir), so copying a Dir won't
       + * copy the strings it points to.
       + */
        
        int
        hasmode(char *f, ulong m)
        {
       -        Dir dir;
       +        int r;
       +        Dir *dir;
        
       -        if(localstat(f,&dir)<0)
       -                return(0);
       -        return(dir.mode&m);
       +        dir = dirstat(f);
       +        if (dir == nil)
       +                return 0;
       +        r = (dir->mode & m) != 0;
       +        free(dir);
       +        return r;
        }
        
        int
        isdir(char *f)
        {
       -        Dir dir;
       -
       -        if(localstat(f,&dir)<0)
       -                return(0);
       -        return(dir.mode&DMDIR);
       +        return hasmode(f, DMDIR);
        }
        
        int
        isreg(char *f)
        {
       -        Dir dir;
       +        int r;
       +        Dir *dir;
        
       -        if(localstat(f,&dir)<0)
       -                return(0);
       -        return(!(dir.mode&DMDIR));
       +        dir = dirstat(f);
       +        if (dir == nil)
       +                return 0;
       +        r = (dir->mode & DMDIR) == 0;
       +        free(dir);
       +        return r;
        }
        
        int
        isatty(int fd)
        {
       -        Dir d1, d2;
       -
       -        if(localfstat(fd, &d1) < 0)
       -                return 0;
       -        if(localstat("/dev/cons", &d2) < 0)
       -                return 0;
       -        return d1.type==d2.type && d1.dev==d2.dev && d1.qid.path==d2.qid.path;
       +        int r;
       +        Dir *d1, *d2;
       +
       +        d1 = dirfstat(fd);
       +        d2 = dirstat("/dev/cons");
       +        if (d1 == nil || d2 == nil)
       +                r = 0;
       +        else
       +                r = d1->type == d2->type && d1->dev == d2->dev &&
       +                        d1->qid.path == d2->qid.path;
       +        free(d1);
       +        free(d2);
       +        return r;
        }
        
        int
        fsizep(char *f)
        {
       -        Dir dir;
       +        int r;
       +        Dir *dir;
        
       -        if(localstat(f,&dir)<0)
       -                return(0);
       -        return(dir.length>0);
       +        dir = dirstat(f);
       +        if (dir == nil)
       +                return 0;
       +        r = dir->length > 0;
       +        free(dir);
       +        return r;
        }
        
        void
       t@@ -344,12 +329,14 @@ isint(char *s, int *pans)
        int
        isolder(char *pin, char *f)
        {
       -        char *p = pin;
       +        int r;
                ulong n, m;
       -        Dir dir;
       +        char *p = pin;
       +        Dir *dir;
        
       -        if(localstat(f,&dir)<0)
       -                return(0);
       +        dir = dirstat(f);
       +        if (dir == nil)
       +                return 0;
        
                /* parse time */
                n = 0;
       t@@ -383,29 +370,41 @@ isolder(char *pin, char *f)
                        }
                }
        
       -        return(dir.mtime+n < time(0));
       +        r = dir->mtime + n < time(0);
       +        free(dir);
       +        return r;
        }
        
        int
        isolderthan(char *a, char *b)
        {
       -        Dir ad, bd;
       -
       -        if(localstat(a, &ad)<0)
       -                return(0);
       -        if(localstat(b, &bd)<0)
       -                return(0);
       -        return ad.mtime > bd.mtime;
       +        int r;
       +        Dir *ad, *bd;
       +
       +        ad = dirstat(a);
       +        bd = dirstat(b);
       +        if (ad == nil || bd == nil)
       +                r = 0;
       +        else
       +                r = ad->mtime > bd->mtime;
       +        free(ad);
       +        free(bd);
       +        return r;
        }
        
        int
        isnewerthan(char *a, char *b)
        {
       -        Dir ad, bd;
       -
       -        if(localstat(a, &ad)<0)
       -                return(0);
       -        if(localstat(b, &bd)<0)
       -                return(0);
       -        return ad.mtime < bd.mtime;
       +        int r;
       +        Dir *ad, *bd;
       +
       +        ad = dirstat(a);
       +        bd = dirstat(b);
       +        if (ad == nil || bd == nil)
       +                r = 0;
       +        else
       +                r = ad->mtime < bd->mtime;
       +        free(ad);
       +        free(bd);
       +        return r;
        }