Metropoli BBS
VIEWER: reverse.c MODE: TEXT (ASCII)
/* Copyright (C) 1994 by Thomas Glen Smith.	All Rights Reserved. */
/* reverse APL2 V1.0.0 *************************************************
* The result, k, is equal to the argument, x, except the items appear  *
* in reverse order.  The axis argument determines the axis over which  *
* vectors are reversed if x is of rank greater than 1.				 *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb reverse(rite,axis)
Aplcb rite; /* variable to be reversed */
int axis; /* axis of reversal */
{
	Dtacopy; Errstop; Revrot;
	extern int indxorg;
	int a,axicnt,botcnt,datatyp,i,j,k,size,topcnt;
	char	*cia,*cib,*coa,*cob,*cop;
	Aplcb out=NULL;

	axis += (indxorg==0);
	if (NULL == (out=revrot(rite,axis,&axicnt,&botcnt,&topcnt)))
		return(errstop(0,NULL,rite,NULL));
	if (0 == out->aplcount) return(errstop(0,NULL,rite,out));
	datatyp = out->aplflags & (APLMASK + APLAPL);
	size = out->aplsize;
	a=botcnt*axicnt;
	for (i=0; i<topcnt; i++) {
		cia=rite->aplptr.aplchar+i*a*size;
		coa=out->aplptr.aplchar +i*a*size;
		for (j=0; j<botcnt; j++) {
			cib=cia+(j+a)*size;
			cob=coa+(j-botcnt)*size;
			for (k=axicnt; k>0; k--)
				cop = dtacopy(
				(cob+=botcnt*size),(cib-=botcnt*size),
				1, 1, datatyp);
		}
	}
	return(errstop(0,NULL,rite,out));
}
[ RETURN TO DIRECTORY ]