/*Copyright (C) 1992, 1994 by Thomas Glen Smith. All Rights Reserved.*/ /* funcsusq APL2 V1.0.0 ************************************************ * Called by funcsusp to process the current terminal input. * ***********************************************************************/ #define INCLUDES APLCB+APLCHDEF+APLFUNCI+STDIO+TREE #include "includes.h" int funcsusq(out,pstmtno) Aplcb out; /* current input statement */ int *pstmtno; /* statement number field for suspended functions */ { Apledit; Aplscan; Aplwksp; Drop; Endoper; Execute; Executf; Funcgoto; Getchrv; Iscalar; extern Treelist treehdr; extern int aplerr; char *cp,*cpend,*cs; int i,loop=1,stmtno=0,tempsave; cp = out->aplptr.aplchar; /* point to input line */ cpend = cp + out->aplcount; /* end of input line */ i = aplscan(&cp,cpend); /* find first token code */ switch(i) { case RIGHT_ARROW: if (treehdr->treeflag & SUSPNDED) treehdr->treeflag -= SUSPNDED; /* clear to prior suspended */ loop = 0; /* stop loop */ if (cp == cpend) { /* right arrow standing alone */ endoper(out); aplerr = 997; /* clear state indicator */ *pstmtno = 0; /* get out of function */ } else if (NULL != treehdr->avlfun) { tempsave = out->aplflags & APLTEMP; /* Save. */ cs = out->aplptr.aplchar++; /* Save, and bump. */ out->aplcount--; /* Decrement for right arrow. */ *pstmtno = 1+funcgoto(treehdr->avlfun, executf(out),*pstmtno); /* Get stmtno to goto. */ if (tempsave == 0) { /* Restore values in out. */ out->aplptr.aplchar = cs; out->aplcount++; } } else aplerr = 120; /* no suspended function for branch */ break; case RIGHT_PAREN: loop = aplwksp(out,cp,cpend); if (!loop) aplerr = 998; /* must be )off */ break; case DEL: apledit(out,cp,cpend); break; default: endoper(execute(out)); } /* end switch */ return(loop); }