91 lines
1.3 KiB
C
91 lines
1.3 KiB
C
#
|
|
|
|
#include "m6.h"
|
|
|
|
control() {
|
|
|
|
while(1) {
|
|
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)&0177776;
|
|
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;
|
|
}
|