Metropoli BBS
VIEWER: find.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* find APL2 V1.0.0 ****************************************************
* Yields a boolean array where 1s mark the positions in rite that	 *
* match left.												 *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb find(left,rite)
Aplcb left,rite;
{
	Errinit; Errstop; Getcb; Intcopy; Matchok;
     void finda(Aplcb, Aplcb, Aplcb, int);
     extern int aplerr;
	Aplcb out=NULL;
	int d,i,*oip;

	for (;;) {
		if (errinit()) break;
		out = getcb(NULL, rite->aplcount, APLTEMP + APLINT,
			rite->aplrank, NULL);
		if (aplerr) break;
          if (out->aplrank > 1) /* copy dimensions if more than vector */
          	oip = intcopy(out->apldim, rite->apldim, out->aplrank, 1);
		if (out->aplcount == 0) break;
          i = 0;
		oip = intcopy(out->aplptr.aplint, &i, out->aplcount, 0);
		if (0 > (d = rite->aplrank - left->aplrank)) break;
		if (!matchok(&left, &rite, APLMASK + APLAPL)) {
			aplerr = 0; /* reset code set by matchok */
			break;
		}
          finda(left,rite,out,d); /* More work to do. */
         	break;
     }
	return(errstop(0,left,rite,out));
}
[ RETURN TO DIRECTORY ]