|
|
BSD 4.3
#include "../h/rt.h"
/*
* pull(x) - pull an element from end of list x.
*/
Xpull(nargs, arg1, arg0)
int nargs;
struct descrip arg1, arg0;
{
register int i;
register struct b_list *hp;
register struct b_lelem *bp;
extern struct b_lelem *alclstb();
/*
* x must be a list.
*/
DeRef(arg1)
if (QUAL(arg1) || TYPE(arg1) != T_LIST)
runerr(108, &arg1);
/*
* Point at list header block and fail if the list is empty.
*/
hp = (struct b_list *) BLKLOC(arg1);
if (hp->cursize <= 0)
fail();
/*
* Point bp at the last list element block. If the last block has no
* elements in use, point bp at the previous list element block.
*/
bp = (struct b_lelem *) BLKLOC(hp->listtail);
if (bp->nused <= 0) {
bp = (struct b_lelem *) BLKLOC(bp->listprev);
BLKLOC(hp->listtail) = (union block *) bp;
bp->listnext = nulldesc;
}
/*
* Set i to position of last element and assign the element to
* arg0 for return. Decrement the usage count for the block
* and the size of the list.
*/
i = bp->first + bp->nused - 1;
if (i >= bp->nelem)
i -= bp->nelem;
arg0 = bp->lslots[i];
bp->nused--;
hp->cursize--;
}
Procblock(pull,1)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.