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