/*Copyright (C) 1992, 1996 by Thomas Glen Smith. All Rights Reserved.*/ /* formatg APL2 V1.0.0 ************************************************* * Called from form after rite is made matrix, vectors widthcb, precb * * filled with widths and precisions for formatting columns of rite. If* * precision < 0, e-notation indicated, e.g. 1.234e2 for 123.4, and abs.* * value of indicator gives number of digits in the multiplier. Pos. * * precision means f-notation, e.g. 123.4, and the indicator gives * * digits to right of decimal point. * ***********************************************************************/ #define INCLUDES APLCB+FORM+ERRNO #include "includes.h" Aplcb formatg(rite,cba,dimcb) Aplcb rite,cba,dimcb; { Errstop; Formath; Formaty; Formatz; Getcb; Intcopy; extern int aplerr, indxorg; Aplcb *bp,newdim,out; int col,cols,datacnt,i,lastdim,rank,row,rows,type,width; int *dip,*ip,*pp,*sp,*wp; char *cp,*fch; double *dp; fch = formaty(); /* Get Lfc vector. */ type = rite->aplflags & (APLMASK | APLAPL); for (datacnt = 0, i = *(cba->apldim + 1) - 1; i >= 0; i--) datacnt += *(Widcb + i); lastdim = datacnt; for (i = dimcb->aplcount - 2; i >= 0; i--) datacnt *= *(dimcb->aplptr.aplint + i); rank = dimcb->aplcount ? dimcb->aplcount : 1; out = getcb(NULL, datacnt, APLCHAR + APLTEMP, rank, NULL); for (;;) { if (aplerr) break; if (dimcb->aplcount) ip = intcopy(out->apldim, dimcb->aplptr.aplint, out->aplrank - 1, 1); *(out->apldim + rank - 1) = lastdim; dp=rite->aplptr.apldata; /* 1st input value. */ bp=rite->aplptr.aplapl; /* 1st input value if mixed input. */ cp=out->aplptr.aplchar; /* 1st output location */ rows=*(rite->apldim); /* number of rows in rite */ cols=*(rite->apldim+1); /* number of columns in rite */ for (row=0; row