|
|
1.1 ! root 1: /* ! 2: * File: rstruct.c ! 3: * Contents: addmem, cplist, locate, memb ! 4: */ ! 5: ! 6: #include "../h/rt.h" ! 7: /* ! 8: * addmem - add a new set element block in the correct spot in ! 9: * the bucket chain. ! 10: */ ! 11: ! 12: addmem(ps,pe,pl) ! 13: struct descrip *pl; ! 14: struct b_set *ps; ! 15: struct b_selem *pe; ! 16: { ! 17: ps->size++; ! 18: if (!ChkNull(*pl) ) { ! 19: BlkLoc(pe->clink) = BlkLoc(*pl); ! 20: pe->clink.dword = D_Selem; ! 21: } ! 22: BlkLoc(*pl) = (union block *) pe; ! 23: pl->dword = D_Selem; ! 24: } ! 25: ! 26: ! 27: /* ! 28: * cplist(d1,d2,i,j) - copy sublist d1[i:j] into d2. ! 29: */ ! 30: ! 31: cplist(d1, d2, i, j) ! 32: struct descrip *d1, *d2; ! 33: word i, j; ! 34: { ! 35: register struct descrip *dp; ! 36: word size, nelem; ! 37: struct b_list *lp1, *lp2; ! 38: struct b_lelem *bp1, *bp2; ! 39: ! 40: /* ! 41: * Calculate the size of the sublist and fail if it's less than 0. ! 42: * Also round nelem up to the minimum list block size. ! 43: */ ! 44: size = nelem = j - i; ! 45: if (nelem < MinListSlots) ! 46: nelem = MinListSlots; ! 47: ! 48: /* ! 49: * Get pointers to the list and list elements for the source list ! 50: * (bp1, lp1) and the sublist (bp2, lp2). ! 51: */ ! 52: blkreq(sizeof(struct b_list) + sizeof(struct b_lelem) + ! 53: nelem * sizeof(struct descrip)); ! 54: lp1 = (struct b_list *) BlkLoc(*d1); ! 55: bp1 = (struct b_lelem *) BlkLoc(lp1->listhead); ! 56: lp2 = (struct b_list *) alclist(size); ! 57: bp2 = (struct b_lelem *) alclstb(nelem, (word)0, size); ! 58: lp2->listhead.dword = lp2->listtail.dword = D_Lelem; ! 59: BlkLoc(lp2->listhead) = BlkLoc(lp2->listtail) = (union block *) bp2; ! 60: dp = bp2->lslots; ! 61: ! 62: /* ! 63: * Locate the block containing element i in the source list. ! 64: */ ! 65: if (size > 0) { ! 66: while (i > bp1->nused) { ! 67: i -= bp1->nused; ! 68: bp1 = (struct b_lelem *) BlkLoc(bp1->listnext); ! 69: } ! 70: } ! 71: ! 72: /* ! 73: * Copy elements from the source list into the sublist, moving to ! 74: * the next list block in the source list when all elements in a ! 75: * block have been copied. ! 76: */ ! 77: while (size > 0) { ! 78: j = bp1->first + i - 1; ! 79: if (j >= bp1->nelem) ! 80: j -= bp1->nelem; ! 81: *dp++ = bp1->lslots[j]; ! 82: if (++i > bp1->nused) { ! 83: i = 1; ! 84: bp1 = (struct b_lelem *) BlkLoc(bp1->listnext); ! 85: } ! 86: size--; ! 87: } ! 88: ! 89: /* ! 90: * Fix type and location fields for the new list. ! 91: */ ! 92: d2->dword = D_List; ! 93: BlkLoc(*d2) = (union block *) lp2; ! 94: } ! 95: ! 96: ! 97: /* ! 98: * locate - returns 1 if obj is in the hash chain which ! 99: * starts at ep in some set, returns 0 if not there ! 100: * (used only in diff.c and inter.c). ! 101: */ ! 102: ! 103: locate(ep, obj) ! 104: struct b_selem *ep, *obj; ! 105: { ! 106: while (ep != NULL) { ! 107: if (ep->hashnum > obj->hashnum) ! 108: return 0; ! 109: else if ((ep->hashnum == obj->hashnum) && ! 110: (equiv(&ep->setmem, &obj->setmem))) ! 111: return 1; ! 112: ep = (struct b_selem *) BlkLoc(ep->clink); ! 113: } ! 114: return 0; ! 115: } ! 116: ! 117: ! 118: /* ! 119: * memb - sets res flag to 1 if x is a member of set S, ! 120: * sets res flag to 0 if not. ! 121: * Returns pointer to the descriptor which points to ! 122: * the element (or which would point to it if it were ! 123: * there). ! 124: */ ! 125: ! 126: struct descrip *memb(ps,x,hn,res) ! 127: int *res; /* pointer to integer result flag */ ! 128: struct b_set *ps; ! 129: struct descrip *x; ! 130: word hn; ! 131: { ! 132: register struct descrip *lp; ! 133: register struct b_selem *pe; ! 134: extern int equiv(); ! 135: ! 136: lp = &(ps->sbucks[SlotNum(hn,SSlots)]); ! 137: /* ! 138: * Look for x in the hash chain. ! 139: */ ! 140: *res = 0; ! 141: while (BlkLoc(*lp) != NULL) { ! 142: pe = (struct b_selem *) BlkLoc(*lp); ! 143: if ( pe->hashnum > hn) /* too far - it isn't there */ ! 144: return lp; ! 145: else if (( pe->hashnum == hn ) && ( equiv(&pe->setmem, x ))) { ! 146: *res = 1; ! 147: return lp; ! 148: } ! 149: /* ! 150: * We haven't reached the right hashnumber yet or ! 151: * the element isn't the right one so keep looking. ! 152: */ ! 153: lp = &(pe->clink); ! 154: } ! 155: /* ! 156: * At end of chain - not there. ! 157: */ ! 158: return lp; ! 159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.