Metropoli BBS
VIEWER: execqfxk.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/* execqfxk APL2 V1.0.0 ************************************************
* Called from execqfxb and apledit after all necessary function        *
* statements have been parsed into token lists pointed to by fp->    *
* functokp.  Execqfxk will count tokens, and reallocate them in a      *
* contiguous block of memory.                                          *
***********************************************************************/
#define INCLUDES APLCB+APLFUNCI+APLMEM+APLTOKEN
#include "includes.h"
void execqfxk(fp)
struct aplfunc *fp; /* function definition structure */
{
	Execqfxc; Pop;
	extern int aplerr;
	Apltoken fromhdr,tok,*tokary,tohdr,totok;
	int *cntary,stmtcnt,stmtno,subcnt,totcnt;

	stmtcnt = fp->funcstmt;
	totcnt = 0; /* now count tokens */
	cntary = fp->functokc;
	tokary = fp->functokp;
	for (stmtno = 0; stmtno < stmtcnt; stmtno++) {
		subcnt = 0;
		for (tok = *tokary++; tok != NULL; 
			tok = tok->token_queue.token_next_ptr)
			subcnt++;
		*cntary++ = subcnt; /* token count this statement */
		totcnt += subcnt; /* add to grand total */
	}
	fp->functotl = totcnt; /* save total */
	totok = fp->functary = malloc(totcnt * sizeof(struct apltoken));
	if (NULL == totok) return; /* out of memory */
	tokary = fp->functokp; /* now copy tokens */
	for (stmtno = 0; stmtno < stmtcnt; stmtno++) {
		fromhdr = *tokary; /* next from token list header */
		*tokary++ = totok; /* next to-token list header */
		while (NULL != (tok = pop(&fromhdr)))
			totok = execqfxc(totok,tok); /* copy token, bump totok */
	}
}
[ RETURN TO DIRECTORY ]