/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* depthsub APL2 V1.0.0 ************************************************
* Called by depth. *
* Reports levels of nesting, 0 for simple scalars. For other arrays, *
* 1 plus the depth of the item with the maximum depth. Returns int. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
int depthsub(rite)
Aplcb rite;
{
Depth; Depthsub; Enclose; Endoper; First; Imax; Ivalue;
Aplcb *ritp,rcb;
int i,idepth,typ;
typ = rite->aplflags & (APLMASK + APLAPL);
if (typ != APLAPL)
if (rite->aplrank)
idepth = 1; /* input is simple non-scalar */
else idepth = 0; /* input is simple scalar */
else if (rite->aplcount) { /* non-empty nested array */
idepth = 0;
ritp = rite->aplptr.aplapl; /* aplcb array */
for (i = rite->aplcount; i; i--)
idepth = imax( idepth, depthsub(*ritp++) );
idepth++; /* 1 plus greatest contained depth */
}
else {
idepth = ivalue(depth(enclose(first(rite),NULL)));
rite = NULL; /* Don't free twice. */
}
endoper(rite);
return(idepth);
}