Metropoli BBS
VIEWER: expanf.c MODE: TEXT (ASCII)
/* Copyright (C) 1995 by Thomas Glen Smith.	All Rights Reserved. */
/* expanf APL2 V1.0.0 **************************************************
* Called from expand when rite needs to be replicated along the axis   *
* dimension.                                                           *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb expanf(naxicnt,oaxicnt,axis,botcnt,topcnt,rite)
int	naxicnt,	/* New axis count. */
	oaxicnt,	/* Old axis count. */
	axis,	/* Axis, relative index origin in force. */
	botcnt,	/* Product of dimensions below axis. */
	topcnt;	/* Product of dimensions above axis. */
Aplcb rite;
{
	Dtacopy; Errstop; Getcb; Intcopy;
	extern int aplerr;
	extern int indxorg;
	Aplcb out=NULL;
	int datacnt,datatyp,i,j,k;
	void *vp;
	char *wp;

	for (;;) {
		datacnt = naxicnt * botcnt * topcnt;
		datatyp = rite->aplflags & (APLMASK | APLAPL);
		out = getcb(NULL,datacnt,datatyp+APLTEMP,rite->aplrank,NULL);
		if (out == NULL) break;
		intcopy(out->apldim,rite->apldim,rite->aplrank,1);
		*(out->apldim + axis - indxorg) = naxicnt;
		vp = out->aplptr.aplchar;
		wp = (char *)(rite->aplptr.aplchar);
		for (i = topcnt; i; i--) {
			for (j = naxicnt; j; j--)
				vp = dtacopy(vp, (void *)wp, botcnt, 1, datatyp);
 			wp += botcnt * out->aplsize;
		}
		break;
	}
	return(errstop(0,NULL,rite,out));
}
[ RETURN TO DIRECTORY ]