/* Copyright (C) 1994 by Thomas Glen Smith. All Rights Reserved. */ /* execspei APL2 V1.0.0 ************************************************ * Called by execspeh to do selective assignment for a single index * * value, and recursively by itself. Returns 1 when assignment done. * ***********************************************************************/ #define INCLUDES APLCB #include "includes.h" int execspei(pleftorig, left, rite, ix) Aplcb *pleftorig,/* Variable, elements to which assignment is made. */ /* Call this "original-left". */ left, /* Variable from which indices were selected. Same */ /* shape as leftorig, but with unique indices for */ /* values. Call this "pseudo-left". */ rite; /* Variable to be assigned from. */ int ix; /* Index into leftorig to element to replace with */ /* rite. */ { Endoper; Execspei; Execspej; Temp; extern int aplerr; Aplcb leftorig,leftsave,*lp,*lop; int i,*ip,k=0; leftorig = *pleftorig; if (left->aplflags & APLAPL) { /* --------------------------------------------------------- * * Continue recursion until we get to the depth where indices * * values can be examined. Remember, "pseudo-left" has same * * shape as "original-left" but values are unique numbers * * representing relative position of each scalar. * * ----------------------------------------------------------*/ lp = left->aplptr.aplapl; lop = leftorig->aplptr.aplapl; i = left->aplcount; while(i--) { leftsave = *(lop+i); if (k = execspei(lop+i,*(lp+i),rite,ix)) break; } if (i >= 0 && leftsave != *(lop+i)) endoper(temp(leftsave)); return(k); /* indicate assignment done */ } ip = left->aplptr.aplint; /* pointer in "pseudo-left" to indices. */ if (!(ix >= (k = *ip) && ix <= *(ip+left->aplcount-1))) return(0); /* Assignment not in this variable. */ return(execspej(pleftorig,rite,ix - k)); /* Do assignment. */ }