Metropoli BBS
VIEWER: enclose.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* enclose APL2 V1.0.0 *************************************************
* Enclose.										 *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb enclose(rite, axes)
Aplcb rite;
Aplcb axes;
{
	Aplcopy; Enclose; Enclosf; Errinit; Errstop; Getcb; Getcbi; Perm; Temp;
	extern int aplerr;
	Aplcb *icb,out=NULL,*ocb,wrk;
	int i;

	for (;;) { /* lets me use break */
		if (errinit()) break;
		if (axes == NULL) {
			if (rite->aplrank == 0 && !(rite->aplflags & APLAPL))
				out = (rite->aplflags & APLTEMP) ? rite :
					temp(aplcopy(rite));
			else {
				out = getcb(NULL,1,APLAPL+APLTEMP,0,NULL);
				if (out == NULL) break;
				wrk = (rite->aplflags & APLTEMP) ? rite : aplcopy(rite);
				wrk->aplflags &= ~APLTEMP; /* Make it permanent. */
				*(out->aplptr.aplapl) = wrk;
			}
			rite = NULL; /* don't free later. */
			break;
		}
		if (0 == axes->aplcount) {
			if (rite->aplflags & APLAPL) { /* nested */
				out = getcbi(NULL,rite->aplcount,APLAPL+APLTEMP,
					rite->aplrank,rite->apldim);
				icb = rite->aplptr.aplapl;
				ocb = out->aplptr.aplapl;
				for (i = 0; i < out->aplcount; i++) {
					wrk = perm(enclose(*icb++,NULL));
					if (wrk == NULL)
						*ocb++ = NULL;
					else if (wrk->aplflags & APLTEMP)
						*ocb++ = perm(wrk);
					else *ocb++ = aplcopy(wrk);
				}
			}
			else out = temp(aplcopy(rite)); /* simple array */
			break;
		}
		return(enclosf(rite,axes));
		break; /* get out of for loop */
	}
	return(errstop(0,axes,rite,out));
}
[ RETURN TO DIRECTORY ]