Metropoli BBS
VIEWER: execbrkt.c MODE: TEXT (ASCII)
/* 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 */
}
[ RETURN TO DIRECTORY ]