xref: /original-bsd/old/test/test.c (revision bd226a66)
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