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