Metropoli BBS
VIEWER: formatz.c MODE: TEXT (ASCII)
/*Copyright (C) 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/** formatz APL2 V1.0.0 ************************************************
* Called from formatg to format an element when the input is nested,   *
* and therefore may be a combination of simple numeric scalars and     *
* character data.                                                      *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
formatz(rite,cp,width,precisn,digits,fch,colch)
Aplcb rite;		/* Value to be formatted. */
char *cp; 	/* Output location. */
int width;	/* Width of output. */
int precisn;	/* Places to output right of decimal point. */
int digits;	/* Places to output left of decimal point. */
char *fch;	/* Lfc string. */
int colch;	/* 1 = Entire column is char, 0 otherwise. */
{
	Chrcopy; Formath;
	extern int aplerr;
	char ch,*ip,*jp,*kp,*op;
	int i,j,k,m,type;
	double d;

	type = rite->aplflags & APL_NUMERIC;
	if (type) {
		if (type == APLINT)
			d = *(rite->aplptr.aplint);
		else d = *(rite->aplptr.apldata);
		formath(d,cp,width,precisn,digits,fch);
		return;
	}
	/* rite m/b char data. */
	if (rite->aplcount > width) { /* Overflow? */
		if ('0' == (ch = *(fch+3))) /* Is Lfc[4] == '0'? */
			aplerr = 29; /* model width is too small */
		else /* Fill with overflow indicator. */
			cp = chrcopy(cp,&ch,width,0); /* Fill. */
		return; /* Return after overflow condition. */
	}
	i = width - rite->aplcount;
	if (colch) { /* If entire column is char, left justify. */
		cp = chrcopy(cp, rite->aplptr.aplchar, rite->aplcount, 1);
		if (i) {
			ch = ' ';
			cp = chrcopy(cp, &ch, i, 0); /* Fill right. */
		}
	}
	else { /* Right justify. */
		if (i) {
			ch = ' ';
			cp = chrcopy(cp, &ch, i, 0); /* Fill right. */
		}
		cp = chrcopy(cp, rite->aplptr.aplchar, rite->aplcount, 1);
	}
}
[ RETURN TO DIRECTORY ]