4.3BSD/usr/contrib/icon/functions/get.c

Compare this file to the similar file:
Show the results in this format:

#include "../h/rt.h"

/*
 * get(x) - get an element from end of list x.
 * Identical to  pop(x).
 */

Xget(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);

   /*
    * Fail if the list is empty.
    */
   hp = (struct b_list *) BLKLOC(arg1);
   if (hp->cursize <= 0)
      fail();

   /*
    * Point bp at the first list block.  If the first block has no
    *  elements in use, point bp at the next list block.
    */
   bp = (struct b_lelem *) BLKLOC(hp->listhead);
   if (bp->nused <= 0) {
      bp = (struct b_lelem *) BLKLOC(bp->listnext);
      BLKLOC(hp->listhead) = (union block *) bp;
      bp->listprev = nulldesc;
      }
   /*
    * Locate first element and assign it to arg0 for return.
    */
   i = bp->first;
   arg0 = bp->lslots[i];
   /*
    * Set bp->first to new first element, or 0 if the block is now
    *  empty.  Decrement the usage count for the block and the size
    *  of the list.
    */
   if (++i >= bp->nelem)
      i = 0;
   bp->first = i;
   bp->nused--;
   hp->cursize--;
   }

Procblock(get,1)