|
|
BSD 4.3
#include "../h/rt.h"
/*
* equiv - test equivalence of two objects.
*/
equiv(arg1, arg2)
struct descrip *arg1, *arg2;
{
register int result, i;
register char *s1, *s2;
result = 0;
/*
* If the descriptors are identical, the objects are equivalent.
*/
if (arg1->type == arg2->type && BLKLOC(*arg1) == BLKLOC(*arg2))
result = 1;
else if (QUAL(*arg1) && QUAL(*arg2)) {
/*
* Both objects are strings, or one is &null and the other a string,
* If either is &null the other isn't or we wouldn't have
* gotten this far.
* If both are strings of equal length, compare their characters.
*/
if (NULLDESC(*arg1) || NULLDESC(*arg2))
result = 0;
else if ((i = STRLEN(*arg1)) == STRLEN(*arg2)) {
s1 = STRLOC(*arg1);
s2 = STRLOC(*arg2);
result = 1;
while (i--)
if (*s1++ != *s2++) {
result = 0;
break;
}
}
}
else if (arg1->type == arg2->type)
switch (TYPE(*arg1)) {
/*
* For integers and reals, just compare the values.
*/
case T_INTEGER:
result = (INTVAL(*arg1) == INTVAL(*arg2));
break;
#ifdef LONGS
case T_LONGINT:
result =
(BLKLOC(*arg1)->longint.intval == BLKLOC(*arg2)->longint.intval);
break;
#endif LONGS
case T_REAL:
result =
(BLKLOC(*arg1)->realblk.realval == BLKLOC(*arg2)->realblk.realval);
break;
case T_CSET:
/*
* Compare the bit arrays of the csets.
*/
result = 1;
for (i = 0; i < CSETSIZE; i++)
if (BLKLOC(*arg1)->cset.bits[i] != BLKLOC(*arg2)->cset.bits[i]) {
result = 0;
break;
}
}
else
/*
* arg1 and arg2 are of different types, so they can't be
* equivalent.
*/
result = 0;
return (result);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.