|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: ! 3: /* ! 4: * pull(x) - pull an element from end of list x. ! 5: */ ! 6: ! 7: Xpull(nargs, arg1, arg0) ! 8: int nargs; ! 9: struct descrip arg1, arg0; ! 10: { ! 11: register int i; ! 12: register struct b_list *hp; ! 13: register struct b_lelem *bp; ! 14: extern struct b_lelem *alclstb(); ! 15: ! 16: /* ! 17: * x must be a list. ! 18: */ ! 19: DeRef(arg1) ! 20: if (QUAL(arg1) || TYPE(arg1) != T_LIST) ! 21: runerr(108, &arg1); ! 22: ! 23: /* ! 24: * Point at list header block and fail if the list is empty. ! 25: */ ! 26: hp = (struct b_list *) BLKLOC(arg1); ! 27: if (hp->cursize <= 0) ! 28: fail(); ! 29: /* ! 30: * Point bp at the last list element block. If the last block has no ! 31: * elements in use, point bp at the previous list element block. ! 32: */ ! 33: bp = (struct b_lelem *) BLKLOC(hp->listtail); ! 34: if (bp->nused <= 0) { ! 35: bp = (struct b_lelem *) BLKLOC(bp->listprev); ! 36: BLKLOC(hp->listtail) = (union block *) bp; ! 37: bp->listnext = nulldesc; ! 38: } ! 39: /* ! 40: * Set i to position of last element and assign the element to ! 41: * arg0 for return. Decrement the usage count for the block ! 42: * and the size of the list. ! 43: */ ! 44: i = bp->first + bp->nused - 1; ! 45: if (i >= bp->nelem) ! 46: i -= bp->nelem; ! 47: arg0 = bp->lslots[i]; ! 48: bp->nused--; ! 49: hp->cursize--; ! 50: } ! 51: ! 52: Procblock(pull,1)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.