Metropoli BBS
VIEWER: partitn.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* partitn APL2 V1.0.0 *************************************************
* Partition, z#l`Zr.                                                   *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb partitn(left, rite, axes)
Aplcb left,rite,axes;
{
	Errstop; Errinit; Getcb; Intcopy; Integer; Ivalue; Partito;
	extern int aplerr, indxorg;
	Aplcb out=NULL;
	int axis,datacnt,i,*ip,j,k,m;

	for (;;) {
		if (errinit()) break;
		if (axes == NULL)
			axis = rite->aplrank - 1; /* Last axis, relative 0. */
		else {
			axis = ivalue(axes) - indxorg; /* Relative 0. */
			if (axis < 0 || axis >= rite->aplrank)
				aplerr = 3; /* Bad axis. */
			if (aplerr) break;
		}
		if (left->aplcount != *(rite->apldim + axis))
			aplerr = 128; /* Rleft ^= axis. */
		else if (!(left->aplflags & APLINT))
			left = integer(left);
		if (aplerr) break;
		for( i=j=k=0; i < left->aplcount; i++ ) {
			k += (j < (m = *(left->aplptr.aplint + i)));
			j = m;
		} /* k w/b new axis length */
		datacnt = k;
		if (rite->aplrank > 1) /* get out->aplcount. */
			for (i = 0; i < rite->aplrank; i++)
				if (i != axis)
					datacnt *= *(rite->apldim + i);
		out = getcb(NULL,datacnt,APLAPL+APLTEMP,rite->aplrank,NULL);
		if (out == NULL) break;
		if (out->aplrank > 1) { /* Set dimensions. */
			ip = axis ?
				intcopy(out->apldim,rite->apldim,axis,1) :
				out->apldim;
			*ip++ = k; /* Set axis value. */
			i = out->aplrank - axis - 1; /* # dimensions right of axis. */ 
			if (i > 0)
				ip = intcopy(ip, rite->apldim + axis + 1, i, 1);
		}
		return(partito(left,rite,out,axis));
	} /* end for(;;) */
     return(errstop(0,left,rite,out)); /* Get here if error. */
}
[ RETURN TO DIRECTORY ]