/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* execspez APL2 V1.0.0 ************************************************ * Called by execspet to perform selective specification, e.g. (Er)#n. * * Execspex will have popped right paren from the stack, established a * * new execstk element to evaluate the expression contained in parens, * * all after confirming it is indeed selective specification format. * ***********************************************************************/ #define INCLUDES APLCHDEF+APLTOKEN+APLCB+TREE #include "includes.h" Aplcb execspez(tok, axistok, op, leftorig, left, pnwa) Apltoken tok, /* Token for E in e.g. (Er)#n. */ axistok, /* Token for x in e.g. (E[x]r)#n. */ op; /* Token for r in e.g. (Er)#n. */ Aplcb leftorig; /* Original variable to which to selectively assign. */ Aplcb left; /* 0,1,2,... in the shape of leftorig. */ int *pnwa; /* Not-Whole-Array indicator. */ { Enlist; Execfree; Execspeg; Execspes; Exectok; Integer; extern Treelist treehdr; extern int aplerr; extern int indxorg; int i,*ip,j; Aplcb out=NULL; for (;;) { /* lets me use break */ if (aplerr) break; i = 0; out = execspeg(tok, axistok, exectok(left, op->token_offset), pnwa); /* Select indices for selective assignment. */ tok = axistok = NULL; out = execspes(out); /* Ensure result in proper form. */ break; } execfree(tok); execfree(axistok); return(out); /* indicate selective specification handled */ }