Metropoli BBS
VIEWER: execdyat.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* execdyat APL2 V1.0.0 ************************************************
* Called from execdyam and execdyal when the function is scalar dyadic *
* and either of the arguments left or rite are nested.                 *
***********************************************************************/
#define INCLUDES APLCB+FUNSTRUC
#include "includes.h"
Aplcb execdyat(pfun,left,rite,subrtne)
void *pfun; /* Function structure - see funstruc.h. */
Aplcb left,rite; /* One or both are nested. */
Aplcb (*subrtne)(void *, Aplcb, Aplcb); /* Handles unnested dyadic. */
{
	Aplnest; Dyadicm; Errstop; Perm;
	extern int aplerr;
	int i,leftinc,lefttemp,lefttype,riteinc,ritetemp,ritetype;
	Aplcb *dataout, *leftptr, out, *riteptr;
	void *wrk1,*wrk2,*wrk3;

	if (!(left->aplflags & APLAPL)) left = aplnest(left);
	if (!(rite->aplflags & APLAPL)) rite = aplnest(rite);
	wrk1 = &dataout;
	wrk2 = &leftptr;
	wrk3 = &riteptr;
	out=dyadicm(left,rite,wrk1,wrk2,wrk3,
		&leftinc,&riteinc,APLAPL); /* go build APLCB */
	if (aplerr) return(NULL);
	if (out->aplcount==0) return(errstop(0,left,rite,out));
	if (lefttemp = left->aplflags & APLTEMP) left->aplflags -= APLTEMP;
	if (ritetemp = rite->aplflags & APLTEMP) rite->aplflags -= APLTEMP;
	for (i=out->aplcount; i > 0 && aplerr == 0; i--) {
		*dataout++ = perm((*subrtne)(pfun,*leftptr,*riteptr));
		leftptr += leftinc;
		riteptr += riteinc;
	}
	left->aplflags += lefttemp;
	rite->aplflags += ritetemp;
	return(errstop(0,left,rite,out));
}
[ RETURN TO DIRECTORY ]