|
|
1.1 root 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: int ap;
12: int ac;
13: char **av;
14: char *tmp;
15:
16: main(argc, argv)
17: char *argv[];
18: {
19:
20: ac = argc; av = argv; ap = 1;
21: if(EQ(argv[0],"[")) {
22: if(!EQ(argv[--ac],"]"))
23: synbad("] missing","");
24: }
25: argv[ac] = 0;
26: if (ac<=1) exit(1);
27: exit(exp()?0:1);
28: }
29:
30: char *nxtarg(mt) {
31:
32: if (ap>=ac) {
33: if(mt) {
34: ap++;
35: return(0);
36: }
37: synbad("argument expected","");
38: }
39: return(av[ap++]);
40: }
41:
42: exp() {
43: int p1;
44:
45: p1 = e1();
46: if (EQ(nxtarg(1), "-o")) return(p1 | exp());
47: ap--;
48: return(p1);
49: }
50:
51: e1() {
52: int p1;
53:
54: p1 = e2();
55: if (EQ(nxtarg(1), "-a")) return (p1 & e1());
56: ap--;
57: return(p1);
58: }
59:
60: e2() {
61: if (EQ(nxtarg(0), "!"))
62: return(!e3());
63: ap--;
64: return(e3());
65: }
66:
67: e3() {
68: int p1;
69: register char *a;
70: char *p2;
71: int int1, int2;
72:
73: a=nxtarg(0);
74: if(EQ(a, "(")) {
75: p1 = exp();
76: if(!EQ(nxtarg(0), ")")) synbad(") expected","");
77: return(p1);
78: }
79:
80: if(EQ(a, "-r"))
81: return(tio(nxtarg(0), 4));
82:
83: if(EQ(a, "-w"))
84: return(tio(nxtarg(0), 2));
85:
86: if(EQ(a, "-x"))
87: return(tio(nxtarg(0), 1));
88:
89: if(EQ(a, "-d"))
90: return(ftype(nxtarg(0),S_IFDIR));
91:
92: if(EQ(a, "-c"))
93: return(ftype(nxtarg(0),S_IFCHR));
94:
95: if(EQ(a, "-b"))
96: return(ftype(nxtarg(0),S_IFBLK));
97:
98: if(EQ(a, "-L"))
99: return(ftype(nxtarg(0),S_IFLNK));
100:
101: if(EQ(a, "-f"))
102: return(ftype(nxtarg(0),S_IFREG));
103:
104: if(EQ(a, "-u"))
105: return(ftype(nxtarg(0),S_ISUID));
106:
107: if(EQ(a, "-g"))
108: return(ftype(nxtarg(0),S_ISGID));
109:
110: if(EQ(a, "-s"))
111: return(fsizep(nxtarg(0)));
112:
113: if(EQ(a, "-t"))
114: if(ap>=ac)
115: return(isatty(1));
116: else
117: return(isatty(atoi(nxtarg(0))));
118:
119: if(EQ(a, "-n"))
120: return(!EQ(nxtarg(0), ""));
121: if(EQ(a, "-z"))
122: return(EQ(nxtarg(0), ""));
123:
124: p2 = nxtarg(1);
125: if (p2==0)
126: return(!EQ(a,""));
127: if(EQ(p2, "="))
128: return(EQ(nxtarg(0), a));
129:
130: if(EQ(p2, "!="))
131: return(!EQ(nxtarg(0), a));
132:
133: if(EQ(a, "-l")) {
134: int1=length(p2);
135: p2=nxtarg(0);
136: } else{ int1=atoi(a);
137: }
138: int2 = atoi(nxtarg(0));
139: if(EQ(p2, "-eq"))
140: return(int1==int2);
141: if(EQ(p2, "-ne"))
142: return(int1!=int2);
143: if(EQ(p2, "-gt"))
144: return(int1>int2);
145: if(EQ(p2, "-lt"))
146: return(int1<int2);
147: if(EQ(p2, "-ge"))
148: return(int1>=int2);
149: if(EQ(p2, "-le"))
150: return(int1<=int2);
151:
152: synbad("unknown operator ",p2);
153: }
154:
155: tio(a, f)
156: char *a;
157: int f;
158: {
159:
160: return access (a, f) >= 0;
161: }
162:
163: ftype(f, field)
164: char *f;
165: int field;
166: {
167: struct stat statb;
168:
169: if(stat(f,&statb)<0)
170: return(0);
171: if((statb.st_mode&S_IFMT)==field)
172: return(1);
173: return(0);
174: }
175:
176: fsizep(f)
177: char *f;
178: {
179: struct stat statb;
180: if(stat(f,&statb)<0)
181: return(0);
182: return(statb.st_size>0);
183: }
184:
185: synbad(s1,s2)
186: char *s1, *s2;
187: {
188: write(2, "test: ", 6);
189: write(2, s1, strlen(s1));
190: write(2, s2, strlen(s2));
191: write(2, "\n", 1);
192: exit(255);
193: }
194:
195: length(s)
196: char *s;
197: {
198: char *es=s;
199: while(*es++);
200: return(es-s-1);
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.