Metropoli BBS
VIEWER: comprest.c MODE: TEXT (ASCII)
/* Copyright (C) 1994 by Thomas Glen Smith.	All Rights Reserved. */
/* comprest APL2 V1.0.0 ************************************************
* Called by compress to finish processing when out->aplcount > 0.      *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
void comprest(left,rite,out,axis,axicnt,botcnt,topcnt,datatyp,fill)
Aplcb left,rite,out;
int axis,axicnt,botcnt,topcnt,datatyp,fill;
{	Aplfill; Dtacopy; Getcb; Temp;
	int axi,*dimptr,hit=0,incr,jw,mw,sincr,top;
	char *fillptr,*icp,*ocp,*tcp;
	Aplcb fillcb=NULL, *fillsave=NULL, fillwk=NULL;

	if (fill)
		if (datatyp == APLAPL)
			if (rite->aplrank > 1) {
				hit = 1;  /* use subarray fill */
				fillcb = getcb(NULL,botcnt,APLAPL,1,NULL);
				if (fillcb == NULL) return;
				fillsave = fillcb->aplptr.aplapl;
				((Aplcb*)fillptr) = &fillwk;
			} else {
				fillcb = aplfill(rite);
				if (fillcb == NULL) return;
				((Aplcb*)fillptr) = &fillcb;
			} else fillptr = aplfill(rite);
	incr = (1 == rite->aplcount) ? 0 : botcnt * rite->aplsize;
	sincr = (1 == axicnt * botcnt) ? 0 : incr;
	ocp = out->aplptr.aplchar; /* 1st output location */
	for (top = 0; top < topcnt; top++) {
		icp = rite->aplptr.aplchar + top * axicnt * incr;
		dimptr = left->aplptr.aplint; /* compression vector */
		if (hit) { /* use subarray fill */
			fillcb->aplptr.aplapl = (Aplcb*)icp;
			fillwk = aplfill(fillcb);
		}
		for (axi = jw = 0; jw < left->aplcount; jw++) {
			mw = *dimptr++;
			if (mw < 0) /* fill */
				ocp = dtacopy(ocp,fillptr,botcnt*-1*mw,0,datatyp);
			else { /* mw >= 0 means bump axi. */
				tcp = icp + axi * sincr;
				while (mw--)
					ocp = dtacopy(ocp,tcp,botcnt,1,datatyp);
				axi++;
			}
		}
		if (hit) {
			endoper(temp(fillwk));
			fillwk = NULL;
		}
	}
	if (fillcb != NULL) {
		if (fillsave != NULL)
			fillcb->aplptr.aplapl = fillsave;
		endoper(temp(fillcb));
	}
}
[ RETURN TO DIRECTORY ]