[4269] in Athena Bugs
Fix to RT _doprnt returning bogus info
daemon@ATHENA.MIT.EDU (epeisach@ATHENA.MIT.EDU)
Mon Feb 19 20:39:56 1990
From: epeisach@ATHENA.MIT.EDU
Date: Mon, 19 Feb 90 20:39:31 -0500
To: bugs@ATHENA.MIT.EDU
Slightly gross of a fix, but it does the trick.
I simply count up all characters that are printed with putc and sent to
strout. I tried to be efficient whenever possible. Someone really should
check this carefully in case I missed anything.
Ezra
RCS file: doprnt.c,v
retrieving revision 1.1
diff -c -r1.1 doprnt.c
*** /tmp/,RCSt1019423 Mon Feb 19 20:37:31 1990
--- doprnt.c Mon Feb 19 20:35:24 1990
***************
*** 71,76 ****
--- 71,77 ----
int c1,c2,c3; /* floating-point print counters */
char t[128], digits[15], ljust, zfill, plus, spacef, pound;
char *ecvt(), *fcvt();
+ short cout = 0;
p = &t[0];
while (c = *fmt++)
***************
*** 78,83 ****
--- 79,85 ----
*p++ = c;
if (p >= t+sizeof(t)) {
_strout(p-t, t, 0, file);
+ cout += p-t;
p = &t[0];
}
}
***************
*** 84,89 ****
--- 86,92 ----
else {
if (p != &t[0]) {
_strout(p-t, t, 0, file);
+ cout += p-t;
p = &t[0];
}
pound= spacef= plus= ljust= 0;
***************
*** 180,187 ****
if (ndigit > INTPRECLIMIT) ndigit = INTPRECLIMIT;
if ((!n)&& (zfill=='0')&& (ndigit)&& (d!='d')&&
(!ljust)) {
! putc('0',file);
n= (width>ndigit ? width : ndigit) - 1;
while (n-- > 0) putc('0',file);
break;
}
--- 183,191 ----
if (ndigit > INTPRECLIMIT) ndigit = INTPRECLIMIT;
if ((!n)&& (zfill=='0')&& (ndigit)&& (d!='d')&&
(!ljust)) {
! putc('0',file); cout++;
n= (width>ndigit ? width : ndigit) - 1;
+ cout += n;
while (n-- > 0) putc('0',file);
break;
}
***************
*** 227,232 ****
--- 231,237 ----
d = -d;
if (ljust) zfill = ' ';
_strout(p-q, q, d, file, zfill);
+ cout += p-q;
p = &t[0];
break;
case 's':
***************
*** 283,301 ****
*p++= 0;
q= &t[0];
d1= width - (c1 + c2 + c3 + p - q - 1);
! if ((!ljust) && (zfill==' '))
for (d=1; d<=d1; d++) putc(zfill,file);
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file);
! if ((!ljust) && (zfill=='0'))
for (d=1; d<=d1; d++) putc(zfill,file);
! while ((*q != '.') && (*q != 0)) putc(*q++,file);
for (d=1; d<=c1; d++) putc ('0',file);
! if (*q=='.') putc (*q++,file);
for (d=1; d<=c2; d++) putc ('0',file);
! while (*q != 0) putc (*q++,file);
for (d=1; d<=c3; d++) putc ('0',file);
! if (ljust) for (d=1; d<=d1; d++) putc(' ',file);
p= &t[0];
break;
case 'e':
--- 288,313 ----
*p++= 0;
q= &t[0];
d1= width - (c1 + c2 + c3 + p - q - 1);
! if ((!ljust) && (zfill==' ')) {
! cout += d1;
for (d=1; d<=d1; d++) putc(zfill,file);
+ }
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file), cout++;
! if ((!ljust) && (zfill=='0')) {
! cout += d1;
for (d=1; d<=d1; d++) putc(zfill,file);
! }
! while ((*q != '.') && (*q != 0)) putc(*q++,file), cout++;
! cout += c1;
for (d=1; d<=c1; d++) putc ('0',file);
! if (*q=='.') putc (*q++,file), cout++;
! cout += c2;
for (d=1; d<=c2; d++) putc ('0',file);
! while (*q != 0) putc (*q++,file), cout++;
! cout += c3;
for (d=1; d<=c3; d++) putc ('0',file);
! if (ljust) {cout +=d1; for (d=1; d<=d1; d++) putc(' ',file);}
p= &t[0];
break;
case 'e':
***************
*** 345,361 ****
eprt: *p++ = 0;
q= &t[0];
d1= width - (c1 + p - q - 1);
! if ((!ljust) && (zfill==' '))
for (d=1; d<=d1; d++) putc(zfill,file);
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file);
! if ((!ljust) && (zfill=='0'))
for (d=1; d<=d1; d++) putc(zfill,file);
while ((*q != 'e') && (*q != 'E') && (*q))
! putc(*q++,file);
for (d=1; d<=c1; d++) putc ('0',file);
! while (*q) putc (*q++,file);
! if (ljust) for (d=1; d<=d1; d++) putc(' ',file);
p= &t[0];
break;
case 'g':
--- 357,378 ----
eprt: *p++ = 0;
q= &t[0];
d1= width - (c1 + p - q - 1);
! if ((!ljust) && (zfill==' ')) {
! cout += d1;
for (d=1; d<=d1; d++) putc(zfill,file);
+ }
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file), cout++;
! if ((!ljust) && (zfill=='0')) {
! cout += d1;
for (d=1; d<=d1; d++) putc(zfill,file);
+ }
while ((*q != 'e') && (*q != 'E') && (*q))
! putc(*q++,file), cout++;
! cout += c1;
for (d=1; d<=c1; d++) putc ('0',file);
! while (*q) putc (*q++,file), cout++;
! if (ljust) { cout += d1; for (d=1; d<=d1; d++) putc(' ',file);}
p= &t[0];
break;
case 'g':
***************
*** 401,421 ****
}
q= &t[0];
d1= width - (c1 + c2 + p - q);
! if ((!ljust) && (zfill==' '))
for (d=1; d<=d1; d++)
putc(zfill,file);
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file);
! if ((!ljust) && (zfill=='0'))
for (d=1; d<=d1; d++)
putc(zfill,file);
while ((*q !='e') && (*q !='E') && (*q))
! putc(*q++,file);
! if (c1) putc('.',file);
for (d=1; d<=c2; d++) putc('0',file);
! while (*q) putc(*q++,file);
! if (ljust) for (d=1; d<=d1; d++)
putc(' ',file);
p= &t[0];
break;
}
--- 418,444 ----
}
q= &t[0];
d1= width - (c1 + c2 + p - q);
! if ((!ljust) && (zfill==' ')) {
! cout += d1;
for (d=1; d<=d1; d++)
putc(zfill,file);
+ }
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file), cout++;
! if ((!ljust) && (zfill=='0')) {
! cout += d1;
for (d=1; d<=d1; d++)
putc(zfill,file);
+ }
while ((*q !='e') && (*q !='E') && (*q))
! putc(*q++,file), cout++;
! if (c1) putc('.',file), cout++;
! cout += c2;
for (d=1; d<=c2; d++) putc('0',file);
! while (*q) putc(*q++,file), cout++;
! if (ljust) { cout += d1; for (d=1; d<=d1; d++)
putc(' ',file);
+ }
p= &t[0];
break;
}
***************
*** 433,449 ****
}
q= &t[0];
d1= width - (c1 + p - q);
! if ((!ljust) && (zfill==' '))
for (d=1; d<=d1; d++)
putc(zfill,file);
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file);
! if ((!ljust) && (zfill=='0'))
for (d=1; d<=d1; d++) putc(zfill,file);
! while (*q != 0) putc(*q++,file);
for (d=1; d<=c1; d++) putc ('0',file);
! if (ljust)
for (d=1; d<=d1; d++) putc(' ',file);
p= &t[0];
break;
}
--- 456,479 ----
}
q= &t[0];
d1= width - (c1 + p - q);
! if ((!ljust) && (zfill==' ')) {
! cout += d1;
for (d=1; d<=d1; d++)
putc(zfill,file);
+ }
if ((*q=='+') || (*q=='-') || (*q==' '))
! putc(*q++,file), cout++;
! if ((!ljust) && (zfill=='0')) {
! cout += d1;
for (d=1; d<=d1; d++) putc(zfill,file);
! }
! while (*q != 0) putc(*q++,file), cout++;
! cout += c1;
for (d=1; d<=c1; d++) putc ('0',file);
! if (ljust) {
! cout += d1;
for (d=1; d<=d1; d++) putc(' ',file);
+ }
p= &t[0];
break;
}
***************
*** 453,457 ****
}
}
if (p != &t[0])
! _strout(p-t, t, 0, file);
}
--- 483,488 ----
}
}
if (p != &t[0])
! _strout(p-t, t, 0, file), cout += p-t ;
! return cout;
}