/*Copyright (C) 1995 by Thomas Glen Smith. All Rights Reserved.*/ /* formatx APL2 V1.0.0 ************************************************* * Called from formatj to obtain the next value to be formatted. * ***********************************************************************/ #define INCLUDES APLCB+MATH #include "includes.h" double formatx(rite,row,col,cols,pcharlen,ps,pm) Aplcb rite; /* APL variable to be formatted. */ int row,col; /* Current row and col being examined. */ int cols; /* Total columns in each row. */ int *pcharlen; /* To be filled with maximum length of char vector. */ int *ps; /* Set to 1 if a negative value is found. */ int *pm; /* Set to places right of d.p. */ { Pow; Precisn; extern int apldigs, aplerr; double *rp=NULL,val=0e0; Aplcb *ap,bp; int i,*ip=NULL,n,precis[2]; *pcharlen = 0; /* Default. */ switch (rite->aplflags & (APLMASK | APLAPL)) { case APLINT: val=*(ip=rite->aplptr.aplint + row*cols + col); break; case APLNUMB: val=*(rp=rite->aplptr.apldata + row*cols + col); break; case APLAPL: ap = rite->aplptr.aplapl + col; /* start of column */ bp = *(ap + row * cols); switch (bp->aplflags & (APLMASK | APLAPL)) { case APLCHAR: if (bp->aplrank > 1) aplerr=133; /* Domain */ *pcharlen = bp->aplcount; return(0e0); case APLINT: if (bp->aplcount > 1) aplerr=133; /* Domain */ val = *(ip = bp->aplptr.aplint); break; case APLNUMB: if (bp->aplcount > 1) aplerr=133; /* Domain */ val = *(rp = bp->aplptr.apldata); break; default: aplerr = 133; /* Domain error. */ break; } /* End switch. */ break; } /* End switch. Get here only if numeric to return. */ precisn(val,precis); /* Get precision for val. */ n = *pm = precis[1]; /* Get places right of d.p. */ if (val < 0) { val = -val; if (!(n == 0 && val < 5e-1)) *ps = 1; /* sign */ else if (rp != NULL) *rp = val = 0e0; else *ip = val = 0e0; } return(val); }