/* Copyright (C) 1992, 1994 by Thomas Glen Smith. All Rights Reserved.*/
/* formatj APL2 V1.0.0 *************************************************
* Called from form to obtain descriptions of rite. *
***********************************************************************/
#define INCLUDES APLCB+MATH+FORM
#include "includes.h"
formatj(rite,cba)
Aplcb rite, /* Values to be formatted. */
cba; /* Aplcb matrix of vectors for each column of input. */
{
Digits; Formatx; Getcb; Log;
extern int aplerr;
int charcnt,charlen,charnew,col,cols,dig,i,m,n,row,rows,s;
double log10,myfuzz=1e-11,*rp,val,valmax,valmin,wrk;
rows = *rite->apldim;
cols = *(rite->apldim+1);
log10 = log(10.0);
for (col = 0; col < cols; col++) { /* Once for each column of rite. */
n = s = 0;
valmax = 0e0;
valmin = 1e0;
charcnt = charlen = 0;
for (row = 0; row < rows; row++) { /* once for each row */
val = formatx(rite,row,col,cols,&charnew,&s,&m);
if (charnew || aplerr) {
if (charnew > charlen)
charlen = charnew; /* Find largest char vector. */
charcnt++; /* Count char items in column. */
}
else { /* Simple numeric item. */
n = (m > n) ? m : n; /* max places */
if (val > valmax) valmax = val;
if (val < valmin && val > myfuzz) valmin = val;
}
}
m = digits(valmax); /* Max digits left of decimal point. */
*(Precb + col) = n; /* Max places. */
*(Fraccb + col) = n; /* Max places. */
*(Signcb + col) = s; /* Sign. */
*(Digicb + col) = m; /* Max digits left of decimal. */
*(Widcb + col) = -(log(valmin + myfuzz) / log10);
/* # 0s right of dec. bef. 1st dig. */
*(Chrcb + col) = charlen; /* Max characters. */
*(Chrcol + col) = (charcnt == rows); /* Is column all char? */
}
}