Metropoli BBS
VIEWER: formdfw.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* formdfw APL2 V1.0.0 *************************************************
* Formdfw is called by formdfs in the special case where the input is  *
* a simple array.										    *
***********************************************************************/
#define INCLUDES STDIO+APLCB
#include "includes.h"
Aplcb formdfw(rite)
Aplcb rite; /* Simple apl variable to be printed */
{
	Endoper; Errstop; Form; Formdfy; Formdfv;
	Getcb; Iscalar; Perm; Reshape; Temp;
	extern int aplerr;
	Aplcb cntcb,dimcb,frmcb,out,rowbl;
	int blanks=0,cols,i,j,k,rows,*rowblp;
	char *ip,*op;

	frmcb = perm(form(NULL,rite)); /* intermediate form */
	if (frmcb->aplrank < 3) return(errstop(0,NULL,NULL,frmcb));
	dimcb = formdfy(frmcb); /* Obtain intermediate shape. */
	rows = *(dimcb->aplptr.aplint);	/* Product of frmcb dimensions, */
					/* except the last dimension. */
	cols = *(dimcb->aplptr.aplint + 1);
	endoper(dimcb);
	cntcb = reshape(iscalar(frmcb->aplrank - 1),  iscalar(0));
	rowbl = reshape(iscalar(rows-1),iscalar(0)); /* vector set to 0 */
	rowblp = rowbl->aplptr.aplint; /* 1st row spaces counter */
	for (i = rowbl->aplcount; i > 0 && aplerr == 0; i--)
		blanks += *rowblp++ = formdfv(frmcb,cntcb); /* lines betw rows */
	endoper(cntcb);
	out = getcb(NULL, (rows+blanks)*cols, APLCHAR + APLTEMP, 2, NULL);
	if (aplerr == 0) {
		*(out->apldim) = rows + blanks;
		*(out->apldim + 1) = cols;
		ip = frmcb->aplptr.aplchar;
		op = out->aplptr.aplchar;
		rowblp = rowbl->aplptr.aplint; /* 1st row spaces counter */
		for (i = rows; i > 0; i--) {
			for (j = cols; j > 0; j--)
				*op++ = *ip++; /* copy formatted data */
			if (i > 1) /* don't do after last row */
				for (k = *rowblp++; k > 0; k--)
					for (j = cols; j > 0; j--)
						*op++ = ' '; /* copy blank */
		}
	}
	return(errstop(0,rowbl,temp(frmcb),out));
}
[ RETURN TO DIRECTORY ]