# #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; }