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

📄 dc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
				readptr++;			*readptr = p;			if(p != 0)				rewind(p);			else {				if((c = readc()) != '\n')					unreadc(c);			}			continue;		case '?':			if(++readptr == &readstk[RDSKSZ]) {				error("nesting depth\n");			}			*readptr = 0;			fsave = curfile;			curfile = &bin;			while((c = readc()) == '!')				command();			p = salloc(0);			sputc(p,c);			while((c = readc()) != '\n') {				sputc(p,c);				if(c == '\\')					sputc(p,readc());			}			curfile = fsave;			*readptr = p;			continue;		case '!':			if(command() == 1)				goto execute;			continue;		case '<':		case '>':		case '=':			if(cond(c) == 1)				goto execute;			continue;		default:			Bprint(&bout,"%o is unimplemented\n",c);		}	}}Blk*div(Blk *ddivd, Blk *ddivr){	int divsign, remsign, offset, divcarry,		carry, dig, magic, d, dd, under, first;	long c, td, cc;	Blk *ps, *px, *p, *divd, *divr;	dig = 0;	under = 0;	divcarry = 0;	rem = 0;	p = salloc(0);	if(length(ddivr) == 0) {		pushp(ddivr);		Bprint(&bout,"divide by 0\n");		return(p);	}	divsign = remsign = first = 0;	divr = ddivr;	fsfile(divr);	if(sbackc(divr) == -1) {		divr = copy(ddivr,length(ddivr));		chsign(divr);		divsign = ~divsign;	}	divd = copy(ddivd,length(ddivd));	fsfile(divd);	if(sfbeg(divd) == 0 && sbackc(divd) == -1) {		chsign(divd);		divsign = ~divsign;		remsign = ~remsign;	}	offset = length(divd) - length(divr);	if(offset < 0)		goto ddone;	seekc(p,offset+1);	sputc(divd,0);	magic = 0;	fsfile(divr);	c = sbackc(divr);	if(c < 10)		magic++;	c = c * 100 + (sfbeg(divr)?0:sbackc(divr));	if(magic>0){		c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2;		c /= 25;	}	while(offset >= 0) {		first++;		fsfile(divd);		td = sbackc(divd) * 100;		dd = sfbeg(divd)?0:sbackc(divd);		td = (td + dd) * 100;		dd = sfbeg(divd)?0:sbackc(divd);		td = td + dd;		cc = c;		if(offset == 0)			td++;		else			cc++;		if(magic != 0)			td = td<<3;		dig = td/cc;		under=0;		if(td%cc < 8  && dig > 0 && magic) {			dig--;			under=1;		}		rewind(divr);		rewind(divxyz);		carry = 0;		while(sfeof(divr) == 0) {			d = sgetc(divr)*dig+carry;			carry = d / 100;			salterc(divxyz,d%100);		}		salterc(divxyz,carry);		rewind(divxyz);		seekc(divd,offset);		carry = 0;		while(sfeof(divd) == 0) {			d = slookc(divd);			d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry;			carry = 0;			if(d < 0) {				d += 100;				carry = 1;			}			salterc(divd,d);		}		divcarry = carry;		backc(p);		salterc(p,dig);		backc(p);		fsfile(divd);		d=sbackc(divd);		if((d != 0) && /*!divcarry*/ (offset != 0)) {			d = sbackc(divd) + 100;			salterc(divd,d);		}		if(--offset >= 0)			divd->wt--;	}	if(under) {	/* undershot last - adjust*/		px = copy(divr,length(divr));	/*11/88 don't corrupt ddivr*/		chsign(px);		ps = add(px,divd);		fsfile(ps);		if(length(ps) > 0 && sbackc(ps) < 0) {			release(ps);	/*only adjust in really undershot*/		} else {			release(divd);			salterc(p, dig+1);			divd=ps;		}	}	if(divcarry != 0) {		salterc(p,dig-1);		salterc(divd,-1);		ps = add(divr,divd);		release(divd);		divd = ps;	}	rewind(p);	divcarry = 0;	while(sfeof(p) == 0){		d = slookc(p)+divcarry;		divcarry = 0;		if(d >= 100){			d -= 100;			divcarry = 1;		}		salterc(p,d);	}	if(divcarry != 0)salterc(p,divcarry);	fsfile(p);	while(sfbeg(p) == 0) {		if(sbackc(p) != 0)			break;		truncate(p);	}	if(divsign < 0)		chsign(p);	fsfile(divd);	while(sfbeg(divd) == 0) {		if(sbackc(divd) != 0)			break;		truncate(divd);	}ddone:	if(remsign<0)		chsign(divd);	if(divr != ddivr)		release(divr);	rem = divd;	return(p);}intdscale(void){	Blk *dd, *dr, *r;	int c;	dr = pop();	EMPTYS;	dd = pop();	EMPTYSR(dr);	fsfile(dd);	skd = sunputc(dd);	fsfile(dr);	skr = sunputc(dr);	if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)) {		sputc(dr,skr);		pushp(dr);		Bprint(&bout,"divide by 0\n");		return(1);	}	if(sfbeg(dd) == 1 || (sfbeg(dd) == 0 && sbackc(dd) == 0)) {		sputc(dd,skd);		pushp(dd);		return(1);	}	c = k-skd+skr;	if(c < 0)		r = removr(dd,-c);	else {		r = add0(dd,c);		irem = 0;	}	arg1 = r;	arg2 = dr;	savk = k;	return(0);}Blk*removr(Blk *p, int n){	int nn, neg;	Blk *q, *s, *r;	fsfile(p);	neg = sbackc(p);	if(neg < 0)		chsign(p);	rewind(p);	nn = (n+1)/2;	q = salloc(nn);	while(n>1) {		sputc(q,sgetc(p));		n -= 2;	}	r = salloc(2);	while(sfeof(p) == 0)		sputc(r,sgetc(p));	release(p);	if(n == 1){		s = div(r,tenptr);		release(r);		rewind(rem);		if(sfeof(rem) == 0)			sputc(q,sgetc(rem));		release(rem);		if(neg < 0){			chsign(s);			chsign(q);			irem = q;			return(s);		}		irem = q;		return(s);	}	if(neg < 0) {		chsign(r);		chsign(q);		irem = q;		return(r);	}	irem = q;	return(r);}Blk*dcsqrt(Blk *p){	Blk *t, *r, *q, *s;	int c, n, nn;	n = length(p);	fsfile(p);	c = sbackc(p);	if((n&1) != 1)		c = c*100+(sfbeg(p)?0:sbackc(p));	n = (n+1)>>1;	r = salloc(n);	zero(r);	seekc(r,n);	nn=1;	while((c -= nn)>=0)		nn+=2;	c=(nn+1)>>1;	fsfile(r);	backc(r);	if(c>=100) {		c -= 100;		salterc(r,c);		sputc(r,1);	} else		salterc(r,c);	for(;;){		q = div(p,r);		s = add(q,r);		release(q);		release(rem);		q = div(s,sqtemp);		release(s);		release(rem);		s = copy(r,length(r));		chsign(s);		t = add(s,q);		release(s);		fsfile(t);		nn = sfbeg(t)?0:sbackc(t);		if(nn>=0)			break;		release(r);		release(t);		r = q;	}	release(t);	release(q);	release(p);	return(r);}Blk*dcexp(Blk *base, Blk *ex){	Blk *r, *e, *p, *e1, *t, *cp;	int temp, c, n;	r = salloc(1);	sputc(r,1);	p = copy(base,length(base));	e = copy(ex,length(ex));	fsfile(e);	if(sfbeg(e) != 0)		goto edone;	temp=0;	c = sbackc(e);	if(c<0) {		temp++;		chsign(e);	}	while(length(e) != 0) {		e1=div(e,sqtemp);		release(e);		e = e1;		n = length(rem);		release(rem);		if(n != 0) {			e1=mult(p,r);			release(r);			r = e1;		}		t = copy(p,length(p));		cp = mult(p,t);		release(p);		release(t);		p = cp;	}	if(temp != 0) {		if((c = length(base)) == 0) {			goto edone;		}		if(c>1)			create(r);		else {			rewind(base);			if((c = sgetc(base))<=1) {				create(r);				sputc(r,c);			} else				create(r);		}	}edone:	release(p);	release(e);	return(r);}voidinit(int argc, char *argv[]){	Sym *sp;	Dir *d;	ARGBEGIN {	default:		dbg = 1;		break;	} ARGEND	ifile = 1;	curfile = &bin;	if(*argv){		d = dirstat(*argv);		if(d == nil) {			fprint(2, "dc: can't open file %s\n", *argv);			exits("open");		}		if(d->mode & DMDIR) {			fprint(2, "dc: file %s is a directory\n", *argv);			exits("open");		}		free(d);		if((curfile = Bopen(*argv, OREAD)) == 0) {			fprint(2,"dc: can't open file %s\n", *argv);			exits("open");		}	}/*	dummy = malloc(0);  /* prepare for garbage-collection */	scalptr = salloc(1);	sputc(scalptr,0);	basptr = salloc(1);	sputc(basptr,10);	obase=10;	logten=log2(10L);	ll=70;	fw=1;	fw1=0;	tenptr = salloc(1);	sputc(tenptr,10);	obase=10;	inbas = salloc(1);	sputc(inbas,10);	sqtemp = salloc(1);	sputc(sqtemp,2);	chptr = salloc(0);	strptr = salloc(0);	divxyz = salloc(0);	stkbeg = stkptr = &stack[0];	stkend = &stack[STKSZ];	stkerr = 0;	readptr = &readstk[0];	k=0;	sp = sptr = &symlst[0];	while(sptr < &symlst[TBLSZ]) {		sptr->next = ++sp;		sptr++;	}	sptr->next=0;	sfree = &symlst[0];}voidpushp(Blk *p){	if(stkptr == stkend) {		Bprint(&bout,"out of stack space\n");		return;	}	stkerr=0;	*++stkptr = p;	return;}Blk*pop(void){	if(stkptr == stack) {		stkerr=1;		return(0);	}	return(*stkptr--);}Blk*readin(void){	Blk *p, *q;	int dp, dpct, c;	dp = dpct=0;	p = salloc(0);	for(;;){		c = readc();		switch(c) {		case '.':			if(dp != 0)				goto gotnum;			dp++;			continue;		case '\\':			readc();			continue;		default:			if(c >= 'A' && c <= 'F')				c = c - 'A' + 10;			else			if(c >= '0' && c <= '9')				c -= '0';			else				goto gotnum;			if(dp != 0) {				if(dpct >= 99)					continue;				dpct++;			}			create(chptr);			if(c != 0)				sputc(chptr,c);			q = mult(p,inbas);			release(p);			p = add(chptr,q);			release(q);		}	}gotnum:	unreadc(c);	if(dp == 0) {		sputc(p,0);		return(p);	} else {		q = scale(p,dpct);		return(q);	}}/* * returns pointer to struct with ct 0's & p */Blk*add0(Blk *p, int ct){	Blk *q, *t;	q = salloc(length(p)+(ct+1)/2);	while(ct>1) {		sputc(q,0);		ct -= 2;	}	rewind(p);	while(sfeof(p) == 0) {		sputc(q,sgetc(p));	}	release(p);	if(ct == 1) {		t = mult(tenptr,q);		release(q);		return(t);	}	return(q);}Blk*mult(Blk *p, Blk *q){	Blk *mp, *mq, *mr;	int sign, offset, carry;	int cq, cp, mt, mcr;	offset = sign = 0;	fsfile(p);	mp = p;	if(sfbeg(p) == 0) {		if(sbackc(p)<0) {			mp = copy(p,length(p));			chsign(mp);			sign = ~sign;		}	}	fsfile(q);	mq = q;	if(sfbeg(q) == 0){		if(sbackc(q)<0) {			mq = copy(q,length(q));			chsign(mq);			sign = ~sign;		}	}	mr = salloc(length(mp)+length(mq));	zero(mr);	rewind(mq);	while(sfeof(mq) == 0) {		cq = sgetc(mq);		rewind(mp);		rewind(mr);		mr->rd += offset;		carry=0;		while(sfeof(mp) == 0) {			cp = sgetc(mp);			mcr = sfeof(mr)?0:slookc(mr);			mt = cp*cq + carry + mcr;			carry = mt/100;			salterc(mr,mt%100);		}		offset++;		if(carry != 0) {			mcr = sfeof(mr)?0:slookc(mr);			salterc(mr,mcr+carry);		}	}	if(sign < 0) {		chsign(mr);	}	if(mp != p)		release(mp);	if(mq != q)		release(mq);	return(mr);}voidchsign(Blk *p){	int carry;	char ct;	carry=0;	rewind(p);	while(sfeof(p) == 0) {		ct=100-slookc(p)-carry;		carry=1;		if(ct>=100) {			ct -= 100;			carry=0;		}		salterc(p,ct);	}	if(carry != 0) {		sputc(p,-1);		fsfile(p);		backc(p);		ct = sbackc(p);		if(ct == 99 /*&& !sfbeg(p)*/) {			truncate(p);			sputc(p,-1);		}	} else{		fsfile(p);		ct = sbackc(p);		if(ct == 0)			truncate(p);	}	return;}intreadc(void){loop:	if((readptr != &readstk[0]) && (*readptr != 0)) {		if(sfeof(*readptr) == 0)			return(lastchar = sgetc(*readptr));		release(*readptr);		readptr--;		goto loop;	}	lastchar = Bgetc(curfile);	if(lastchar != -1)		return(lastchar);	if(readptr != &readptr[0]) {		readptr--;		if(*readptr == 0)			curfile = &bin;		goto loop;	}	if(curfile != &bin) {		Bterm(curfile);		curfile = &bin;		goto loop;	}	exits(0);	return 0;	/* shut up ken */}voidunreadc(char c){	if((readptr != &readstk[0]) && (*readptr != 0)) {		sungetc(*readptr,c);	} else		Bungetc(curfile);	return;}voidbinop(char c){	Blk *r;	r = 0;	switch(c) {	case '+':		r = add(arg1,arg2);		break;	case '*':		r = mult(arg1,arg2);		break;	case '/':		r = div(arg1,arg2);		break;	}	release(arg1);	release(arg2);	sputc(r,savk);	pushp(r);}voiddcprint(Blk *hptr){	Blk *p, *q, *dec;	int dig, dout, ct, sc;	rewind(hptr);	while(sfeof(hptr) == 0) {		if(sgetc(hptr)>99) {			rewind(hptr);			while(sfeof(hptr) == 0) {				Bprint(&bout,"%c",sgetc(hptr));			}			Bprint(&bout,"\n");			return;		}	}	fsfile(hptr);	sc = sbackc(hptr);	if(sfbeg(hptr) != 0) {		Bprint(&bout,"0\n");		return;	}	count = ll;	p = copy(hptr,length(hptr));	sclobber(p);	fsfile(p);	if(sbackc(p)<0) {		chsign(p);		OUTC('-');	}	if((obase == 0) || (obase == -1)) {		oneot(p,sc,'d');		return;	}	if(obase == 1) {		oneot(p,sc,'1');		return;	}	if(obase == 10) {		tenot(p,sc);		return;	}	/* sleazy hack to scale top of stack - divide by 1 */	pushp(p);	sputc(p, sc);	p=salloc(0);	create(p);	sputc(p, 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -