From 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 21:39:35 +0000 Subject: 20060303 --- utils/test/test-Nt.c | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 utils/test/test-Nt.c (limited to 'utils/test/test-Nt.c') diff --git a/utils/test/test-Nt.c b/utils/test/test-Nt.c new file mode 100644 index 00000000..7d2a9fa7 --- /dev/null +++ b/utils/test/test-Nt.c @@ -0,0 +1,278 @@ +/* + * POSIX standard + * test expression + * [ expression ] + */ + +#include +#include + +#define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) + +int ap; +int ac; +char **av; +char *tmp; + +void synbad(char *, char *); +int length(char *); +int fsizep(char *); +int isdir(char *); +int isreg(char *); +int Ntisatty(int); +int isint(char *, int *); +int tio(char *, int); +int e(void), e1(void), e2(void), e3(void); + +void +main(int argc, char *argv[]) +{ + + ac = argc; av = argv; ap = 1; + if(EQ(argv[0],"[")) { + if(!EQ(argv[--ac],"]")) + synbad("] missing",""); + } + argv[ac] = 0; + if (ac<=1) exits("usage"); + exits(e()?0:"false"); +} + +char * +nxtarg(int mt) +{ + if(ap>=ac){ + if(mt){ + ap++; + return(0); + } + synbad("argument expected",""); + } + return(av[ap++]); +} + +int +nxtintarg(int *pans) +{ + if(ap=ac || !nxtintarg(&int1)) + return(Ntisatty(1)); + else + return(Ntisatty(int1)); + + if(EQ(a, "-n")) + return(!EQ(nxtarg(0), "")); + if(EQ(a, "-z")) + return(EQ(nxtarg(0), "")); + + p2 = nxtarg(1); + if (p2==0) + return(!EQ(a,"")); + if(EQ(p2, "=")) + return(EQ(nxtarg(0), a)); + + if(EQ(p2, "!=")) + return(!EQ(nxtarg(0), a)); + + if(!isint(a, &int1)) + return(!EQ(a,"")); + + if(nxtintarg(&int2)){ + if(EQ(p2, "-eq")) + return(int1==int2); + if(EQ(p2, "-ne")) + return(int1!=int2); + if(EQ(p2, "-gt")) + return(int1>int2); + if(EQ(p2, "-lt")) + return(int1=int2); + if(EQ(p2, "-le")) + return(int1<=int2); + } + + synbad("unknown operator ",p2); + return 0; /* to shut ken up */ +} + +int +tio(char *a, int f) +{ + return access (a, f) >= 0; +} + +/* + * dirstat fails for: + * [drivename]: + * [drivename]:/ + * / + * [drivename]:/ + */ +int +isdir(char *f) +{ + Dir *dir; + int len; + + len = strlen(f); + if (f[(len-1)] == '/') { + /* zap trailing '/' */ + f[(len-1)] = '\0'; + } + if (len == 2) { + if (f[1] == ':') { + return DMDIR; + } + } + if((dir = dirstat(f))==nil) + return(0); + return(dir->mode&DMDIR); +} + +int +isreg(char *f) +{ + Dir *dir; + + if((dir = dirstat(f))==nil) + return(0); + return(!(dir->mode&DMDIR)); +} + +int +Ntisatty(int fd) +{ + HANDLE h; + + if(fd < 0) + return 0; + + h = (HANDLE)_get_osfhandle(fd); + if(h < 0) + return 0; + return _isatty((int)h); +} + +int +fsizep(char *f) +{ + Dir *dir; + + if((dir = dirstat(f))==nil) + return(0); + return(dir->length>0); +} + +void +synbad(char *s1, char *s2) +{ + int len; + + write(2, "test: ", 6); + if ((len = strlen(s1)) != 0) + write(2, s1, len); + if ((len = strlen(s2)) != 0) + write(2, s2, len); + write(2, "\n", 1); + exits("bad syntax"); +} + +int +length(char *s) +{ + char *es=s; + while(*es++); + return(es-s-1); +} + +int +isint(char *s, int *pans) +{ + char *ep; + + *pans = strtol(s, &ep, 0); + return (*ep == 0); +} -- cgit v1.2.3