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