/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* indexno APL2 V1.0.0 *************************************************
* Called by disclosh and pickit to obtain the element number based on *
* indices. Always returns the index relative 0. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
int indexno(n, rp, ip, jp, org)
int n; /* Number of dimensions. */
int *rp; /* Index to dimensions, or NULL. */
/* If null, indices to dimensions */
/* are assumed to be 0, 1, 2,..., */
/* plus org (index origin to use). */
int *ip; /* Indices. */
int *jp; /* Actual dimensions. */
int org; /* Index origin to use. */
{
int i, j, k, m, p;
p = 0; /* w/b element number */
m = 1; /* first multiplier */
while(n--) { /* Loop once for each dimension. */
k = (rp) ? *(rp + n) - org : n; /* index to index, org 0 */
i = *(ip + k) - org; /* next index, org 0 */
if (i) {
if (jp == NULL) return(-1); /* Caller's error. */
if (i >= *(jp + n)) return(-1); /* Caller's error. */
j = i * m; /* next product */
p += j;
}
if (jp != NULL) m *= *(jp + n);
}
return(p);
}