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