Metropoli BBS
VIEWER: preducet.c MODE: TEXT (ASCII)
/* 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);
				}
			}
	}
}
[ RETURN TO DIRECTORY ]