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