Metropoli BBS
VIEWER: redscan.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* redscan APL2 V1.0.0 *************************************************
* Called by reducef and scanfrnt to complete reduce/scan processing.	 *
***********************************************************************/
#define INCLUDES APLCHDEF+FUNSTRUC+APLDERIV+APLCB+FUNCODES
#include "includes.h"
Aplcb redscan(id,dp,rite,axis,crs,nrs)
int id;	   /* 1=reduce, 0=scan */
Aplderiv dp; /* function describing derived function */
Aplcb rite;  /* argument */
int axis;
Aplcb (*crs)(int (*oper)(char,char), int *, Aplcb, int);
Aplcb (*nrs)(Aplderiv, Aplcb, int);
{
	Aplnest; Errstop; Execdyal; Execdyam; Pickdyad; Preduces;
	extern int aplerr;
	Aplcb out=NULL;
	void *ep;
	int type;
	Scalar_dyadics *sp;
	Eqne *en;

	type = rite->aplflags & (APLMASK + APLAPL);
	if (type != APLAPL && (dp->deriv_left.func.flr == execdyal ||
		dp->deriv_left.func.flr == execdyam)) {
		if (type == APLCHAR) {
			sp = pickdyad(en = dp->deriv_left.fun);
			if (sp == NULL) aplerr = 72; /* bad scalar */
			if (en->rel.codes.funky_flags == EQNE &&
				NULL != (ep = en->ch))
				return((*crs)(ep,&(sp->identities.iid),rite,axis));
			return(errstop(75,NULL,rite,NULL));
          }
		return(preduces(id,dp,rite,axis)); /* f/ is a prim. scal. */
	}
	/* Get to here if f in f/ is not a primitive scalar. */
	if (type != APLAPL)
     	rite = aplnest(rite); /* convert to nested */
	return((*nrs)(dp,rite,axis)); /* nested reduce(call nreduce) */
}
[ RETURN TO DIRECTORY ]