#

#include "m6.h"

control() {

/***/	for (;;) {
		get();
		if(c==0 && lg>0)  {
			popget(); 
			trash(); 
			rescan = 1; 
		}
		else {
			if(!rescan) put();
			else if(lq>0) {
				if(c==lquote) {
					lq++; 
					put(); 
				}
				else if(c==rquote || c==0)  {
					lq--;
					if(lq>0 || l9>0) put (rquote); 
				}
				else put(); 
			}
			else if(l9>0) 
				if(c==colon||c==0||c==semi) 
					if(--l9<=0) endcall();
					else put();
				else {
					if(c==sharp) l9++;
					else if(c==lquote) lq++;
					put(); 
				}
			else {
				if(c==sharp) begincall();
				else if(c==lquote) lq++;
				else if(lp>0) {
					if(c==colon||c==0||c==semi) endcall();
					else if(c==comma) newarg();
					else put(); 
				}
				else if(c==0) return;	/* lg=lp=lq=0 */
				else put(); 
			} 
		} 
	} 
}

endcall() {
	char *pt, *p;
	rescan = c!=semi;
	newarg();
	pushget();
	pt = &pf->pa0;
	ge = move(pt,&gf->ga0,pe-pt);
	if(ge>gmax) diag("Call stack overflow");
	if(traceflag) dotrace();
	p = finddef(0);
	setscan(p);
	popput();
	lp--;
	function(p->dswitch); 
}

begincall() {
	lp++;
	pushput();
	pe = pf+pend;
	pf->pan = pf->pa0 = 0;
}

newarg() {
	char *p;
	if(++pf->pan>=9) if(c==comma) l9++;
	*pe++ = 0;
/***/	pe = (pe+1)&~1;
	p = &pf->pa0;
	while(p->word!=0) p =+ p->word;
	p->word = pe - p;
	*pe++ = *pe++ = 0; 
}

setscan(p) 
char *p;
{
	gf->mchar = (gf->mframe = p)->dtext;
	gf->marg = 0; 
}
