/* 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 */ }