[6507] in Athena Bugs

home help back first fref pref prev next nref lref last post

dc

daemon@ATHENA.MIT.EDU (daemon@ATHENA.MIT.EDU)
Sat Dec 1 23:35:06 1990

To: bugs@ATHENA.MIT.EDU
Date: Sat, 01 Dec 90 23:34:49 EST
From: John Carr <jfc@ATHENA.MIT.EDU>


I noticed that dc is built with pcc on the RT.  This is not necessary,
and slows it a lot.

Here are patches to the RT dc.  Once these are applied, dc can be
moved into /source/bsd-4.3/common (I have compiled and run it on VAX
and RT).  Compiling with gcc on the VAX would be a good idea, but I
haven't included that change in this patch.

Changes:

	sign extension of unsigned characters can be done with a
	(signed char) cast

	div() is reserved by ANSI C; rename div() to divfn()

	a variable that needs to hold any character and also EOF was
	declared char; it should be type int

	the argument parsing contained a switch with no cases


*** /source/bsd-4.3/rt/usr.bin/dc/dc.c	Sat Aug  8 00:14:40 1987
--- dc.c	Sat Dec  1 22:41:50 1990
***************
*** 579,585 ****
  	}
  }
  struct blk *
! div(ddivd,ddivr)
  struct blk *ddivd,*ddivr;
  {
  	int divsign,remsign,offset,divcarry;
--- 579,585 ----
  	}
  }
  struct blk *
! divfn(ddivd,ddivr)
  struct blk *ddivd,*ddivr;
  {
  	int divsign,remsign,offset,divcarry;
***************
*** 746,752 ****
  	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));
