/* 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));
}