/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* execdyaj APL2 V1.0.0 ************************************************
* Called from execdyan to perform a builtin APL dyadic function. *
***********************************************************************/
#define INCLUDES APLTOKEN+APLCB+FUNSTRUC+FUNCODES+TREE
#include "includes.h"
Aplcb execdyaj(fun,left,rite)
void *fun; /* function structure - see funstruc.h */
Aplcb left,rite; /* function arguments */
{
Drop2; Errstop; Execaxis; Execaxiv; Execdyak; Laminate; Mod;
Partitn; Scalax;
extern int aplerr;
extern Treelist treehdr;
double dblaxis;
int axis,code;
Aplcb axcb;
code = ((Codes *)fun)->funky_flags;
if (axistest(treehdr->avlexec->avlfunst))
axcb = execaxis(&(treehdr->avlexec->avlfunst));
else axcb = NULL;
if ((code & AXED)) /* Is it drop2, partition, squad, or take2? */
switch(code) {
case DIXE:
return(((Dmxo *)fun)->dyad.epdixe(left,rite,axcb));
case DIXS:
return(((Dmxo *)fun)->dyad.epdixf(left,rite,axcb,NULL));
case MIXE:
case UPAR: /* Take2. */
return(((Mixa *)fun)->dyad.epdixe(left,rite,axcb));
default:
return(((Dmxo *)fun)->dyad.epdixe(left,rite,axcb));
}
axis = -1; /* default = take the default axis */
if (code & AXIS) {
if (axcb != NULL) {
dblaxis = execaxiv(axcb);
if (aplerr)
return(errstop(0,left,rite,NULL));
if (mod(dblaxis,1.0) != 0.0)
if (code == MIXC)
return(laminate(left,rite,dblaxis));
else return(errstop(9,left,rite,NULL)); /* bad axis */
axis = dblaxis; /* convert axis to integer */
}
}
else if (axcb != NULL)
if (code & SCALAR && code & DYADIC)
return(scalax(fun,left,rite,axcb));
else return(errstop(89,left,rite,axcb)); /* axis out of place */
return(execdyak(fun,left,rite,axis));
}