1*1125Sbill static char *sccsid = "@(#)test.c 4.1 (Berkeley) 10/01/80"; 2*1125Sbill /* 3*1125Sbill * test expression 4*1125Sbill * [ expression ] 5*1125Sbill */ 6*1125Sbill 7*1125Sbill #include <stdio.h> 8*1125Sbill #include <sys/types.h> 9*1125Sbill #include <sys/stat.h> 10*1125Sbill #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) 11*1125Sbill 12*1125Sbill #define DIR 1 13*1125Sbill #define FIL 2 14*1125Sbill int ap; 15*1125Sbill int ac; 16*1125Sbill char **av; 17*1125Sbill char *tmp; 18*1125Sbill 19*1125Sbill main(argc, argv) 20*1125Sbill char *argv[]; 21*1125Sbill { 22*1125Sbill 23*1125Sbill ac = argc; av = argv; ap = 1; 24*1125Sbill if(EQ(argv[0],"[")) { 25*1125Sbill if(!EQ(argv[--ac],"]")) 26*1125Sbill synbad("] missing",""); 27*1125Sbill } 28*1125Sbill argv[ac] = 0; 29*1125Sbill if (ac<=1) exit(1); 30*1125Sbill exit(exp()?0:1); 31*1125Sbill } 32*1125Sbill 33*1125Sbill char *nxtarg(mt) { 34*1125Sbill 35*1125Sbill if (ap>=ac) { 36*1125Sbill if(mt) { 37*1125Sbill ap++; 38*1125Sbill return(0); 39*1125Sbill } 40*1125Sbill synbad("argument expected",""); 41*1125Sbill } 42*1125Sbill return(av[ap++]); 43*1125Sbill } 44*1125Sbill 45*1125Sbill exp() { 46*1125Sbill int p1; 47*1125Sbill 48*1125Sbill p1 = e1(); 49*1125Sbill if (EQ(nxtarg(1), "-o")) return(p1 | exp()); 50*1125Sbill ap--; 51*1125Sbill return(p1); 52*1125Sbill } 53*1125Sbill 54*1125Sbill e1() { 55*1125Sbill int p1; 56*1125Sbill 57*1125Sbill p1 = e2(); 58*1125Sbill if (EQ(nxtarg(1), "-a")) return (p1 & e1()); 59*1125Sbill ap--; 60*1125Sbill return(p1); 61*1125Sbill } 62*1125Sbill 63*1125Sbill e2() { 64*1125Sbill if (EQ(nxtarg(0), "!")) 65*1125Sbill return(!e3()); 66*1125Sbill ap--; 67*1125Sbill return(e3()); 68*1125Sbill } 69*1125Sbill 70*1125Sbill e3() { 71*1125Sbill int p1; 72*1125Sbill register char *a; 73*1125Sbill char *p2; 74*1125Sbill int int1, int2; 75*1125Sbill 76*1125Sbill a=nxtarg(0); 77*1125Sbill if(EQ(a, "(")) { 78*1125Sbill p1 = exp(); 79*1125Sbill if(!EQ(nxtarg(0), ")")) synbad(") expected",""); 80*1125Sbill return(p1); 81*1125Sbill } 82*1125Sbill 83*1125Sbill if(EQ(a, "-r")) 84*1125Sbill return(tio(nxtarg(0), 0)); 85*1125Sbill 86*1125Sbill if(EQ(a, "-w")) 87*1125Sbill return(tio(nxtarg(0), 1)); 88*1125Sbill 89*1125Sbill if(EQ(a, "-d")) 90*1125Sbill return(ftype(nxtarg(0))==DIR); 91*1125Sbill 92*1125Sbill if(EQ(a, "-f")) 93*1125Sbill return(ftype(nxtarg(0))==FIL); 94*1125Sbill 95*1125Sbill if(EQ(a, "-s")) 96*1125Sbill return(fsizep(nxtarg(0))); 97*1125Sbill 98*1125Sbill if(EQ(a, "-t")) 99*1125Sbill if(ap>=ac) 100*1125Sbill return(isatty(1)); 101*1125Sbill else 102*1125Sbill return(isatty(atoi(nxtarg(0)))); 103*1125Sbill 104*1125Sbill if(EQ(a, "-n")) 105*1125Sbill return(!EQ(nxtarg(0), "")); 106*1125Sbill if(EQ(a, "-z")) 107*1125Sbill return(EQ(nxtarg(0), "")); 108*1125Sbill 109*1125Sbill p2 = nxtarg(1); 110*1125Sbill if (p2==0) 111*1125Sbill return(!EQ(a,"")); 112*1125Sbill if(EQ(p2, "=")) 113*1125Sbill return(EQ(nxtarg(0), a)); 114*1125Sbill 115*1125Sbill if(EQ(p2, "!=")) 116*1125Sbill return(!EQ(nxtarg(0), a)); 117*1125Sbill 118*1125Sbill if(EQ(a, "-l")) { 119*1125Sbill int1=length(p2); 120*1125Sbill p2=nxtarg(0); 121*1125Sbill } else{ int1=atoi(a); 122*1125Sbill } 123*1125Sbill int2 = atoi(nxtarg(0)); 124*1125Sbill if(EQ(p2, "-eq")) 125*1125Sbill return(int1==int2); 126*1125Sbill if(EQ(p2, "-ne")) 127*1125Sbill return(int1!=int2); 128*1125Sbill if(EQ(p2, "-gt")) 129*1125Sbill return(int1>int2); 130*1125Sbill if(EQ(p2, "-lt")) 131*1125Sbill return(int1<int2); 132*1125Sbill if(EQ(p2, "-ge")) 133*1125Sbill return(int1>=int2); 134*1125Sbill if(EQ(p2, "-le")) 135*1125Sbill return(int1<=int2); 136*1125Sbill 137*1125Sbill synbad("unknown operator ",p2); 138*1125Sbill } 139*1125Sbill 140*1125Sbill tio(a, f) 141*1125Sbill char *a; 142*1125Sbill int f; 143*1125Sbill { 144*1125Sbill 145*1125Sbill f = open(a, f); 146*1125Sbill if (f>=0) { 147*1125Sbill close(f); 148*1125Sbill return(1); 149*1125Sbill } 150*1125Sbill return(0); 151*1125Sbill } 152*1125Sbill 153*1125Sbill ftype(f) 154*1125Sbill char *f; 155*1125Sbill { 156*1125Sbill struct stat statb; 157*1125Sbill 158*1125Sbill if(stat(f,&statb)<0) 159*1125Sbill return(0); 160*1125Sbill if((statb.st_mode&S_IFMT)==S_IFDIR) 161*1125Sbill return(DIR); 162*1125Sbill return(FIL); 163*1125Sbill } 164*1125Sbill 165*1125Sbill fsizep(f) 166*1125Sbill char *f; 167*1125Sbill { 168*1125Sbill struct stat statb; 169*1125Sbill if(stat(f,&statb)<0) 170*1125Sbill return(0); 171*1125Sbill return(statb.st_size>0); 172*1125Sbill } 173*1125Sbill 174*1125Sbill synbad(s1,s2) 175*1125Sbill char *s1, *s2; 176*1125Sbill { 177*1125Sbill write(2, "test: ", 6); 178*1125Sbill write(2, s1, strlen(s1)); 179*1125Sbill write(2, s2, strlen(s2)); 180*1125Sbill write(2, "\n", 1); 181*1125Sbill exit(255); 182*1125Sbill } 183*1125Sbill 184*1125Sbill length(s) 185*1125Sbill char *s; 186*1125Sbill { 187*1125Sbill char *es=s; 188*1125Sbill while(*es++); 189*1125Sbill return(es-s-1); 190*1125Sbill } 191