--- 746,752 ----
  	while(sfeof(p) == 0)sputc(r,sgetc(p));
  	release(p);
  	if(n == 1){
! 		s = divfn(r,tenptr);
  		release(r);
  		rewind(rem);
  		if(sfeof(rem) == 0)sputc(q,sgetc(rem));
***************
*** 785,795 ****
  	}
  	else salterc(r,c);
  	while(1){
! 		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));
--- 785,795 ----
  	}
  	else salterc(r,c);
  	while(1){
! 		q = divfn(p,r);
  		s = add(q,r);
  		release(q);
  		release(rem);
! 		q = divfn(s,sqtemp);
  		release(s);
  		release(rem);
  		s = copy(r,length(r));
***************
*** 828,834 ****
  		chsign(e);
  	}
  	while(length(e) != 0){
! 		e1=div(e,sqtemp);
  		release(e);
  		e = e1;
  		n = length(rem);
--- 828,834 ----
  		chsign(e);
  	}
  	while(length(e) != 0){
! 		e1=divfn(e,sqtemp);
  		release(e);
  		e = e1;
  		n = length(rem);
***************
*** 875,882 ****
  	svargc = --argc;
  	svargv = argv;
  	while(svargc>0 && svargv[1][0] == '-'){
! 		switch(svargv[1][1]){
! 		default:
  			dbg=1;
  		}
  		svargc--;
--- 875,881 ----
  	svargc = --argc;
  	svargv = argv;
  	while(svargc>0 && svargv[1][0] == '-'){
! 		if(svargv[1][1]){
  			dbg=1;
  		}
  		svargc--;
***************
*** 1158,1164 ****
  		r = mult(arg1,arg2);
  		break;
  	case '/':
! 		r = div(arg1,arg2);
  		break;
  	}
  	release(arg1);
--- 1157,1163 ----
  		r = mult(arg1,arg2);
  		break;
  	case '/':
! 		r = divfn(arg1,arg2);
  		break;
  	}
  	release(arg1);
***************
*** 1217,1223 ****
  	dec = getdec(p,sc);
  	p = removc(p,sc);
  	while(length(p) != 0){
! 		q = div(p,basptr);
  		release(p);
  		p = q;
  		(*outdit)(rem,0);
--- 1216,1222 ----
  	dec = getdec(p,sc);
  	p = removc(p,sc);
  	while(length(p) != 0){
! 		q = divfn(p,basptr);
  		release(p);
  		p = q;
  		(*outdit)(rem,0);
***************
*** 1272,1278 ****
  		while(cc-- > 0)sputc(s,sgetc(t));
  		sputc(s,0);
  		release(t);
! 		t = div(s,tenptr);
  		release(s);
  		release(rem);
  		return(t);
--- 1271,1277 ----
  		while(cc-- > 0)sputc(s,sgetc(t));
  		sputc(s,0);
  		release(t);
! 		t = divfn(s,tenptr);
  		release(s);
  		release(rem);
  		return(t);
***************
*** 1386,1392 ****
  			chsign(p);
  		}
  		while(length(p) != 0){
! 			q = div(p,tenptr);
  			release(p);
  			p = q;
  			rewind(rem);
--- 1385,1391 ----
  			chsign(p);
  		}
  		while(length(p) != 0){
! 			q = divfn(p,tenptr);
  			release(p);
  			p = q;
  			rewind(rem);
***************
*** 1507,1513 ****
  	q = salloc(2);
  	while(sfeof(p) == 0)sputc(q,sgetc(p));
  	if(n == 1){
! 		r = div(q,tenptr);
  		release(q);
  		release(rem);
  		q = r;
--- 1506,1512 ----
  	q = salloc(2);
  	while(sfeof(p) == 0)sputc(q,sgetc(p));
  	if(n == 1){
! 		r = divfn(q,tenptr);
  		release(q);
  		release(rem);
  		q = r;
***************
*** 1535,1541 ****
  	sputc(q,n);
  	s = exp(inbas,q);
  	release(q);
! 	q = div(t,s);
  	release(t);
  	release(s);
  	release(rem);
--- 1534,1540 ----
  	sputc(q,n);
  	s = exp(inbas,q);
  	release(q);
! 	q = divfn(t,s);
  	release(t);
  	release(s);
  	release(rem);
***************
*** 1586,1592 ****
  char c;
  {
  	register struct blk *p;
! 	register char cc;
  
  	if(subt() != 0)return(1);
  	p = pop();
--- 1585,1591 ----
  char c;
  {
  	register struct blk *p;
! 	register int cc;	/* char or EOF */
  
  	if(subt() != 0)return(1);
  	p = pop();
*** /source/bsd-4.3/rt/usr.bin/dc/dc.h	Sat Aug  8 00:14:41 1987
--- dc.h	Sat Dec  1 23:10:50 1990
***************
*** 22,33 ****
  #define sfeof(p)	(((p)->rd==(p)->wt)?1:0)
  #define sfbeg(p)	(((p)->rd==(p)->beg)?1:0)
  #define sungetc(p,c)	*(--(p)->rd)=c
! #if '\377'>0 /*chars are unsign*/
! #define NEGBYTE 0200
! #define MASK (-1 & ~0377)
! #define sgetc(p)	( ((p)->rd==(p)->wt) ? EOF :( ((*(p)->rd & NEGBYTE) != 0) ? ( *(p)->rd++ | MASK): *(p)->rd++ ))
! #define slookc(p)	( ((p)->rd==(p)->wt) ? EOF :( ((*(p)->rd & NEGBYTE) != 0) ? (*(p)->rd | MASK) : *(p)->rd ))
! #define sbackc(p)	( ((p)->rd==(p)->beg) ? EOF :( ((*(--(p)->rd) & NEGBYTE) != 0) ? (*(p)->rd | MASK): *(p)->rd ))
  #else
  #define sgetc(p)	(((p)->rd==(p)->wt)?EOF:*(p)->rd++)
  #define slookc(p)	(((p)->rd==(p)->wt)?EOF:*(p)->rd)
--- 22,35 ----
  #define sfeof(p)	(((p)->rd==(p)->wt)?1:0)
  #define sfbeg(p)	(((p)->rd==(p)->beg)?1:0)
  #define sungetc(p,c)	*(--(p)->rd)=c
! 
! #if defined(ibm032) && defined(__HIGHC__) || ('\377'>0)
! #define	__CHAR_UNSIGNED__
! #endif
! #ifdef __CHAR_UNSIGNED__
! #define sgetc(p)	(((p)->rd==(p)->wt) ? EOF : (signed char)*(p)->rd++)
! #define slookc(p)	(((p)->rd==(p)->wt) ? EOF : (signed char)*(p)->rd)
! #define sbackc(p)	(((p)->rd==(p)->beg) ? EOF : (signed char)*--(p)->rd)
  #else
  #define sgetc(p)	(((p)->rd==(p)->wt)?EOF:*(p)->rd++)
  #define slookc(p)	(((p)->rd==(p)->wt)?EOF:*(p)->rd)
*** /source/bsd-4.3/rt/usr.bin/dc/Makefile	Fri Feb  9 18:03:54 1990
--- Makefile	Sat Dec  1 23:29:07 1990
***************
*** 9,15 ****
  SRCS=	dc.c dc.h
  CFLAGS=	-O
  IFLAGS=-c -s
- CC=pcc
  
  all: dc
  
--- 9,14 ----


home help back first fref pref prev next nref lref last post