/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* execjot2 APL2 V1.0.0 ************************************************ * Called by dottran. * * Derived function routine to handle outer product when the function * * is not scalar dyadic. deriv_func in the aplderiv structure is set * * to execjot2 by dottran, based on the type of function f as in J.f. * ***********************************************************************/ #define INCLUDES APLCHDEF+FUNSTRUC+APLDERIV+APLCB #include "includes.h" Aplcb execjot2(dp,left,rite) Aplderiv dp; /* function describing derived function */ Aplcb left,rite; /* arguments */ { Eachdyag; Errstop; Getcb; Intcopy; Matchok; Perm; extern int aplerr; Aplcb *lp,*op,out=NULL,*rp; int datacnt,i,*ip,j,rank; if (!matchok(&left,&rite,APLAPL)) return(NULL); datacnt = left->aplcount * rite->aplcount; rank = left->aplrank + rite->aplrank; out=getcb(NULL, datacnt, APLAPL + APLTEMP, rank, NULL); if (out != NULL && rank > 1) { /* set dimensions */ ip=intcopy(out->apldim, left->apldim, left->aplrank, 1); ip=intcopy(ip, rite->apldim, rite->aplrank, 1); } if (datacnt) { op = out->aplptr.aplapl; lp = left->aplptr.aplapl; i = left->aplcount; while(0 < i--) { rp = rite->aplptr.aplapl; j = rite->aplcount; while(0 < j--) *op++ = perm( eachdyag(dp,&(dp->deriv_rite),*lp,*rp++)); lp++; } } return(errstop(0,left,rite,out)); }