Metropoli BBS
VIEWER: formatc.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1994 by Thomas Glen Smith.  All Rights Reserved.*/
/* formatc APL2 V1.0.0 *************************************************
* Called from form when the left argument is NULL.  Formatc will set   *
* widthcb and precb to vectors containing widths and precisions for    *
* each column of rite.                                                 *
***********************************************************************/
#define INCLUDES APLCB+FORM
#include "includes.h"
void formatc(cba)
Aplcb cba;
{
	extern double pp; /* Quad-pp = print presicion */
     int col, cols, d, *dp, e, f, *fp, i, maxw=15, mypp, p, *sp, w, *wp;

	mypp = pp;
     if (mypp < 0 || mypp > 10) mypp = 10; /* be realistic */
	cols = *(cba->apldim + 1);
     dp = Digicb;
     fp = Fraccb;
     sp = Signcb;
     wp = Widcb;
     i = 0;
	for (col = 0; col < cols; col++) { /* Once for each column of rite. */
     	f = *fp++; /* places to right of decimal */
          p = (f) ? 1 : 0; /* 1 for decimal point if not integer */
          d = *dp++; /* Digits left of decimal. */
		e = 0; /* Default is to not print in e-notation. */
		if (f + d > mypp) { /* Too much to print? */
			if (d >= mypp) /* Print as integer? */
				p = f = *(Precb + col) = 0; /* No decimal point. */
			else *(Precb + col) = f = mypp - d; /* Reduce places */
	          if (d == 0 /* Is digits left of d.p. 0? */
				&& p  /* Are there digits right of d.p.? */
				&& *wp >= mypp) /* Are there more than Lpp zeros */
				e = 1; /* before 1st significant digit? */
		}
          if (!e) {
	     	w =  f        /* places to right of decimal */
	               + p        /* 1 for decimal point if not integer */
	               + d        /* places to left of decimal */
                    + (d == 0) /* 1 for 0 left of decimal */
	               + *sp++    /* 1 if sign needed */
	               ;
		}
          if (e || w > maxw) {
          	w = maxw - 1;
               *(Precb + col) = -6; /* e-notation */
          }
          *wp++ = w + i; /* i = 1 for blank between columns. */
          i = 1; /* 1 for intervening blank except first column */
     }     
}
[ RETURN TO DIRECTORY ]