Metropoli BBS
VIEWER: formdfx.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* formdfx APL2 V1.0.0 *************************************************
* Formdfx is called by formdfu after widths/heights/spacing determined.*
* It obtains final output aplcb, and copies formatted data to it.	 *
***********************************************************************/
#define INCLUDES STDIO+APLCB
#include "includes.h"
Aplcb formdfx(v,cols,rows,rowso,frmcb,colbl,colwi,rowbl,rowhi,numcb,chrcb)
int v, cols, rows, rowso;
Aplcb frmcb,colbl,colwi,rowbl,rowhi,numcb,chrcb;
{
	Errstop; Formdfz; Iplus; Ireduce; Ivalue;
	extern int aplerr,indxorg;
	Aplcb fcb,*frmp,out;
	int *chrp,*colblp,colso,colspaces,*colwip,colwidth,i,icols,iplusid=0,
	irows,j,k,m,*nump,rank,*rowblp,rowheight,*rowhip,rowspaces;
	char *fch,*opcol,*opout,*oprow,*opstart;

	colso = ivalue(ireduce(iplus,&iplusid,colbl,indxorg)) +
		ivalue(ireduce(iplus,&iplusid,colwi,indxorg)) + 2;
	out = formdfz(v,colso,rowso); /* get output aplcb */
	if (aplerr) return(NULL);
	frmp = frmcb->aplptr.aplapl; /* formatted input */
	rowblp = rowbl->aplptr.aplint; /* 1st row blank lines */
	rowhip = rowhi->aplptr.aplint; /* 1st row height. */
	oprow = out->aplptr.aplchar + 1; /* 1st output row anchor */
	for (i = rows; i > 0; i--) {
		colblp = colbl->aplptr.aplint; /* 1st column spaces counter */
		colwip = colwi->aplptr.aplint; /* 1st column width counter */
		nump   = numcb->aplptr.aplint; /* 1st column numeric flag */
		chrp   = chrcb->aplptr.aplint; /* 1st column character flag */
		rowheight = *rowhip++; /* height of this row in characters */
		rowspaces = (rows > 1) ? *rowblp++ : 0;
			/* blank lines after this row */
		opcol = oprow; /* column output anchor */
		for (j = cols; j > 0; j--) {
			colwidth = *colwip++;
			colspaces = (colblp != NULL) ?  *colblp++ : 0;
			fcb = *frmp++; /* next formatted input aplcb */
			if (fcb->aplrank < 2) {irows = 1; icols = fcb->aplcount;}
			else {irows = *(fcb->apldim); icols = *(fcb->apldim + 1);}
			fch = fcb->aplptr.aplchar;
			if (*nump++ || !*chrp++)
				opout = opcol + colwidth - icols; /* right justified */
			else opout = opcol; /* left justified */
			opstart = opout; /* save start of row */
			for (k = irows; k > 0; k--) {
				for (m = icols; m > 0; m--)
					*opout++ = *fch++; /* copy char */
				opout = opstart += colso; /* start of next row */
			}
			opcol += colwidth + colspaces;
		}
		oprow += colso * (rowheight + rowspaces); /* new row anchor */
	}
	return(errstop(0,NULL,NULL,out));
}
[ RETURN TO DIRECTORY ]