|
|
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: #define DIR 1
12: #define FIL 2
13: int ap;
14: int ac;
15: char **av;
16: char *tmp;
17:
18: main(argc, argv)
19: char *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:
32: char *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:
44: exp() {
45: int p1;
46:
47: p1 = e1();
48: if (EQ(nxtarg(1), "-o")) return(p1 | exp());
49: ap--;
50: return(p1);
51: }
52:
53: e1() {
54: int p1;
55:
56: p1 = e2();
57: if (EQ(nxtarg(1), "-a")) return (p1 & e1());
58: ap--;
59: return(p1);
60: }
61:
62: e2() {
63: if (EQ(nxtarg(0), "!"))
64: return(!e3());
65: ap--;
66: return(e3());
67: }
68:
69: e3() {
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:
139: tio(a, f)
140: char *a;
141: int f;
142: {
143:
144: f = open(a, f);
145: if (f>=0) {
146: close(f);
147: return(1);
148: }
149: return(0);
150: }
151:
152: ftype(f)
153: char *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:
164: fsizep(f)
165: char *f;
166: {
167: struct stat statb;
168: if(stat(f,&statb)<0)
169: return(0);
170: return(statb.st_size>0);
171: }
172:
173: synbad(s1,s2)
174: char *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:
183: length(s)
184: char *s;
185: {
186: char *es=s;
187: while(*es++);
188: return(es-s-1);
189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.