📄 dc.c
字号:
sputc(p, 0); pushp(p); if(dscale() != 0) return; p = div(arg1, arg2); release(arg1); release(arg2); sc = savk; create(strptr); dig = logten*sc; dout = ((dig/10) + dig) / logo; dec = getdec(p,sc); p = removc(p,sc); while(length(p) != 0) { q = div(p,basptr); release(p); p = q; (*outdit)(rem,0); } release(p); fsfile(strptr); while(sfbeg(strptr) == 0) OUTC(sbackc(strptr)); if(sc == 0) { release(dec); Bprint(&bout,"\n"); return; } create(strptr); OUTC('.'); ct=0; do { q = mult(basptr,dec); release(dec); dec = getdec(q,sc); p = removc(q,sc); (*outdit)(p,1); } while(++ct < dout); release(dec); rewind(strptr); while(sfeof(strptr) == 0) OUTC(sgetc(strptr)); Bprint(&bout,"\n");}Blk*getdec(Blk *p, int sc){ int cc; Blk *q, *t, *s; rewind(p); if(length(p)*2 < sc) { q = copy(p,length(p)); return(q); } q = salloc(length(p)); while(sc >= 1) { sputc(q,sgetc(p)); sc -= 2; } if(sc != 0) { t = mult(q,tenptr); s = salloc(cc = length(q)); release(q); rewind(t); while(cc-- > 0) sputc(s,sgetc(t)); sputc(s,0); release(t); t = div(s,tenptr); release(s); release(rem); return(t); } return(q);}voidtenot(Blk *p, int sc){ int c, f; fsfile(p); f=0; while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)) { c = sbackc(p); if((c<10) && (f == 1)) Bprint(&bout,"0%d",c); else Bprint(&bout,"%d",c); f=1; TEST2; } if(sc == 0) { Bprint(&bout,"\n"); release(p); return; } if((p->rd-p->beg)*2 > sc) { c = sbackc(p); Bprint(&bout,"%d.",c/10); TEST2; OUTC(c%10 +'0'); sc--; } else { OUTC('.'); } while(sc>(p->rd-p->beg)*2) { OUTC('0'); sc--; } while(sc > 1) { c = sbackc(p); if(c<10) Bprint(&bout,"0%d",c); else Bprint(&bout,"%d",c); sc -= 2; TEST2; } if(sc == 1) { OUTC(sbackc(p)/10 +'0'); } Bprint(&bout,"\n"); release(p);}voidoneot(Blk *p, int sc, char ch){ Blk *q; q = removc(p,sc); create(strptr); sputc(strptr,-1); while(length(q)>0) { p = add(strptr,q); release(q); q = p; OUTC(ch); } release(q); Bprint(&bout,"\n");}voidhexot(Blk *p, int flg){ int c; USED(flg); rewind(p); if(sfeof(p) != 0) { sputc(strptr,'0'); release(p); return; } c = sgetc(p); release(p); if(c >= 16) { Bprint(&bout,"hex digit > 16"); return; } sputc(strptr,c<10?c+'0':c-10+'a');}voidbigot(Blk *p, int flg){ Blk *t, *q; int neg, l; if(flg == 1) { t = salloc(0); l = 0; } else { t = strptr; l = length(strptr)+fw-1; } neg=0; if(length(p) != 0) { fsfile(p); if(sbackc(p)<0) { neg=1; chsign(p); } while(length(p) != 0) { q = div(p,tenptr); release(p); p = q; rewind(rem); sputc(t,sfeof(rem)?'0':sgetc(rem)+'0'); release(rem); } } release(p); if(flg == 1) { l = fw1-length(t); if(neg != 0) { l--; sputc(strptr,'-'); } fsfile(t); while(l-- > 0) sputc(strptr,'0'); while(sfbeg(t) == 0) sputc(strptr,sbackc(t)); release(t); } else { l -= length(strptr); while(l-- > 0) sputc(strptr,'0'); if(neg != 0) { sclobber(strptr); sputc(strptr,'-'); } } sputc(strptr,' ');}Blk*add(Blk *a1, Blk *a2){ Blk *p; int carry, n, size, c, n1, n2; size = length(a1)>length(a2)?length(a1):length(a2); p = salloc(size); rewind(a1); rewind(a2); carry=0; while(--size >= 0) { n1 = sfeof(a1)?0:sgetc(a1); n2 = sfeof(a2)?0:sgetc(a2); n = n1 + n2 + carry; if(n>=100) { carry=1; n -= 100; } else if(n<0) { carry = -1; n += 100; } else carry = 0; sputc(p,n); } if(carry != 0) sputc(p,carry); fsfile(p); if(sfbeg(p) == 0) { c = 0; while(sfbeg(p) == 0 && (c = sbackc(p)) == 0) ; if(c != 0) salterc(p,c); truncate(p); } fsfile(p); if(sfbeg(p) == 0 && sbackc(p) == -1) { while((c = sbackc(p)) == 99) { if(c == -1) break; } skipc(p); salterc(p,-1); truncate(p); } return(p);}inteqk(void){ Blk *p, *q; int skp, skq; p = pop(); EMPTYS; q = pop(); EMPTYSR(p); skp = sunputc(p); skq = sunputc(q); if(skp == skq) { arg1=p; arg2=q; savk = skp; return(0); } if(skp < skq) { savk = skq; p = add0(p,skq-skp); } else { savk = skp; q = add0(q,skp-skq); } arg1=p; arg2=q; return(0);}Blk*removc(Blk *p, int n){ Blk *q, *r; rewind(p); while(n>1) { skipc(p); n -= 2; } q = salloc(2); while(sfeof(p) == 0) sputc(q,sgetc(p)); if(n == 1) { r = div(q,tenptr); release(q); release(rem); q = r; } release(p); return(q);}Blk*scalint(Blk *p){ int n; n = sunputc(p); p = removc(p,n); return(p);}Blk*scale(Blk *p, int n){ Blk *q, *s, *t; t = add0(p,n); q = salloc(1); sputc(q,n); s = dcexp(inbas,q); release(q); q = div(t,s); release(t); release(s); release(rem); sputc(q,n); return(q);}intsubt(void){ arg1=pop(); EMPTYS; savk = sunputc(arg1); chsign(arg1); sputc(arg1,savk); pushp(arg1); if(eqk() != 0) return(1); binop('+'); return(0);}intcommand(void){ char line[100], *sl; int pid, p, c; switch(c = readc()) { case '<': return(cond(NL)); case '>': return(cond(NG)); case '=': return(cond(NE)); default: sl = line; *sl++ = c; while((c = readc()) != '\n') *sl++ = c; *sl = 0; if((pid = fork()) == 0) { execl("/bin/rc","rc","-c",line,nil); exits("shell"); } for(;;) { if((p = waitpid()) < 0) break; if(p== pid) break; } Bprint(&bout,"!\n"); return(0); }}intcond(char c){ Blk *p; int cc; if(subt() != 0) return(1); p = pop(); sclobber(p); if(length(p) == 0) { release(p); if(c == '<' || c == '>' || c == NE) { getstk(); return(0); } load(); return(1); } if(c == '='){ release(p); getstk(); return(0); } if(c == NE) { release(p); load(); return(1); } fsfile(p); cc = sbackc(p); release(p); if((cc<0 && (c == '<' || c == NG)) || (cc >0) && (c == '>' || c == NL)) { getstk(); return(0); } load(); return(1);}voidload(void){ int c; Blk *p, *q, *t, *s; c = getstk() & 0377; sptr = stable[c]; if(sptr != 0) { p = sptr->val; if(c >= ARRAYST) { q = salloc(length(p)); rewind(p); while(sfeof(p) == 0) { s = dcgetwd(p); if(s == 0) { putwd(q, (Blk*)0); } else { t = copy(s,length(s)); putwd(q,t); } } pushp(q); } else { q = copy(p,length(p)); pushp(q); } } else { q = salloc(1); if(c <= LASTFUN) { Bprint(&bout,"function %c undefined\n",c+'a'-1); sputc(q,'c'); sputc(q,'0'); sputc(q,' '); sputc(q,'1'); sputc(q,'Q'); } else sputc(q,0); pushp(q); }}intlog2(long n){ int i; if(n == 0) return(0); i=31; if(n<0) return(i); while((n= n<<1) >0) i--; return i-1;}Blk*salloc(int size){ Blk *hdr; char *ptr; all++; lall++; if(all - rel > active) active = all - rel; nbytes += size; lbytes += size; if(nbytes >maxsize) maxsize = nbytes; if(size > longest) longest = size; ptr = malloc((unsigned)size); if(ptr == 0){ garbage("salloc"); if((ptr = malloc((unsigned)size)) == 0) ospace("salloc"); } if((hdr = hfree) == 0) hdr = morehd(); hfree = (Blk *)hdr->rd; hdr->rd = hdr->wt = hdr->beg = ptr; hdr->last = ptr+size; return(hdr);}Blk*morehd(void){ Blk *h, *kk; headmor++; nbytes += HEADSZ; hfree = h = (Blk *)malloc(HEADSZ); if(hfree == 0) { garbage("morehd"); if((hfree = h = (Blk*)malloc(HEADSZ)) == 0) ospace("headers"); } kk = h; while(h<hfree+(HEADSZ/BLK)) (h++)->rd = (char*)++kk; (h-1)->rd=0; return(hfree);}Blk*copy(Blk *hptr, int size){ Blk *hdr; unsigned sz; char *ptr; all++; lall++; lcopy++; nbytes += size; lbytes += size; if(size > longest) longest = size; if(size > maxsize) maxsize = size; sz = length(hptr); ptr = nalloc(hptr->beg, size); if(ptr == 0) { garbage("copy"); if((ptr = nalloc(hptr->beg, size)) == 0) { Bprint(&bout,"copy size %d\n",size); ospace("copy"); } } if((hdr = hfree) == 0) hdr = morehd(); hfree = (Blk *)hdr->rd; hdr->rd = hdr->beg = ptr; hdr->last = ptr+size; hdr->wt = ptr+sz; ptr = hdr->wt; while(ptr<hdr->last) *ptr++ = '\0'; return(hdr);}voidsdump(char *s1, Blk *hptr){ char *p; Bprint(&bout,"%s %lx rd %lx wt %lx beg %lx last %lx\n", s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last); p = hptr->beg; while(p < hptr->wt) Bprint(&bout,"%d ",*p++); Bprint(&bout,"\n");}voidseekc(Blk *hptr, int n){ char *nn,*p; nn = hptr->beg+n; if(nn > hptr->last) { nbytes += nn - hptr->last; if(nbytes > maxsize) maxsize = nbytes; lbytes += nn - hptr->last; if(n > longest) longest = n;/* free(hptr->beg); /**/ p = realloc(hptr->beg, n); if(p == 0) {/* hptr->beg = realloc(hptr->beg, hptr->last-hptr->beg);** garbage("seekc");** if((p = realloc(hptr->beg, n)) == 0)*/ ospace("seekc"); } hptr->beg = p; hptr->wt = hptr->last = hptr->rd = p+n; return; } hptr->rd = nn; if(nn>hptr->wt) hptr->wt = nn;}voidsalterwd(Blk *ahptr, Blk *n){ Wblk *hptr; hptr = (Wblk*)ahptr; if(hptr->rdw == hptr->lastw) more(ahptr); *hptr->rdw++ = n; if(hptr->rdw > hptr->wtw) hptr->wtw = hptr->rdw;}voidmore(Blk *hptr){ unsigned size; char *p; if((size=(hptr->last-hptr->beg)*2) == 0) size=2; nbytes += size/2; if(nbytes > maxsize) maxsize = nbytes; if(size > longest) longest = size; lbytes += size/2; lmore++;/* free(hptr->beg);/**/ p = realloc(hptr->beg, size); if(p == 0) {/* hptr->beg = realloc(hptr->beg, (hptr->last-hptr->beg));** garbage("more");** if((p = realloc(hptr->beg,size)) == 0)*/ ospace("more"); } hptr->rd = p + (hptr->rd - hptr->beg); hptr->wt = p + (hptr->wt - hptr->beg); hptr->beg = p; hptr->last = p+size;}voidospace(char *s){ Bprint(&bout,"out of space: %s\n",s); Bprint(&bout,"all %ld rel %ld headmor %ld\n",all,rel,headmor); Bprint(&bout,"nbytes %ld\n",nbytes); sdump("stk",*stkptr); abort();}voidgarbage(char *s){ USED(s);}voidrelease(Blk *p){ rel++; lrel++; nbytes -= p->last - p->beg; p->rd = (char*)hfree; hfree = p; free(p->beg);}Blk*dcgetwd(Blk *p){ Wblk *wp; wp = (Wblk*)p; if(wp->rdw == wp->wtw) return(0); return(*wp->rdw++);}voidputwd(Blk *p, Blk *c){ Wblk *wp; wp = (Wblk*)p; if(wp->wtw == wp->lastw) more(p); *wp->wtw++ = c;}Blk*lookwd(Blk *p){ Wblk *wp; wp = (Wblk*)p; if(wp->rdw == wp->wtw) return(0); return(*wp->rdw);}char*nalloc(char *p, unsigned nbytes){ char *q, *r; q = r = malloc(nbytes); if(q==0) return(0); while(nbytes--) *q++ = *p++; return(r);}intgetstk(void){ int n; uchar c; c = readc(); if(c != '<') return c; n = 0; while(1) { c = readc(); if(c == '>') break; n = n*10+c-'0'; } return n;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -