/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* formdfu APL2 V1.0.0 ************************************************* * Formdfu is called by formdfs. * ***********************************************************************/ #define INCLUDES STDIO+APLCB #include "includes.h" #undef max #define max(A, B) ((mxl = (A)) > (mxr = (B)) ? mxl : mxr) Aplcb formdfu(cols,rows,dimcnt,v,rowblp,rowhip,icb,ocb,rcb, chrcb,cntcb,colbl,colwi,frmcb,numcb,rite,rowbl,rowhi) #include "formdft.h" /* Common declarations. */ Aplcb rite; int *rowblp,*rowhip,v; /* v = 1 if output is vector */ { Formdfs; Formdfx; Formdfv; extern int aplerr,indxorg; Aplcb ip,lastip,op; int *chrp,*colblp,*colwip,hitot=0,i,j,k,m,mxl,mxr,notchara, *nump,n,notcharb,ranka,rankb,rowheight,rowspaces,sptot=0,wip; for (i = rows; i > 0 && aplerr == 0; i--) { lastip = NULL; /* prior column element in this row of output */ colblp = colbl->aplptr.aplint; /* 1st column spaces counter */ colwip = colwi->aplptr.aplint; /* 1st column width counter */ nump = numcb->aplptr.aplint; /* 1st column numeric flag */ chrp = chrcb->aplptr.aplint; /* 1st column character flag */ rowheight = rowspaces = 0; /* initialize */ for (j = cols; j > 0 && aplerr == 0; j--) { ip = *icb++; /* point to next input aplcb */ *nump++ &= notcharb = !(ip->aplflags & APLCHAR); *chrp++ &= !notcharb; /* character-only column? */ rankb = ip->aplrank; *ocb++ = op = formdfs(ip); /* formatted vector/matrix */ if (aplerr) return(NULL); k = (op->aplrank < 2); /* test for vector element */ v &= k; /* test for vector output */ wip = (op->aplrank) ? *(op->apldim+(k==0)) : 1; wip = max(wip, *colwip); *colwip++ = wip; if (lastip && colblp != NULL) { m = max(ranka + notchara, rankb + notcharb); m = max(m, *colblp); *colblp++ = m; } lastip = ip; notchara = notcharb; ranka = rankb; m = (k) ? 1 : *(op->apldim); /* element height */ if (m > rowheight) rowheight = m; if (i < rows) { /* do horizontal space between rows? */ m = -1 + max(ranka, (*rcb++)->aplrank); if (m > rowspaces) rowspaces = m; } } if (dimcnt > 2) /* will there be interdimensional spacing? */ rowspaces += formdfv(rite,cntcb); hitot += *rowhip++ = rowheight; /* save row height */ if (i > 1) sptot += *rowblp++ = rowspaces; /* save spaces after row */ } return(formdfx(v,cols,rows,hitot+sptot,frmcb,colbl,colwi, rowbl,rowhi,numcb,chrcb)); }