/* Copyright (C) 1994 by Thomas Glen Smith. All Rights Reserved. */ /* executg APL2 V1.0.0 ************************************************* * Called by executf and execalt to parse and execute an APL stmt. * ***********************************************************************/ #define INCLUDES APLTOKEN+APLCHDEF+APLCB+TREE #include "includes.h" Aplcb executg(rite) Aplcb rite; { Errinit; Errstop; Execexec; Execfree; Execgetp; Execpars; Execpop; Pop; extern Treelist treehdr; extern int aplerr; Apltoken tok,tokhdr,toksave; Aplcb out=NULL; int i=0; for (;;) { /* to use break */ if (errinit()) break; if (rite == NULL) { i = 999; break; /* internal error */ } if (rite->aplrank > 1) { i = 56; break; /* m/v vec/sca */ } if (!(rite->aplflags & APLCHAR)) { i = 57; break; /* m/b char */ } tokhdr = execpars(rite->aplptr.aplchar,rite->aplcount); while (tokhdr != NULL && tokhdr->token_code == CAP_NULL) execfree(pop(&tokhdr)); /* pop/free input */ toksave = treehdr->avltokhd; treehdr->avltokhd = tokhdr; if (aplerr || tokhdr == NULL) break; out = execgetp(execexec()); execpop(&treehdr->avltokhd); /* clean up input stack */ treehdr->avltokhd = toksave; break; } return(errstop(i,NULL,NULL,out)); }