/*Copyright (C) 1992, 1995 by Thomas Glen Smith. All Rights Reserved.*/ /* axispre APL2 V1.0.0 ************************************************* * Called by cat. * * This subroutine obtains three values essential to any APL operation * * affected by an axis value: * * axicnt: count along axis (origin 1). * * botcnt: the greater of 1 or the product of dimensions below the axis.* * topcnt: the greater of 1 or the product of dimensions above the axis.* * Returns 1 of processing successful, and 0 otherwise. * ***********************************************************************/ #define INCLUDES APLCB #include "includes.h" int axispre(rite,axis,paxicnt,pbotcnt,ptopcnt) Aplcb rite; /* operand */ int axis; int *paxicnt,*pbotcnt,*ptopcnt; { Isign; extern int aplerr; int axicnt,botcnt,topcnt; int *dimptr,i; if (rite==NULL) return(0); if (rite->aplrank>0 && (axis<1 || axis>rite->aplrank)) { aplerr=9; /* bad axis */ return(0); } axicnt=botcnt=topcnt=1; dimptr=rite->apldim; for (i=1; i<=rite->aplrank; i++) switch (isign(i-axis)) { case -1: /* dimension < axis */ topcnt*=*dimptr++; break; case 0: /* dimension = axis */ axicnt =*dimptr++; break; case +1: /* dimension > axis */ botcnt*=*dimptr++; break; } /* end switch */ *paxicnt=axicnt; *pbotcnt=botcnt; *ptopcnt=topcnt; return(1); /* all ok */ }