/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* first APL2 V1.0.0 ***************************************************
* Yields first item of rite. If empty, yields the prototype. *
* Called from execmonj, nreduces. *
***********************************************************************/
#define INCLUDES APLCB+STRING
#include "includes.h"
Aplcb first(rite)
Aplcb rite;
{
Aplcopy; Errstop; First; Getcb; Iscalar; Take;
extern int aplerr;
Aplcb out;
if (rite->aplcount)
if (rite->aplflags & APLAPL) {
out = aplcopy(*(rite->aplptr.aplapl));
if (out != NULL)
out->aplflags |= APLTEMP;
}
else {
out = take(iscalar(1),rite);
rite = NULL;
}
else switch(rite->aplflags & (APLMASK + APLAPL)) {
case APLAPL:
out = first(*(rite->aplptr.aplapl));
break;
case APLINT:
case APLNUMB:
out = iscalar(0);
break;
case APLCHAR:
out = getcb(NULL, 1, APLCHAR + APLTEMP, 1, NULL);
if (aplerr == 0)
strcpy(out->aplptr.aplchar," ");
break;
default:
out = NULL;
aplerr = 999; /* internal error */
break;
}
return(errstop(0,NULL,rite,out));
}