|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: #ifdef SETS ! 3: ! 4: /* ! 5: * set(list) - create a set with members in list. ! 6: * The members are linked into hash chains which are ! 7: * arranged in increasing order by hash number. ! 8: */ ! 9: Xset(nargs,arg1,arg0) ! 10: int nargs; ! 11: struct descrip arg1, arg0; ! 12: { ! 13: register int hn; ! 14: register struct descrip *pd; ! 15: register struct b_set *ps; ! 16: union block *pb; ! 17: struct b_selem *ne; ! 18: struct descrip *pe; ! 19: int res, i, j; ! 20: extern struct descrip *memb(); ! 21: extern struct b_set *alcset(); ! 22: extern struct b_selem *alcselem(); ! 23: ! 24: DeRef(arg1) ! 25: if (QUAL(arg1) || TYPE(arg1) != T_LIST) ! 26: runerr(108,&arg1); ! 27: ! 28: hneed(sizeof(struct b_set) + (BLKLOC(arg1)->list.cursize * ! 29: sizeof(struct b_selem))); ! 30: ! 31: pb = BLKLOC(arg1); ! 32: arg0.type = D_SET; ! 33: ps = alcset(); ! 34: BLKLOC(arg0) = (union block *) ps; ! 35: /* ! 36: * Chain through each list block and for ! 37: * each element contained in the block ! 38: * insert the element into the set if not there. ! 39: */ ! 40: for (arg1 = pb->list.listhead; arg1.type == D_LELEM; ! 41: arg1 = BLKLOC(arg1)->lelem.listnext) { ! 42: pb = BLKLOC(arg1); ! 43: for (i = 0; i < pb->lelem.nused; i++) { ! 44: j = pb->lelem.first + i; ! 45: if (j >= pb->lelem.nelem) ! 46: j -= pb->lelem.nelem; ! 47: pd = &pb->lelem.lslots[j]; ! 48: pe = memb(ps, pd, hn = hash(pd), &res); ! 49: if (res == 0) { ! 50: ne = alcselem(pd,hn); ! 51: addmem(ps,ne,pe); ! 52: } ! 53: } ! 54: } ! 55: } ! 56: ! 57: Procblock(set,1) ! 58: #else SETS ! 59: char junk; /* prevent null object file */ ! 60: #endif SETS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.