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