⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -