Metropoli BBS
VIEWER: pickit.c MODE: TEXT (ASCII)
/* Copyright (C) 1996 by Thomas Glen Smith.	All Rights Reserved. */
/* pickit APL2 V1.0.0 **************************************************
* Called from pick when it is time to pick the result.				 *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb pickit(left,rite,pritep,new,final)
Aplcb left,	 /* Indices of rite to the picked element.			 */
	 rite,	 /* Variable from which item is to be picked.		 */
	 new;	 /* If sel. spec., item to replace the picked item.	 */
Aplcb **pritep; /* Pointer to rite in case it needs replacing.		 */
int final;  /* 1 if at deepest desired depth. Item picked this level. */
{
	Aplcopy;Aplnest;Dtacopy;Endoper;Getcb;Indexno;Integer;Perm;Temp;
	extern int aplerr;
	extern int indxorg;
	Aplcb out=NULL,*wrk;
	int errcode=124,p,rtype;
	void *vp;

	for (;;) {
		if (left->aplrank > 1 || left->aplcount != rite->aplrank)
			break;
		if ((left->aplflags & APLMASK) != APLINT) left = integer(left);
		if (aplerr) return(NULL);
		if (final && new && new->aplrank && !(rite->aplflags & APLAPL))
			**pritep = rite = perm(aplnest(temp(rite)));
		p = indexno(left->aplcount, NULL, left->aplptr.aplint,
			rite->apldim, indxorg);
		if (p >= rite->aplcount) break;
		rtype = rite->aplflags & (APLMASK + APLAPL);
		if (final) {
			if (rtype == APLAPL)
				if (NULL != (out = new)) {
                    	endoper(temp(*(wrk=rite->aplptr.aplapl+p)));
					*wrk = perm((new->aplflags & APLTEMP) ?
						new : aplcopy(new));
                    }
				else out = temp(aplcopy(*(rite->aplptr.aplapl+p)));
			else if (NULL != (out = new))
				vp = dtacopy(rite->aplptr.aplchar + p*rite->aplsize,
					new->aplptr.aplchar, 1, 1, rtype);
			else {
				out = getcb(NULL, 1, rtype + APLTEMP, 0, NULL);
				if (aplerr) return(NULL);
				vp = dtacopy(out->aplptr.aplchar,
					rite->aplptr.aplchar + p*rite->aplsize,
						1, 1, rtype);
			}
			errcode = 0;
			break;
		}
		else if (rtype != APLAPL) break;
		*pritep = rite->aplptr.aplapl+p; /* set riteptr */
		return(**pritep); /* return what riteptr points to */
	}
	if (errcode) aplerr = errcode;
	return(out);
}
[ RETURN TO DIRECTORY ]