Metropoli BBS
VIEWER: execspef.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* execspef APL2 V1.0.0 ************************************************
* Called by execsper and execspet to perform selective specification,  *
* e.g. (Er)#n, after the desired indices have been generated.          *
***********************************************************************/
#define INCLUDES APLCB+APLTOKEN+TREE
#include "includes.h"
Apltoken execspef(lefttok, leftorig, left, indices, nwa)
Apltoken lefttok;	/* Token for leftorig. */
Aplcb    leftorig;	/* Variable to which selective assignment is to	*/
				/* be made.								*/
Aplcb    left;		/* Variable of same shape as leftorig, but with	*/
				/* indices as values.						*/
Aplcb    indices;	/* Simple array of integer index values.		*/
int	    nwa;		/* Non-zero if first, pick.    				*/
{
	Assign; Dtacopy; Execfree; Execgetp; Execspeh; Execspen; Exectok;
	Matchok; Pop; Temp;
	extern Treelist treehdr;
	extern int aplerr;
	Apltoken ritetok=NULL;
	Aplcb rite=NULL,saveorig;
	char *ld, *rd, *td;
	int hit,i,*ip,j,off,size,tempsave,type;

	for (;;) { /* lets me use break */
		ritetok = pop(&(treehdr->avlexec->avloprst));
		if (ritetok == NULL) { aplerr = 59; break; }
		off = ritetok->token_offset;
		rite = execgetp(ritetok); /* get rite aplcb, free ritetok */
		if (aplerr) break;
		tempsave = rite->aplflags & APLTEMP;
		if (tempsave) rite->aplflags -= APLTEMP;
		saveorig = leftorig;
		hit = (nwa) ? 
			execspen(&leftorig, left, rite, indices->aplptr.aplint,
				indices->aplcount)
			:
			execspeh(&leftorig, left, rite, indices->aplptr.aplint,
				indices->aplcount);
		if (saveorig != leftorig)
			leftorig = assign(lefttok->token_ptr.token_string,
				temp(leftorig));
		break;
	}
	execfree(lefttok);
	endoper(indices);
	rite->aplflags += tempsave;
	return(exectok(rite,off)); /* Return result operand token. */
}
[ RETURN TO DIRECTORY ]