1*27970Sdonn #ifndef lint 2*27970Sdonn static char *sccsid = "@(#)test.c 4.2 (Berkeley) 05/11/86"; 3*27970Sdonn #endif 4*27970Sdonn 51125Sbill /* 61125Sbill * test expression 71125Sbill * [ expression ] 81125Sbill */ 91125Sbill 101125Sbill #include <stdio.h> 111125Sbill #include <sys/types.h> 121125Sbill #include <sys/stat.h> 131125Sbill #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) 141125Sbill 151125Sbill #define DIR 1 161125Sbill #define FIL 2 171125Sbill int ap; 181125Sbill int ac; 191125Sbill char **av; 201125Sbill char *tmp; 21*27970Sdonn char *nxtarg(); 221125Sbill 231125Sbill main(argc, argv) 241125Sbill char *argv[]; 251125Sbill { 26*27970Sdonn int status; 271125Sbill 281125Sbill ac = argc; av = argv; ap = 1; 291125Sbill if(EQ(argv[0],"[")) { 301125Sbill if(!EQ(argv[--ac],"]")) 311125Sbill synbad("] missing",""); 321125Sbill } 331125Sbill argv[ac] = 0; 341125Sbill if (ac<=1) exit(1); 35*27970Sdonn status = (exp()?0:1); 36*27970Sdonn if (nxtarg(1)!=0) 37*27970Sdonn synbad("too many arguments",""); 38*27970Sdonn exit(status); 391125Sbill } 401125Sbill 411125Sbill char *nxtarg(mt) { 421125Sbill 431125Sbill if (ap>=ac) { 441125Sbill if(mt) { 451125Sbill ap++; 461125Sbill return(0); 471125Sbill } 481125Sbill synbad("argument expected",""); 491125Sbill } 501125Sbill return(av[ap++]); 511125Sbill } 521125Sbill 531125Sbill exp() { 541125Sbill int p1; 551125Sbill 561125Sbill p1 = e1(); 571125Sbill if (EQ(nxtarg(1), "-o")) return(p1 | exp()); 581125Sbill ap--; 591125Sbill return(p1); 601125Sbill } 611125Sbill 621125Sbill e1() { 631125Sbill int p1; 641125Sbill 651125Sbill p1 = e2(); 661125Sbill if (EQ(nxtarg(1), "-a")) return (p1 & e1()); 671125Sbill ap--; 681125Sbill return(p1); 691125Sbill } 701125Sbill 711125Sbill e2() { 721125Sbill if (EQ(nxtarg(0), "!")) 731125Sbill return(!e3()); 741125Sbill ap--; 751125Sbill return(e3()); 761125Sbill } 771125Sbill 781125Sbill e3() { 791125Sbill int p1; 801125Sbill register char *a; 811125Sbill char *p2; 82*27970Sdonn int int1; 831125Sbill 841125Sbill a=nxtarg(0); 851125Sbill if(EQ(a, "(")) { 861125Sbill p1 = exp(); 871125Sbill if(!EQ(nxtarg(0), ")")) synbad(") expected",""); 881125Sbill return(p1); 891125Sbill } 901125Sbill 911125Sbill if(EQ(a, "-r")) 921125Sbill return(tio(nxtarg(0), 0)); 931125Sbill 941125Sbill if(EQ(a, "-w")) 951125Sbill return(tio(nxtarg(0), 1)); 961125Sbill 971125Sbill if(EQ(a, "-d")) 981125Sbill return(ftype(nxtarg(0))==DIR); 991125Sbill 1001125Sbill if(EQ(a, "-f")) 1011125Sbill return(ftype(nxtarg(0))==FIL); 1021125Sbill 1031125Sbill if(EQ(a, "-s")) 1041125Sbill return(fsizep(nxtarg(0))); 1051125Sbill 1061125Sbill if(EQ(a, "-t")) 1071125Sbill if(ap>=ac) 1081125Sbill return(isatty(1)); 1091125Sbill else 1101125Sbill return(isatty(atoi(nxtarg(0)))); 1111125Sbill 1121125Sbill if(EQ(a, "-n")) 1131125Sbill return(!EQ(nxtarg(0), "")); 1141125Sbill if(EQ(a, "-z")) 1151125Sbill return(EQ(nxtarg(0), "")); 1161125Sbill 1171125Sbill p2 = nxtarg(1); 1181125Sbill if (p2==0) 1191125Sbill return(!EQ(a,"")); 1201125Sbill if(EQ(p2, "=")) 1211125Sbill return(EQ(nxtarg(0), a)); 1221125Sbill 1231125Sbill if(EQ(p2, "!=")) 1241125Sbill return(!EQ(nxtarg(0), a)); 1251125Sbill 1261125Sbill if(EQ(a, "-l")) { 1271125Sbill int1=length(p2); 1281125Sbill p2=nxtarg(0); 1291125Sbill } else{ int1=atoi(a); 1301125Sbill } 1311125Sbill if(EQ(p2, "-eq")) 132*27970Sdonn return(int1==atoi(nxtarg(0))); 1331125Sbill if(EQ(p2, "-ne")) 134*27970Sdonn return(int1!=atoi(nxtarg(0))); 1351125Sbill if(EQ(p2, "-gt")) 136*27970Sdonn return(int1>atoi(nxtarg(0))); 1371125Sbill if(EQ(p2, "-lt")) 138*27970Sdonn return(int1<atoi(nxtarg(0))); 1391125Sbill if(EQ(p2, "-ge")) 140*27970Sdonn return(int1>=atoi(nxtarg(0))); 1411125Sbill if(EQ(p2, "-le")) 142*27970Sdonn return(int1<=atoi(nxtarg(0))); 1431125Sbill 144*27970Sdonn --ap; 145*27970Sdonn return(!EQ(a,"")); 1461125Sbill } 1471125Sbill 1481125Sbill tio(a, f) 1491125Sbill char *a; 1501125Sbill int f; 1511125Sbill { 1521125Sbill 1531125Sbill f = open(a, f); 1541125Sbill if (f>=0) { 155*27970Sdonn (void) close(f); 1561125Sbill return(1); 1571125Sbill } 1581125Sbill return(0); 1591125Sbill } 1601125Sbill 1611125Sbill ftype(f) 1621125Sbill char *f; 1631125Sbill { 1641125Sbill struct stat statb; 1651125Sbill 1661125Sbill if(stat(f,&statb)<0) 1671125Sbill return(0); 1681125Sbill if((statb.st_mode&S_IFMT)==S_IFDIR) 1691125Sbill return(DIR); 1701125Sbill return(FIL); 1711125Sbill } 1721125Sbill 1731125Sbill fsizep(f) 1741125Sbill char *f; 1751125Sbill { 1761125Sbill struct stat statb; 1771125Sbill if(stat(f,&statb)<0) 1781125Sbill return(0); 1791125Sbill return(statb.st_size>0); 1801125Sbill } 1811125Sbill 1821125Sbill synbad(s1,s2) 1831125Sbill char *s1, *s2; 1841125Sbill { 185*27970Sdonn (void) write(2, "test: ", 6); 186*27970Sdonn (void) write(2, s1, strlen(s1)); 187*27970Sdonn (void) write(2, s2, strlen(s2)); 188*27970Sdonn (void) write(2, "\n", 1); 1891125Sbill exit(255); 1901125Sbill } 1911125Sbill 1921125Sbill length(s) 1931125Sbill char *s; 1941125Sbill { 1951125Sbill char *es=s; 1961125Sbill while(*es++); 1971125Sbill return(es-s-1); 1981125Sbill } 199