|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)test.c 4.2 (Berkeley) 5/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.