Metropoli BBS
VIEWER: compress.c MODE: TEXT (ASCII)
/* Copyright (C) 1994 by Thomas Glen Smith.	All Rights Reserved. */
/* compress APL2 V1.0.0 ************************************************
* Called by slashtrb.                                                  *
* Output is same shape as rite, except a scalar rite produces a vector *
* out. Items of output chosen from rite according to the non-zero items*
* of left. If rite were vector 1 2 3 4 5, and left vector 1 0 1 0 1,   *
* result w/b 1 3 5.  For rite of rank > 1, axis arg determines which   *
* dimension of rite is compressed.		                               *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb compress(left,rite,axis)
Aplcb left,rite;
int axis; /* Axis, relative to Index Origin in force. */
{
	Comexpa; Comexpb; Comprest; Errstop; Temp;
	int axicnt,axires,botcnt,datatyp,fill=0,iw,jw,topcnt;
	Aplcb out=NULL;

	if (NULL == (left = comexpa(left,rite,&axis,&axicnt,&botcnt,&topcnt)))
		return(errstop(0,left,rite,NULL));
	for(iw = axires = 0; iw < left->aplcount; iw++) { /* #items in axis */
		axires += (0 < (jw = *(left->aplptr.aplint + iw))) ? jw : -jw;
		if (jw < 0) fill = 1; /* there will be fill items */
	}
	if (left->aplcount != axicnt)
		if (rite->aplrank && !fill)
			return(errstop(31,temp(left),rite,NULL));
	if (NULL == (out = comexpb(rite,axis,axires,botcnt,topcnt,&datatyp)))
		return(errstop(0,temp(left),rite,out));
	/* now copy selected input to output */
	if (out->aplcount) /* not empty? */
		comprest(left,rite,out,axis,axicnt,botcnt,topcnt,datatyp,fill);
	return(errstop(0,temp(left),rite,out));
}
[ RETURN TO DIRECTORY ]