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

📄 dc.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 3 页
字号:
	if((p->rd-p->beg)*2 > sc){		c = sbackc(p);		printf("%d.",c/10);		TEST2;		OUTC(c%10 +'0');		sc--;	}	else {		OUTC('.');	}	if(sc > (p->rd-p->beg)*2){		while(sc>(p->rd-p->beg)*2){			OUTC('0');			sc--;		}	}	while(sc > 1){		c = sbackc(p);		if(c<10)printf("0%d",c);		else printf("%d",c);		sc -= 2;		TEST2;	}	if(sc == 1){		OUTC(sbackc(p)/10 +'0');	}	printf("\n");	release(p);	return;}oneot(p,sc,ch)struct blk *p;char ch;{	register struct 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);	printf("\n");	return;}hexot(p,flg)struct blk *p;{	register int c;	rewind(p);	if(sfeof(p) != 0){		sputc(strptr,'0');		release(p);		return;	}	c = sgetc(p);	release(p);	if(c >= 16){		printf("hex digit > 16");		return;	}	sputc(strptr,c<10?c+'0':c-10+'A');	return;}bigot(p,flg)struct blk *p;{	register struct blk *t,*q;	register int l;	int neg;	if(flg == 1)t = salloc(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){			sunputc(strptr);			sputc(strptr,'-');		}	}	sputc(strptr,' ');	return;}struct blk *add(a1,a2)struct blk *a1,*a2;{	register struct blk *p;	register int carry,n;	int size;	int 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){		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 == EOF)break;		}		sgetc(p);		salterc(p,-1);		truncate(p);	}	return(p);}eqk(){	register struct blk *p,*q;	register int skp;	int 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);	}	else if(skp < skq){		savk = skq;		p = add0(p,skq-skp);	}	else {		savk = skp;		q = add0(q,skp-skq);	}	arg1=p;	arg2=q;	return(0);}struct blk *removc(p,n)struct blk *p;{	register struct blk *q,*r;	rewind(p);	while(n>1){		sgetc(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);}struct blk *scalint(p)struct blk *p;{	register int n;	n = sunputc(p);	p = removc(p,n);	return(p);}struct blk *scale(p,n)struct blk *p;{	register struct blk *q,*s,*t;	t = add0(p,n);	q = salloc(1);	sputc(q,n);	s = exp(inbas,q);	release(q);	q = div(t,s);	release(t);	release(s);	release(rem);	sputc(q,n);	return(q);}subt(){	arg1=pop();	EMPTYS;	savk = sunputc(arg1);	chsign(arg1);	sputc(arg1,savk);	pushp(arg1);	if(eqk() != 0)return(1);	binop('+');	return(0);}command(){	int c;	char line[100],*sl;	register (*savint)(),pid,rpid;	int retcode;	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/sh","sh","-c",line,0);			exit(0100);		}		savint = signal(SIGINT, SIG_IGN);		while((rpid = wait(&retcode)) != pid && rpid != -1);		signal(SIGINT,savint);		printf("!\n");		return(0);	}}cond(c)char c;{	register struct blk *p;	register char cc;	if(subt() != 0)return(1);	p = pop();	sunputc(p);	if(length(p) == 0){		release(p);		if(c == '<' || c == '>' || c == NE){			readc();			return(0);		}		load();		return(1);	}	else {		if(c == '='){			release(p);			readc();			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)){		readc();		return(0);	}	load();	return(1);}load(){	register int c;	register struct blk *p,*q;	struct blk *t,*s;	c = readc() & 0377;	sptr = stable[c];	if(sptr != 0){		p = sptr->val;		if(c >= ARRAYST){			q = salloc(length(p));			rewind(p);			while(sfeof(p) == 0){				s = getwd(p);				if(s == 0){putwd(q, (struct blk *)NULL);}				else{					t = copy(s,length(s));					putwd(q,t);				}			}			pushp(q);		}		else{			q = copy(p,length(p));			pushp(q);		}	}	else{		q = salloc(1);		sputc(q,0);		pushp(q);	}	return;}log2(n)long n;{	register int i;	if(n == 0)return(0);	i=31;	if(n<0)return(i);	while((n= n<<1) >0)i--;	return(--i);}struct blk *salloc(size)int size;{	register struct blk *hdr;	register char *ptr;	all++;	nbytes += 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 = (struct blk *)hdr->rd;	hdr->rd = hdr->wt = hdr->beg = ptr;	hdr->last = ptr+size;	return(hdr);}struct blk *morehd(){	register struct blk *h,*kk;	headmor++;	nbytes += HEADSZ;	hfree = h = (struct blk *)malloc(HEADSZ);	if(hfree == 0){		garbage("morehd");		if((hfree = h = (struct blk *)malloc(HEADSZ)) == 0)			ospace("headers");	}	kk = h;	while(h<hfree+(HEADSZ/BLK))(h++)->rd = (char *)++kk;	(--h)->rd=0;	return(hfree);}/*sunputc(hptr)struct blk *hptr;{	hptr->wt--;	hptr->rd = hptr->wt;	return(*hptr->wt);}*/struct blk *copy(hptr,size)struct blk *hptr;int size;{	register struct blk *hdr;	register unsigned sz;	register char *ptr;	all++;	nbytes += size;	sz = length(hptr);	ptr = nalloc(hptr->beg, (unsigned)size);	if(ptr == 0){		garbage("copy");		if((ptr = nalloc(hptr->beg, (unsigned)size)) == NULL){			printf("copy size %d\n",size);			ospace("copy");		}	}	if((hdr = hfree) == 0)hdr = morehd();	hfree = (struct 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);}sdump(s1,hptr)char *s1;struct blk *hptr;{	char *p;	printf("%s %o rd %o wt %o beg %o last %o\n",s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last);	p = hptr->beg;	while(p < hptr->wt)printf("%d ",*p++);	printf("\n");}seekc(hptr,n)struct blk *hptr;{	register char *nn,*p;	nn = hptr->beg+n;	if(nn > hptr->last){		nbytes += nn - hptr->last;		free(hptr->beg);		p = realloc(hptr->beg, (unsigned)n);		if(p == 0){			hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));			garbage("seekc");			if((p = realloc(hptr->beg, (unsigned)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;	return;}salterwd(hptr,n)struct wblk *hptr;struct blk *n;{	if(hptr->rdw == hptr->lastw)more(hptr);	*hptr->rdw++ = n;	if(hptr->rdw > hptr->wtw)hptr->wtw = hptr->rdw;	return;}more(hptr)struct blk *hptr;{	register unsigned size;	register char *p;	if((size=(hptr->last-hptr->beg)*2) == 0)size=1;	nbytes += size/2;	free(hptr->beg);	p = realloc(hptr->beg, (unsigned)size);	if(p == 0){		hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));		garbage("more");		if((p = realloc(hptr->beg,size)) == 0)			ospace("more");	}	hptr->rd = hptr->rd-hptr->beg+p;	hptr->wt = hptr->wt-hptr->beg+p;	hptr->beg = p;	hptr->last = p+size;	return;}ospace(s)char *s;{	printf("out of space: %s\n",s);	printf("all %ld rel %ld headmor %ld\n",all,rel,headmor);	printf("nbytes %ld\n",nbytes);	sdump("stk",*stkptr);	abort();}garbage(s)char *s;{	int i;	struct blk *p, *q;	struct sym *tmps;	int ct;/*	printf("got to garbage %s\n",s);	*/	for(i=0;i<TBLSZ;i++){		tmps = stable[i];		if(tmps != 0){			if(i < ARRAYST){				do {					p = tmps->val;					if(((int)p->beg & 01)  != 0){						printf("string %o\n",i);						sdump("odd beg",p);					}					redef(p);					tmps = tmps->next;				} while(tmps != 0);				continue;			}			else {				do {					p = tmps->val;					rewind(p);					ct = 0;					while((q = getwd(p)) != NULL){						ct++;						if(q != 0){							if(((int)q->beg & 01) != 0){								printf("array %o elt %d odd\n",i-ARRAYST,ct);printf("tmps %o p %o\n",tmps,p);								sdump("elt",q);							}							redef(q);						}					}					tmps = tmps->next;				} while(tmps != 0);			}		}	}}redef(p)struct blk *p;{	register offset;	register char *newp;	if ((int)p->beg&01) {		printf("odd ptr %o hdr %o\n",p->beg,p);		ospace("redef-bad");	}	free(p->beg);	free(dummy);	dummy = malloc(1);	if(dummy == NULL)ospace("dummy");	newp = realloc(p->beg, (unsigned)(p->last-p->beg));	if(newp == NULL)ospace("redef");	offset = newp - p->beg;	p->beg = newp;	p->rd += offset;	p->wt += offset;	p->last += offset;}release(p)register struct blk *p;{	rel++;	nbytes -= p->last - p->beg;	p->rd = (char *)hfree;	hfree = p;	free(p->beg);}struct blk *getwd(p)struct blk *p;{	register struct wblk *wp;	wp = (struct wblk *)p;	if (wp->rdw == wp->wtw)		return(NULL);	return(*wp->rdw++);}putwd(p, c)struct blk *p, *c;{	register struct wblk *wp;	wp = (struct wblk *)p;	if (wp->wtw == wp->lastw)		more(p);	*wp->wtw++ = c;}struct blk *lookwd(p)struct blk *p;{	register struct wblk *wp;	wp = (struct wblk *)p;	if (wp->rdw == wp->wtw)		return(NULL);	return(*wp->rdw);}char *nalloc(p,nbytes)register char *p;unsigned nbytes;{	char *malloc();	register char *q, *r;	q = r = malloc(nbytes);	if(q==0)		return(0);	while(nbytes--)		*q++ = *p++;	return(r);}

⌨️ 快捷键说明

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