/*Copyright (C) 1992, 1996 by Thomas Glen Smith. All Rights Reserved.*/ /* indexmb APL2 V1.0.0 ************************************************ * Recursively called to index an APL array. Called first by indexm. * ***********************************************************************/ #define INCLUDES APLCB+INDEXMI #include "includes.h" int *indexmb(level,p,ixcbp,pix,ixdta,leftp) int level; /* current left dimension */ struct ix *p; /* structure described in "indexmi.h" */ Aplcb *ixcbp; /* current indices aplcb ptr */ int pix; /* current index into ixcb */ int *ixdta; char *leftp; /* current left data ptr */ { Aplcopy; Chrcopy; Endoper; Temp; extern int aplerr; extern int indxorg; Aplcb ixcb,nxtcb,*nxtcbp,wc,wt; int currdim,i,*ip,j,k,nxtix,nxtlev; char *ch,*curl; /* next left data ptr */ ixcb = *ixcbp; /* current index aplcb */ nxtlev = level + 1; /* next level (left dimension) */ nxtix = pix + 1; /* next indx */ if (ixcb->aplrank == 0) currdim = 1; /* current index dimension */ else currdim = *(ixcb->apldim + pix); /* can't be 0 */ for (j = 0; j < currdim; j++) { if (nxtix < ixcb->aplrank) ixdta = indexmb(level,p,ixcbp,nxtix,ixdta,leftp); else { k = *ixdta++ - indxorg; /* next index */ if (k < 0 || k >= *(p->l->apldim + level)) { aplerr = 34; /* index out of range */ return; } curl = leftp + *(p->z + level) * p->l->aplsize * k; if (nxtlev < p->l->aplrank) { nxtcbp = ixcbp + 1; nxtcb = *nxtcbp; /* next index aplcb */ ip = indexmb(nxtlev,p,nxtcbp,0, nxtcb->aplptr.aplint,curl); } else { /* copy indexed data */ if (p->datarite != NULL) { if (p->dtyp & APLAPL) { if (NULL != (wt = *(Aplcb *)curl)) endoper(temp(wt)); *(Aplcb *)curl = aplcopy(*((Aplcb *)(p->datarite))); } else ch = chrcopy(curl,p->datarite,p->siz,1); p->datarite += p->inc; /* bump input ptr */ } if (p->dtyp & APLAPL) *(Aplcb *)(p->dataout) = wc = aplcopy(*(Aplcb *)curl); else p->dataout = chrcopy(p->dataout,curl,p->siz,1); } } } return(ixdta); }