1 /* 2 * test expression 3 * [ expression ] 4 */ 5 6 #include "defs.h" 7 #include <sys/types.h> 8 #include <sys/stat.h> 9 #define exp exp_ 10 11 INT ap, ac; 12 STRING *av; 13 14 test(argn, com) 15 STRING com[]; 16 INT argn; 17 { 18 19 20 ac = argn; av = com; ap = 1; 21 IF eq(com[0],"[") 22 THEN IF !eq(com[--ac], "]") 23 THEN failed("test", "] missing"); 24 FI 25 FI 26 com[ac] = 0; 27 IF ac <= 1 THEN return(1) FI 28 return(exp()?0:1); 29 } 30 31 STRING nxtarg(mt) { 32 33 IF ap >= ac 34 THEN IF mt 35 THEN ap++; 36 return(0); 37 FI 38 failed("test", "argument expected"); 39 FI 40 return(av[ap++]); 41 } 42 43 exp() { 44 INT p1; 45 STRING p2; 46 47 p1 = e1(); 48 p2 = nxtarg(1); 49 IF eq(p2, "-o") THEN return(p1 | exp()) FI 50 IF (p2!=0)&&!eq(p2,"]")&&!eq(p2,")") 51 THEN failed("test", synmsg); 52 FI 53 ap--; 54 return(p1); 55 } 56 57 e1() { 58 INT p1; 59 60 p1 = e2(); 61 IF eq(nxtarg(1), "-a") THEN return(p1 & e1()) FI 62 ap--; 63 return(p1); 64 } 65 66 e2() { 67 IF eq(nxtarg(0), "!") 68 THEN return(!e3()) 69 FI 70 ap--; 71 return(e3()); 72 } 73 74 e3() { 75 INT p1; 76 REG STRING a; 77 STRING p2; 78 L_INT atol(); 79 L_INT int1, int2; 80 81 a=nxtarg(0); 82 IF eq(a, "(") 83 THEN p1 = exp(); 84 IF !eq(nxtarg(0), ")") THEN failed("test",") expected") FI 85 return(p1); 86 FI 87 88 p2 = nxtarg(1); 89 ap--; 90 IF !eq(p2,"=")&&!eq(p2,"!=") 91 THEN IF eq(a, "-r") THEN return(tio(nxtarg(0), 4)) FI 92 IF eq(a, "-w") THEN return(tio(nxtarg(0), 2)) FI 93 IF eq(a, "-x") THEN return(tio(nxtarg(0), 1)) FI 94 IF eq(a, "-d") THEN return(ftype(nxtarg(0), S_IFDIR)) FI 95 IF eq(a, "-c") THEN return(ftype(nxtarg(0),S_IFCHR)) FI 96 IF eq(a, "-b") THEN return(ftype(nxtarg(0), S_IFBLK)) FI 97 IF eq(a, "-f") THEN return(ftype(nxtarg(0), S_IFREG)) FI 98 IF eq(a, "-u") THEN return(ftype(nxtarg(0), S_ISUID)) FI 99 IF eq(a, "-g") THEN return(ftype(nxtarg(0), S_ISGID)) FI 100 IF eq(a, "-k") THEN return(ftype(nxtarg(0), S_ISVTX)) FI 101 IF eq(a, "-s") THEN return(fsizep(nxtarg(0))) FI 102 IF eq(a, "-t") 103 THEN IF ap >= ac /* no args */ 104 THEN return(isatty(1)); 105 ELIF eq((a=nxtarg(0)), "-a") 106 ORF eq(a, "-o") 107 THEN ap--; 108 return(isatty(1)); 109 ELSE return(isatty(atol(a))); 110 FI 111 FI 112 IF eq(a, "-n") THEN return(!eq(nxtarg(0), "")) FI 113 IF eq(a, "-z") THEN return(eq(nxtarg(0), "")) FI 114 FI 115 116 p2 = nxtarg(1); 117 IF p2==0 THEN return(!eq(a, "")) FI 118 IF eq(p2, "-a") ORF eq(p2, "-o") 119 THEN ap--; 120 return(!eq(a, "")) 121 FI 122 IF eq(p2, "=") THEN return(eq(nxtarg(0), a)) FI 123 IF eq(p2, "!=") THEN return(!eq(nxtarg(0), a)) FI 124 int1 = atol(a); 125 int2 = atol(nxtarg(0)); 126 IF eq(p2, "-eq") THEN return(int1==int2) FI 127 IF eq(p2, "-ne") THEN return(int1!=int2) FI 128 IF eq(p2, "-gt") THEN return(int1>int2) FI 129 IF eq(p2, "-lt") THEN return(int1<int2) FI 130 IF eq(p2, "-ge") THEN return(int1>=int2) FI 131 IF eq(p2, "-le") THEN return(int1<=int2) FI 132 133 bfailed(btest, badop, p2); 134 } 135 136 tio(a, f) 137 STRING a; 138 INT f; 139 { 140 IF access(a, f)==0 141 THEN return(1); 142 ELSE return(0) 143 FI 144 } 145 146 ftype(f,field) 147 STRING f; 148 INT field; 149 { 150 struct stat statb; 151 152 IF stat(f,&statb)<0 THEN return(0) FI 153 IF (statb.st_mode&field)==field 154 THEN return(1); 155 ELSE return(0) 156 FI 157 } 158 159 fsizep(f) 160 STRING f; 161 { 162 struct stat statb; 163 IF stat(f, &statb) <0 THEN return(0) FI 164 return(statb.st_size>0); 165 } 166