/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* squadix APL2 V1.0.0 ************************************************* * Index function of APL2. * ***********************************************************************/ #define INCLUDES APLCB #include "includes.h" Aplcb squadix(left,rite,axcb,new) Aplcb left,rite,axcb,new; { Aplcopy; Aplnest; Dtacopy; Endoper; Errinit; Errstop; Getcb; Indexm; Integer; Temp; extern int aplerr, indxorg; Aplcb *cb,indices=NULL; int i,*ip,j; for(;;) { if (errinit()) break; if (aplerr) break; if (axcb == NULL) { if (left->aplcount != rite->aplrank) return(errstop(125,left,rite,NULL)); if (rite->aplrank == 0) return(errstop(0,left,rite,temp(aplcopy(rite)))); if (!(left->aplflags & APLAPL)) left = aplnest(left); return(indexm(rite,left,NULL)); } if (!(axcb->aplflags & APLINT)) axcb = integer(axcb); indices = getcb(NULL,rite->aplrank,APLTEMP+APLAPL,1,NULL); if (indices == NULL) break; if (!(left->aplflags & APLAPL)) left = aplnest(left); for (i = 0, ip = axcb->aplptr.aplint; i < axcb->aplcount; i++) if ((0 > (j = *(ip + i) - indxorg)) || j >= rite->aplrank) aplerr = 34; /* index out of range */ else cb = dtacopy(indices->aplptr.aplapl+j, left->aplptr.aplapl+i,1,1,APLAPL); if (aplerr) break; return(errstop(0,left,axcb,indexm(rite,indices,NULL))); break; } if (indices != NULL) endoper(indices); return(errstop(0,left,rite,axcb)); }