1 /*
2  *      test expression
3  *      [ expression ]
4  */
5 
6 #include	"defs.h"
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #define exp exp_
10 
11 INT	ap, ac;
12 STRING	*av;
13 
14 test(argn, com)
15 	STRING com[];
16 	INT argn;
17 {
18 
19 
20         ac = argn; av = com; ap = 1;
21         IF eq(com[0],"[")
22 	THEN	IF !eq(com[--ac], "]")
23 		THEN	failed("test", "] missing");
24 		FI
25 	FI
26         com[ac] = 0;
27 	IF ac <= 1 THEN return(1) FI
28         return(exp()?0:1);
29 }
30 
31 STRING	nxtarg(mt)	{
32 
33 	IF ap >= ac
34 	THEN	IF mt
35 		THEN	ap++;
36                         return(0);
37 		FI
38 		failed("test", "argument expected");
39 	FI
40         return(av[ap++]);
41 }
42 
43 exp() {
44         INT p1;
45 	STRING	p2;
46 
47         p1 = e1();
48         p2 = nxtarg(1);
49 	IF eq(p2, "-o")	THEN return(p1 | exp()) FI
50         IF (p2!=0)&&!eq(p2,"]")&&!eq(p2,")")
51 	THEN	failed("test", synmsg);
52 	FI
53         ap--;
54         return(p1);
55 }
56 
57 e1() {
58         INT p1;
59 
60         p1 = e2();
61 	IF eq(nxtarg(1), "-a") THEN return(p1 & e1()) FI
62         ap--;
63         return(p1);
64 }
65 
66 e2() {
67         IF eq(nxtarg(0), "!")
68 	THEN	return(!e3())
69 	FI
70         ap--;
71         return(e3());
72 }
73 
74 e3() {
75         INT p1;
76 	REG STRING	a;
77 	STRING	p2;
78 	L_INT	atol();
79         L_INT int1, int2;
80 
81         a=nxtarg(0);
82         IF eq(a, "(")
83 	THEN	p1 = exp();
84                 IF !eq(nxtarg(0), ")") THEN failed("test",") expected") FI
85                 return(p1);
86 	FI
87 
88         p2 = nxtarg(1);
89         ap--;
90         IF !eq(p2,"=")&&!eq(p2,"!=")
91 	THEN	IF eq(a, "-r") THEN return(tio(nxtarg(0), 4)) FI
92 		IF eq(a, "-w") THEN return(tio(nxtarg(0), 2)) FI
93 		IF eq(a, "-x") THEN return(tio(nxtarg(0), 1)) FI
94 		IF eq(a, "-d") THEN return(ftype(nxtarg(0), S_IFDIR)) FI
95 		IF eq(a, "-c") THEN return(ftype(nxtarg(0),S_IFCHR)) FI
96 		IF eq(a, "-b") THEN return(ftype(nxtarg(0), S_IFBLK)) FI
97 		IF eq(a, "-f") THEN return(ftype(nxtarg(0), S_IFREG)) FI
98 		IF eq(a, "-u") THEN return(ftype(nxtarg(0), S_ISUID)) FI
99 		IF eq(a, "-g") THEN return(ftype(nxtarg(0), S_ISGID)) FI
100 		IF eq(a, "-k") THEN return(ftype(nxtarg(0), S_ISVTX)) FI
101 		IF eq(a, "-s") THEN return(fsizep(nxtarg(0))) FI
102 		IF eq(a, "-t")
103 		THEN	IF ap >= ac	/* no args */
104 			THEN return(isatty(1));
105 			ELIF eq((a=nxtarg(0)), "-a")
106 				ORF eq(a, "-o")
107 			     THEN	ap--;
108 					return(isatty(1));
109 			ELSE return(isatty(atol(a)));
110 			FI
111 		FI
112 		IF eq(a, "-n") THEN return(!eq(nxtarg(0), "")) FI
113 		IF eq(a, "-z") THEN return(eq(nxtarg(0), "")) FI
114 	FI
115 
116         p2 = nxtarg(1);
117 	IF p2==0 THEN return(!eq(a, "")) FI
118 	IF eq(p2, "-a") ORF eq(p2, "-o")
119 	THEN	ap--;
120 		return(!eq(a, ""))
121 	FI
122 	IF eq(p2, "=") THEN return(eq(nxtarg(0), a)) FI
123 	IF eq(p2, "!=") THEN return(!eq(nxtarg(0), a)) FI
124         int1 = atol(a);
125         int2 = atol(nxtarg(0));
126 	IF eq(p2, "-eq") THEN return(int1==int2) FI
127 	IF eq(p2, "-ne") THEN return(int1!=int2) FI
128 	IF eq(p2, "-gt") THEN return(int1>int2) FI
129 	IF eq(p2, "-lt") THEN return(int1<int2) FI
130 	IF eq(p2, "-ge") THEN return(int1>=int2) FI
131 	IF eq(p2, "-le") THEN return(int1<=int2) FI
132 
133 	bfailed(btest, badop, p2);
134 }
135 
136 tio(a, f)
137 	STRING	a;
138 	INT f;
139 {
140 	IF access(a, f)==0
141 	THEN	return(1);
142 	ELSE	return(0)
143 	FI
144 }
145 
146 ftype(f,field)
147 	STRING	f;
148 	INT field;
149 {
150         struct stat statb;
151 
152 	IF stat(f,&statb)<0 THEN return(0) FI
153 	IF (statb.st_mode&field)==field
154 	THEN	return(1);
155 	ELSE	return(0)
156 	FI
157 }
158 
159 fsizep(f)
160 	STRING	f;
161 {
162         struct stat statb;
163 	IF stat(f, &statb) <0 THEN return(0) FI
164         return(statb.st_size>0);
165 }
166