/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */ /* execbrkt APL2 V1.0.0 ************************************************ * Called from execexeg when a right bracket token is found. * ***********************************************************************/ #define INCLUDES APLCHDEF+APLTOKEN+APLCB+TREE #include "includes.h" Apltoken execbrkt(brtok) Apltoken brtok; /* right bracket token */ { Execexec; Execfree; Execpop; Lifo; Newtok; Pop; extern Treelist treehdr; extern int aplerr; Apltoken op,tok=NULL; int i; i = brtok->token_offset; /* save offset */ execfree(brtok); /* free token for right bracket, maybe */ brtok = newtok(AXIS_INDEX_TOKEN, 0, i, NULL, 0); if (brtok == NULL) return(NULL); /* out of storage */ while (aplerr == 0) { op = execexec(); /* go evaluate */ if (aplerr) break; /* all done if error */ if (op == NULL) /*null?*/ op = newtok(NULL_TOKEN, 0, brtok->token_offset, NULL, 0); if (aplerr) break; /* all done if error */ op = lifo(&(brtok->token_ptr.token_stack),op); /* stack */ if (NULL == (tok = pop(&(treehdr->avltokhd)))) aplerr = 80; /* left bracket not found when expected */ if (aplerr) break; /* all done if error */ if (tok->token_code == LEFT_BRACKET) break; if (tok->token_code != SEMICOLON) aplerr = 81; /* semicolon not found when expected */ execfree(tok); /* free semicolon, or whatever it is */ tok = NULL; /* in case of early out */ } execfree(tok); /* free token for left bracket */ return(brtok); /* return stack token */ }