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