/*Copyright (C) 1992, 1994 by Thomas Glen Smith. All Rights Reserved.*/
/* indexma APL2 V1.0.0 *************************************************
* Called from indexm to determine the output dimensions. *
***********************************************************************/
#define INCLUDES APLCB+APLMEM+INDEXMI
#include "includes.h"
Aplcb indexma(p)
struct ix *p;
{
Cat; Errstop; Getcb; Indxsub; Integer; Iscalar; Shape;
extern int aplerr, indxorg;
Aplcb dimcb,*s,t,u;
int i,*ip,j,k,leftrank,*op,tempsave;
dimcb = getcb(NULL,0,APLINT+APLTEMP,1,NULL);
s = (p->x)->aplptr.aplapl;
leftrank = (p->l)->aplrank;
ip = (p->l)->apldim + leftrank - 1; /* addr(lowest dimension) */
op = leftrank - 1 + (p->z = malloc(sizeof(int) * leftrank));
k = 1; /* factor for lowest dimension */
for (i=0; i < leftrank; i++) {
*op-- = k; /* set factor */
k *= *ip--; /* next factor */
if (NULL == (t = *s)) {
u = iscalar(j = *((p->l)->apldim + i));
*s = indxsub(j);
}
else {
if (!(t->aplflags & APLINT)) {
*s = t = integer(t);
if (aplerr)
return(errstop(0,NULL,NULL,dimcb));
}
if (tempsave = t->aplflags & APLTEMP)
t->aplflags -= APLTEMP;
u = shape(t);
t->aplflags += tempsave;
}
dimcb = cat(dimcb,u,indxorg);
s++;
}
return(dimcb);
}