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