/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* execmonh - APL2 V1.0.0 ********************************************** * Called from execmona to perform a monadic function expected to be on * * the function stack. * ***********************************************************************/ #define INCLUDES APLCB+APLCHDEF+APLDERIV+APLTOKCD+APLTOKEN\ +FUNCODES+FUNSTRUC+TREE #include "includes.h" void execmonh(void) { Axistest; Dervfree; Execaxis; Execfun; Execgeto; Execmonj; Execmons; Execout; extern int aplerr; extern Treelist treehdr; Aplcb axcb, out, rite; void *arg=NULL, *fun; int code, funtype, offset; sub_dyad ep; deriv_type ptype; code = execfun(&fun); /* pop operator/function */ if (aplerr) return; if (NULL == (rite = execgeto(&(treehdr->avlexec->avloprst)))) { if (code == DERIVED_FUNCTION) dervfree(fun); /* Free aplderiv struct, if any. */ aplerr = 70; /* indicate missing right operand */ return; } offset = treehdr->avloff; if (axistest(treehdr->avlexec->avlfunst)) { if (code != FUNCTION_TOKEN) aplerr = 89; /* axis out of place */ else if (!(((Codes *)fun)->funky_flags & (AXIS | AXES | AXEM))) aplerr = 89; else axcb = execaxis(&(treehdr->avlexec->avlfunst)); } else axcb = NULL; /* no axis supplied */ if (aplerr) return; ptype = execmons(code,fun,&arg,&ep); if (aplerr) return; if (code == FUNCTION_TOKEN && ((Codes *)fun)->funky_code == UP_ARROW) treehdr->treeflag |= NOT_WHOLE_ARRAY; out = execmonj(ptype, fun, arg, ep, rite, axcb); if (out) execout(out,offset); /* put result on stack */ }