/*Copyright (C) 1992, 1994 by Thomas Glen Smith. All Rights Reserved.*/
/* formatd APL2 V1.0.0 *************************************************
* Called from form when the left argument isn't null. The width and *
* precision specifications given in left will be checked and expanded *
* as necessary, with widthcb and precb built therefrom to contain the *
* width and precision specifications to use in the final formatting. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
void formatd(left,rite,cba)
Aplcb left,rite,cba;
{
Cat; Integer; Iscalar; Perm; Reshape; Formatm;
extern int aplerr, indxorg;
int leftlen;
if (left->aplflags & APLCHAR) aplerr=14; /* must be numeric */
if (left->aplrank > 1) aplerr=25; /* must be scalar/vector */
if (aplerr) return;
leftlen=2**(rite->apldim+1); /* left length s/b twice the number
of columns in rite */
if (left->aplcount < 1 || (left->aplcount > 2 &&
left->aplcount != leftlen)) {
aplerr=26; /* wrong length */
return;
}
if (left->aplcount == leftlen)
left=integer(left); /* make a copy of left */
else { /* extend left */
if (!(left->aplflags & APLINT)) left = integer(left);
if (left->aplcount==1)
left=reshape(iscalar(leftlen),cat(iscalar(0),left,indxorg));
/* Precisions are zero for now. Figure it out later */
else left=reshape(iscalar(leftlen),left); /* precisions given */
if (aplerr) return;
}
/* Left now has a pair of numbers for each column of rite */
formatm(perm(left),rite,cba);
}