#

#include "m6.h"


doif() {
/***/	register i;
/***/	register short *p;
	char *arg();
	i = 1;
	while(!comp(arg(i),one)) if((i =+ 2)>8) return;
	p = arg(i+1) - 2;
	ge = move(p,&gf->ga0,p->word+1);
	setscan(dummy); 
}

bindec(n) {
	if(n == 0) return;
	bindec(n/10);
	*ge++ = (n%10) + '0'; 
}

result(n) {
/***/	register char *p;
	setscan(dummy);
	ge = 2 + (p = &gf->ga0);
	if(n<0) {
		*ge++ = '-'; 
		n = -n; 
	}
	if(n==0) *ge++ = '0'; 
	else bindec(n);
	*ge++ = 0; 
/***/	ge = (ge+1)&~1;
	p->word = ge - p;
	*ge++ = *ge++ = 0; 
}

binop(code) {
	int r1,r2;
	int r,t;
	int arg1, arg2;
	arg1 = decbin(1);
	arg2 = decbin(2);
	if(code < 7)	/* relationals */
		result((code & ((arg1<arg2)?4:(arg1==arg2)?2:1)) != 0);
	else if(code < 9) 	/* seq=7 sne=8 */
		result((code==7)==comp(arg(1),arg(2)));
	else switch (code) {
	case 9: 
		result(arg1+arg2); 
		return;
	case 10: 
		result(arg1-arg2); 
		return;
	case 11: 
		result(arg1*arg2); 
		return;
	case 12: 
		result(arg1/arg2);
		if(arg2==0) gf->ga0 = 0; 
		return;
	case 13:	/* exp */
		r = 1;
		while(arg2-->0) r =* arg1;
		result(r);
		if(arg2<-1) gf->ga0 = 0; 
	} 
}

decbin(i) {
/***/	register char *s;
	char t;
/***/	register n;
	if(t = (*(s = arg(i))=='-')) s++;
	n = 0;
	while(*s>='0' && *s<='9') n = 10*n + *s++ - '0';
	return(t?-n:n); 
}

dnl() {
/***/	register char d;
	d = 0;
	while(d=getchar()) if(d=='\n') return; 
}

quote() {
/***/	register char *p,*s;
	p = finddef(1);
	s = &p[p->dtext];
	while(c = *s++) put(); 
}

list() {
/***/	register n,i;
/***/	register char *p;
	if((n=decbin(1))<=0) return;
	p = df;
	for(i=1;;) {
		if(p<=d0) return;
		if(p->dswitch>=0)
			if(i++>=n) break;
		p =+ p->prev; 
	}
	for(p = &p->dident;c = *p++;)
		put(); 
}

copy() {
/***/	register char *p;
	p = finddef(1);
	remove(2);
	newdef(p->dswitch);
	setdef(arg(2),p+p->dtext); 
}

go(n) {
	if(comp(arg(1),one)) {
		popget();
		if(lg>0)
			if(n==26) popget();
			else setscan(gf->mframe);	/* gobk=27 */
	}  
}

size() {
/***/	register i;
/***/	register char *p;
	i = 0;
	p = arg(1);
	while(*p++ != 0) i++;
	result(i); 
}

meta() {
	char d;
/***/	register i;
	char *arg();
	if((d = *arg(2))!=0) {
		for(i=0;i<NMETA;i++)
			if(metas[i]== *arg(1)) metas[i] = d; 
	}
}

substr() {
/***/	register char *s;
	int arg2,arg3;
	char *arg();
	newdef(-1);
	setscan(df);
	s = arg(1);
	arg2 = decbin(2);
	arg3 = *arg(3)==0?32767:decbin(3);
	if(arg2<1) { 
		arg3 =+ arg2-1; 
		arg2=1; 
	}
	while(--arg2>0 && *s!=0) s++;
	while(arg3-->0) {
		if((*de++ = *s++)==0) return;
		if(de>dmax) diag("No room for substr"); 
	}
	*de++ = 0; 
}
