Metropoli BBS
VIEWER: dyadicp.c MODE: TEXT (ASCII)
/* Copyright (C) 1994 by Thomas Glen Smith.	All Rights Reserved. */
/* dyadicp APL2 V1.0.0 *************************************************
* Called from execdyal, execdyam, to perform dyadic scalar processing, *
* if possible.  Differs from Dyadic in that is uses procedure calls	 *
* instead of functions, allowing a common loop for all data types.	 *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+FUNCODES+FUNSTRUC
#include "includes.h"
Aplcb dyadicp(fun, left, rite)
void *fun;		 /* Describes the scalar dyadic. */
Aplcb left,rite;	 /* Operands. */
{
	Dyadicm; Dyadrun; Dyadset; Errstop; Genint;
	extern int aplerr;
	SCALAR_PROC oper=NULL;
	char *dataout,*leftptr,*riteptr;
	int i,linc,ltype,otype,rinc,rtype;
	Aplcb big,out=NULL;

	for (;;) {
		oper = dyadset(fun, &left, &rite, &otype);
		if (oper == NULL) aplerr = 1;
		if (aplerr) break;
		ltype = left->aplflags & APLMASK;
		rtype = rite->aplflags & APLMASK;
		if ((ltype != rtype) && ((ltype | rtype) & APLCHAR) &&
			(((Codes *)fun)->funky_flags == EQNE)) {
	          	big = (left->aplrank > rite->aplrank) ? left : rite;
				return(errstop(0,left,rite,genint(big,
					((Codes *)fun)->funky_code == NOT_EQUAL)));
		}
		out=dyadicm(left, rite,
			(void **)&dataout, (void **)&leftptr, (void **)&riteptr,
			&linc, &rinc, otype); /* go build APLCB */
          if (aplerr) return(errstop(0,NULL,NULL,out)); /* dyadicm freed */
		out = dyadrun(oper,left,rite,out); /* Go apply scalar. */
     	break; /* final break from for(;;) */
     }
     return(errstop(0,left,rite,out));
}
[ RETURN TO DIRECTORY ]