[4269] in Athena Bugs

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

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;
  }

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