Metropoli BBS
VIEWER: eachdyad.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* eachdyad APL2 V1.0.0 ************************************************
* Called from each to handle a dyadic derived function.			 *
***********************************************************************/
#define INCLUDES APLDERIV+APLCB+FUNCODES
#include "includes.h"
Aplcb eachdyad(dp,left,rite)
Aplderiv dp; /* function describing derived function */
Aplcb left,rite; /* arguments */
{
	Axisdft; Eachdyae; Eachdyaf; Errstop; Execdyan; Execdyas; Laminate;
	Mod;
	Aplcb out=NULL;
	int i=NO_TYPE;

	if (DERIVED_FUNCTION == dp->deriv_left.funcode) {
		dp->deriv_left.type = DRV;
		dp->deriv_left.func.drv =
			((Aplderiv)(dp->deriv_left.fun))->deriv_func;
	}
	else {
		i = ((Codes *)(dp->deriv_left.fun))->funky_flags;
		if (i & SCALAR) /* each is spurious for builtin scalars */
			return(execdyan(dp->deriv_left.funcode, dp->deriv_left.fun,
				left,rite));
	}
	if (mod(dp->deriv_axis_dbl,1.0) != 0.0)
		if (i == MIXC) {
			dp->deriv_left.type = DBX;
			dp->deriv_left.func.dbx = laminate;
		}
		else return(errstop(9,left,rite,NULL)); /* invalid axis */
	else if (DERIVED_FUNCTION != dp->deriv_left.funcode) {
		dp->deriv_left.type = execdyas(dp->deriv_left.fun,
			&(dp->deriv_left.sdp),&(dp->deriv_left.func));
		switch (dp->deriv_left.type) {
			case DOX:
			case DIX:
			case DNL:
				break;
			case WAX:
				if (dp->deriv_axis_int < 0)
					dp->deriv_axis_int =
						axisdft((Codes *)(dp->deriv_left.fun),
							((left->aplrank > rite->aplrank)
							? left : rite));
				break;
			case NO_TYPE:
			default:
				return(errstop(65,left,rite,NULL)); /* unknown */
		} /* end switch */
	}
	if (left->aplcount && rite->aplcount)
		return(eachdyaf(dp,left,rite)); /* neither argument is empty */
	else return(eachdyae(dp,left,rite)); /* one or both empty */
}
[ RETURN TO DIRECTORY ]