[6507] in Athena Bugs
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 ----