|
|
1.1 root 1: /*
2: * File: ocomp.c
3: * Contents: lexeq, lexge, lexgt, lexle, lexlt, lexne, numeq, numge,
4: * numgt, numle, numlt, numne, eqv, neqv
5: */
6:
7: #include "../h/rt.h"
8:
9: /*
10: * x == y - test if x is lexically equal to y.
11: */
12:
13: OpDcl(lexeq,2,"==")
14: {
15: register int t;
16: word i;
17: register char *s1, *s2;
18: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
19: extern char *alcstr();
20:
21: /*
22: * x and y must be strings. Save the cvstr return value for y because
23: * y is the result (if any).
24: */
25: if (cvstr(&Arg1, sbuf1) == NULL)
26: runerr(103, &Arg1);
27: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
28: runerr(103, &Arg2);
29:
30: /*
31: * If the strings have different lengths they can't be equal
32: */
33: if (StrLen(Arg1) != StrLen(Arg2))
34: Fail;
35:
36: /*
37: * compare the strings
38: */
39: i = StrLen(Arg1);
40: s1 = StrLoc(Arg1);
41: s2 = StrLoc(Arg2);
42: while (i--)
43: if (*s1++ != *s2++)
44: Fail;
45:
46: /*
47: * Return y as the result of the comparison. If y was converted to
48: * a string, a copy of it is allocated.
49: */
50: Arg0 = Arg2;
51: if (t == Cvt) {
52: strreq(StrLen(Arg0));
53: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
54: }
55: Return;
56: }
57:
58:
59: /*
60: * x >>= y - test if x is lexically greater than or equal to y.
61: */
62:
63: OpDcl(lexge,2,">>=")
64: {
65: register int t;
66: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
67: extern char *alcstr();
68:
69: /*
70: * x and y must be strings. Save the cvstr return value for y because
71: * y is the result (if any).
72: */
73: if (cvstr(&Arg1, sbuf1) == NULL)
74: runerr(103, &Arg1);
75: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
76: runerr(103, &Arg2);
77:
78: /*
79: * lexcmp does the work.
80: */
81: if (lexcmp(&Arg1, &Arg2) < 0)
82: Fail;
83:
84: /*
85: * Return y as the result of the comparison. If y was converted to
86: * a string, a copy of it is allocated.
87: */
88: Arg0 = Arg2;
89: if (t == Cvt) {
90: strreq(StrLen(Arg0));
91: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
92: }
93: Return;
94: }
95:
96:
97: /*
98: * x >> y - test if x is lexically greater than y.
99: */
100:
101: OpDcl(lexgt,2,">>")
102: {
103: register int t;
104: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
105: extern char *alcstr();
106:
107: /*
108: * x and y must be strings. Save the cvstr return value for y because
109: * y is the result (if any).
110: */
111: if (cvstr(&Arg1, sbuf1) == NULL)
112: runerr(103, &Arg1);
113: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
114: runerr(103, &Arg2);
115:
116: /*
117: * lexcmp does the work.
118: */
119: if (lexcmp(&Arg1, &Arg2) <= 0)
120: Fail;
121:
122: /*
123: * Return y as the result of the comparison. If y was converted to
124: * a string, a copy of it is allocated.
125: */
126: Arg0 = Arg2;
127: if (t == Cvt) {
128: strreq(StrLen(Arg0));
129: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
130: }
131: Return;
132: }
133:
134:
135: /*
136: * x <<= y - test if x is lexically less than or equal to y.
137: */
138:
139: OpDcl(lexle,2,"<<=")
140: {
141: register int t;
142: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
143: extern char *alcstr();
144:
145: /*
146: * x and y must be strings. Save the cvstr return value for y because
147: * y is the result (if any).
148: */
149: if (cvstr(&Arg1, sbuf1) == NULL)
150: runerr(103, &Arg1);
151: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
152: runerr(103, &Arg2);
153:
154: /*
155: * lexcmp does the work.
156: */
157: if (lexcmp(&Arg1, &Arg2) > 0)
158: Fail;
159:
160: /*
161: * Return y as the result of the comparison. If y was converted to
162: * a string, a copy of it is allocated.
163: */
164: Arg0 = Arg2;
165: if (t == Cvt) {
166: strreq(StrLen(Arg0));
167: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
168: }
169: Return;
170: }
171:
172:
173: /*
174: * x << y - test if x is lexically less than y.
175: */
176:
177: OpDcl(lexlt,2,"<<")
178: {
179: register int t;
180: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
181: extern char *alcstr();
182:
183: /*
184: * x and y must be strings. Save the cvstr return value for y because
185: * y is the result (if any).
186: */
187: if (cvstr(&Arg1, sbuf1) == NULL)
188: runerr(103, &Arg1);
189: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
190: runerr(103, &Arg2);
191:
192: /*
193: * lexcmp does the work.
194: */
195: if (lexcmp(&Arg1, &Arg2) >= 0)
196: Fail;
197:
198: /*
199: * Return y as the result of the comparison. If y was converted to
200: * a string, a copy of it is allocated.
201: */
202: Arg0 = Arg2;
203: if (t == Cvt) { /* string needs to be allocated */
204: strreq(StrLen(Arg0));
205: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
206: }
207: Return;
208: }
209:
210:
211: /*
212: * x ~== y - test if x is lexically not equal to y.
213: */
214:
215: OpDcl(lexne,2,"~==")
216: {
217: register int t;
218: char sbuf1[MaxCvtLen], sbuf2[MaxCvtLen];
219: extern char *alcstr();
220:
221: /*
222: * x and y must be strings. Save the cvstr return value for y because
223: * y is the result (if any).
224: */
225: if (cvstr(&Arg1, sbuf1) == NULL)
226: runerr(103, &Arg1);
227: if ((t = cvstr(&Arg2, sbuf2)) == NULL)
228: runerr(103, &Arg2);
229:
230: /*
231: * lexcmp does the work.
232: */
233: if (lexcmp(&Arg1, &Arg2) == 0)
234: Fail;
235:
236: /*
237: * Return y as the result of the comparison. If y was converted to
238: * a string, a copy of it is allocated.
239: */
240: Arg0 = Arg2;
241: if (t == Cvt) { /* string needs to be allocated */
242: strreq(StrLen(Arg0));
243: StrLoc(Arg0) = alcstr(StrLoc(Arg0), StrLen(Arg0));
244: }
245: Return;
246: }
247:
248:
249: /*
250: * x = y - test if x is numerically equal to y.
251: */
252:
253: OpDcl(numeq,2,"=")
254: {
255:
256: if (numcmp(&Arg1, &Arg2, &Arg0) != 0)
257: Fail;
258: Return;
259: }
260:
261:
262: /*
263: * x >= y - test if x is numerically greater or equal to y.
264: */
265:
266: OpDcl(numge,2,">=")
267: {
268:
269: if (numcmp(&Arg1, &Arg2, &Arg0) < 0)
270: Fail;
271: Return;
272: }
273:
274:
275: /*
276: * x > y - test if x is numerically greater than y.
277: */
278:
279: OpDcl(numgt,2,">")
280: {
281:
282: if (numcmp(&Arg1, &Arg2, &Arg0) <= 0)
283: Fail;
284: Return;
285: }
286:
287:
288: /*
289: * x <= y - test if x is numerically less than or equal to y.
290: */
291:
292: OpDcl(numle,2,"<=")
293: {
294:
295: if (numcmp(&Arg1, &Arg2, &Arg0) > 0)
296: Fail;
297: Return;
298: }
299:
300:
301: /*
302: * x < y - test if x is numerically less than y.
303: */
304:
305: OpDcl(numlt,2,"<")
306: {
307:
308: if (numcmp(&Arg1, &Arg2, &Arg0) >= 0)
309: Fail;
310: Return;
311: }
312:
313:
314: /*
315: * x ~= y - test if x is numerically not equal to y.
316: */
317:
318: OpDcl(numne,2,"~=")
319:
320: {
321:
322: if (numcmp(&Arg1, &Arg2, &Arg0) == 0)
323: Fail;
324: Return;
325: }
326:
327:
328: /*
329: * x === y - test equivalence of x and y.
330: */
331:
332: OpDcl(eqv,2,"===")
333: {
334:
335: /*
336: * Let equiv do all the work, failing if equiv indicates non-equivalence.
337: */
338: if (!equiv(&Arg1, &Arg2))
339: Fail;
340:
341: Arg0 = Arg2;
342: Return;
343: }
344:
345:
346: /*
347: * x ~=== y - test inequivalence of x and y.
348: */
349:
350: OpDcl(neqv,2,"~===")
351: {
352:
353: /*
354: * equiv does all the work.
355: */
356: if (equiv(&Arg1, &Arg2))
357: Fail;
358: Arg0 = Arg2;
359: Return;
360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.