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
main(argc,argv)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
nxtarg(mt)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
exp()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
e1()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
e2()84 e2() {
85 if (EQ(nxtarg(0), "!"))
86 return(!e3());
87 ap--;
88 return(e3());
89 }
90
e3()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
tio(a,f)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
ftype(f)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
fsizep(f)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
synbad(s1,s2)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
length(s)205 length(s)
206 char *s;
207 {
208 char *es=s;
209 while(*es++);
210 return(es-s-1);
211 }
212