/*Copyright (C) 1992, 1996 by Thomas Glen Smith. All Rights Reserved.*/ /* aplgroup APL2 V1.0.0 ************************************************ * Called from aplwksp to do )GROUP. * ***********************************************************************/ #define INCLUDES STRING+APLTOKEN+APLCB+TREE #include "includes.h" void aplgroup(rite,cp,cpend) Aplcb rite; /* aplcb for command text */ char *cp; /* Pointer to char immediately after right parenthesis */ char *cpend; /* Pointer to end of command text */ { Aplgrouq; Aplgrous; Execmsg; Execpars; Execpop; Treenode; extern int aplerr; Apltoken grphdr=NULL,nametok,tok,tokhdr; int cplen,cols=0,rows=0; Avlnode p; char *nameptr; Aplcb namecb=NULL; cplen=cpend-cp; for (tok = tokhdr = execpars(cp,cplen); tok != NULL && aplerr == 0; tok = tok->token_queue.token_next_ptr) { nametok = tok; /* save potential group name token */ if (tok->token_code != OPERAND_TOKEN) aplerr = 58; /* syntax error */ } if (tokhdr == NULL) aplerr = 58; /* syntax error */ for (;;) { /* allow use of break */ if (aplerr) break; nameptr = nametok->token_ptr.token_string; if (NULL != (p = treenode(nameptr)) && NULL != (namecb = p->avlleaf) && !(namecb->aplflags & APLGROUP)) aplerr = 118; /* group name already in use */ for (tok = tokhdr; tok != nametok && aplerr == 0; tok = tok->token_queue.token_next_ptr) if (0 == strcmp(nameptr,tok->token_ptr.token_string)) if (namecb == NULL) aplerr = 119; /* recursive name undefined */ else /* add existing group to new group */ aplgrouq(&grphdr,&rows,&cols,namecb); else /* add new name to new group */ aplgrour(&grphdr,&rows,&cols, tok->token_ptr.token_string, strlen(tok->token_ptr.token_string)); if (aplerr == 0) aplgrous(&grphdr,rows,cols,nameptr); /* finish group */ break; } execpop(&tokhdr); /* pop and free tokens on stack */ execpop(&grphdr); /* pop and free tokens on stack */ }