1: #include "../h/rt.h"
   2: 
   3: /*
   4:  * equiv - test equivalence of two objects.
   5:  */
   6: 
   7: equiv(arg1, arg2)
   8: struct descrip *arg1, *arg2;
   9:    {
  10:    register int result, i;
  11:    register char *s1, *s2;
  12: 
  13:    result = 0;
  14: 
  15:       /*
  16:        * If the descriptors are identical, the objects are equivalent.
  17:        */
  18:    if (arg1->type == arg2->type && BLKLOC(*arg1) == BLKLOC(*arg2))
  19:       result = 1;
  20:    else if (QUAL(*arg1) && QUAL(*arg2)) {
  21: 
  22:       /*
  23:        * Both objects are strings, or one is &null and the other a string,
  24:        * If either is &null the other isn't or we wouldn't have
  25:        *  gotten this far.
  26:        *  If both are strings of equal length, compare their characters.
  27:        */
  28: 
  29:       if (NULLDESC(*arg1) || NULLDESC(*arg2))
  30:          result = 0;
  31:       else if ((i = STRLEN(*arg1)) == STRLEN(*arg2)) {
  32:          s1 = STRLOC(*arg1);
  33:          s2 = STRLOC(*arg2);
  34:          result = 1;
  35:          while (i--)
  36:            if (*s1++ != *s2++) {
  37:               result = 0;
  38:               break;
  39:               }
  40:          }
  41:       }
  42:    else if (arg1->type == arg2->type)
  43:       switch (TYPE(*arg1)) {
  44:          /*
  45:           * For integers and reals, just compare the values.
  46:           */
  47:          case T_INTEGER:
  48:             result = (INTVAL(*arg1) == INTVAL(*arg2));
  49:             break;
  50: #ifdef LONGS
  51:          case T_LONGINT:
  52:             result =
  53:                (BLKLOC(*arg1)->longint.intval == BLKLOC(*arg2)->longint.intval);
  54:             break;
  55: #endif LONGS
  56:          case T_REAL:
  57:             result =
  58:                (BLKLOC(*arg1)->realblk.realval == BLKLOC(*arg2)->realblk.realval);
  59:             break;
  60:          case T_CSET:
  61:             /*
  62:              * Compare the bit arrays of the csets.
  63:              */
  64:             result = 1;
  65:             for (i = 0; i < CSETSIZE; i++)
  66:                if (BLKLOC(*arg1)->cset.bits[i] != BLKLOC(*arg2)->cset.bits[i]) {
  67:                   result = 0;
  68:                   break;
  69:                   }
  70:          }
  71:    else
  72:       /*
  73:        * arg1 and arg2 are of different types, so they can't be
  74:        *  equivalent.
  75:        */
  76:       result = 0;
  77: 
  78:    return (result);
  79:    }

Defined functions

Last modified: 1984-11-29
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 816
Valid CSS Valid XHTML 1.0 Strict