Metropoli BBS
VIEWER: without.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* without APL2 V1.0.0 *************************************************
* Yields a vector of the items in left not occurring in rite.          *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb without(Aplcb left, Aplcb rite)
{
     extern int aplerr;
     Aplcopy; Aplfree; Aplmall; Aplmatci; Dtacopy; Errinit; Errstop;
     Fifo; Getcb; Pop; Temp;
     struct qlist { struct qlist *qnext; Apluptr qel; }
          *qhdr,*qcur,*qnxt;
     int datacnt,i,j,lefttype,ritetype;
     Apluptr ld,rd;
     Aplcb out;

     if (errinit())
          return(errstop(0,left,rite,NULL));
     lefttype = left->aplflags & (APLMASK + APLAPL);
     ritetype = rite->aplflags & (APLMASK + APLAPL);
     if (left->aplcount == 0 || rite->aplcount == 0 ||
         (lefttype != ritetype &&
          !((lefttype | ritetype & APLAPL) ||
           ((lefttype | ritetype) == (APLINT | APLNUMB)))))
          return(errstop(0,left,rite,temp(aplcopy(left))));
     datacnt = 0;
     qcur = qhdr = NULL; /* start of chain */
     for (i = left->aplcount, ld = left->aplptr; i; i--) {
          for (j = rite->aplcount, rd = rite->aplptr; j; j--) {
               if (aplmatci(ld, rd, lefttype, ritetype)) break;
               rd.aplchar += rite->aplsize;
          }
          if (j == 0) { /* no match */
               datacnt++; /* count of non matches */
               qcur = fifo(&qhdr,qcur,aplmall(sizeof(struct qlist)));
               if (aplerr) break;
               qcur->qel = ld; /* save non match pointer */
          }
          ld.aplchar += left->aplsize;
     }
     if (aplerr)
          out = NULL;
     else out=getcb(NULL,datacnt,lefttype+APLTEMP,1,NULL);
     if (!aplerr) ld = out->aplptr;
     while (NULL != (qcur = pop(&qhdr))) {
          if (!aplerr) ld.aplchar = dtacopy((void *)(ld.aplchar),
               (void *)(qcur->qel.aplchar),1,1,lefttype);
          aplfree(qcur);
     }
     return(errstop(0,left,rite,out));
}
[ RETURN TO DIRECTORY ]