/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* preducet APL2 V1.0.0 ************************************************ * Called from preduces to finish processing when rite not empty, and * * out->aplcount > 0. * ***********************************************************************/ #define INCLUDES APLCB+APLDERIV+FUNSTRUC+FUNCODES #include "includes.h" void preducet(id,axicnt,botcnt,topcnt,itype,otype,rite,out,oper,identp) int id; /* 1=reduce, 0=scan */ int axicnt; /* Count of elements along axis in rite */ int botcnt; /* Count of elements below axis in rite */ int topcnt; /* Count of elements above axis in rite */ int itype; /* Data type of rite. */ int otype; /* Data type of out. */ Aplcb rite; /* nested APL variable */ Aplcb out; SCALAR_PROC oper; char *identp; /* Pointer to identity value. */ { Allcopy; Dtacopy; extern int aplerr; int iw,isize,jw,kw,osize,mw,nw,pw,qw,rw; double wrka[2],wrkb[2]; char *icp,*idata,*kp,*odata,*tdata; nw = (id) ? 1 : axicnt; /* nw == 1 if reduce, axicnt if scan */ odata = out->aplptr.aplchar; osize = out->aplsize; idata = rite->aplptr.aplchar; isize = rite->aplsize; for (iw = 0; iw < topcnt; iw++) { pw = iw * botcnt * axicnt; icp = idata + pw * isize; for (jw = 0; jw < botcnt; jw++) for (mw = nw; mw > 0; mw--) { kp = icp+(jw+(axicnt-mw)*botcnt)*isize; tdata = dtacopy(wrka,kp,1,0,itype); if (1 < (rw = axicnt - mw + 1)) for (kw = 1; kw < rw; kw++) { kp -= botcnt * isize; oper(kp, wrka, wrkb); if (itype == otype) { wrka[0] = wrkb[0]; wrka[1] = wrkb[1]; } else tdata = allcopy(wrka, wrkb, 1,0,itype,otype); } if (id) /* reduce */ odata = dtacopy(odata,wrka,1,0,otype); else { /* bypass bug in compiler */ qw = (pw+jw+(axicnt-mw)*botcnt)*osize; tdata = dtacopy(odata+qw,wrka,1,0,otype); } } } }