about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-09-12 21:23:32 +0000
committerUlrich Drepper <drepper@redhat.com>1999-09-12 21:23:32 +0000
commit3e95f6602b226e0de06aaff686dc47b282d7cc16 (patch)
treeaf601260d008b35cec4ce49b4446cb2410aba35d
parent7814856974388a856a575fa45f88d502c8a1ab29 (diff)
downloadglibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.tar.gz
glibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.tar.xz
glibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.zip
Update.
	* stdio-common/vfprintf.c: Remove limitation on size of precision
	for integers.
-rw-r--r--ChangeLog3
-rw-r--r--stdio-common/vfprintf.c98
2 files changed, 52 insertions, 49 deletions
diff --git a/ChangeLog b/ChangeLog
index c4f86938db..eed31e6480 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 1999-09-12  Ulrich Drepper  <drepper@cygnus.com>
 
+	* stdio-common/vfprintf.c: Remove limitation on size of precision
+	for integers.
+
 	* posix/fnmatch.c (internal_fnmatch): Make it compilable outside
 	glibc by defining internal_function if it isn't already.
 
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 9a8ebabd42..0f892b19a3 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -687,19 +687,15 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
 	    }								      \
 	}								      \
 									      \
-      prec -= workend - string;						      \
-									      \
-      if (prec > 0)							      \
-	/* Add zeros to the precision.  */				      \
-	while (prec-- > 0)						      \
-	  *string-- = L_('0');						      \
-      else if (number.word != 0 && alt && base == 8)			      \
+      if (prec <= workend - string && number.word != 0 && alt && base == 8)   \
 	/* Add octal marker.  */					      \
 	*string-- = L_('0');						      \
 									      \
+      prec = MAX (0, prec - (workend - string));			      \
+									      \
       if (!left)							      \
 	{								      \
-	  width -= workend - string;					      \
+	  width -= workend - string + prec;				      \
 									      \
 	  if (number.word != 0 && alt && base == 16)			      \
 	    /* Account for 0X hex marker.  */				      \
@@ -708,63 +704,67 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
 	  if (is_negative || showsign || space)				      \
 	    --width;							      \
 									      \
-	  if (pad == L_('0'))						      \
+	  if (pad == L_(' '))						      \
 	    {								      \
-	      while (width-- > 0)					      \
-		*string-- = L_('0');					      \
-									      \
-	      if (number.word != 0 && alt && base == 16)		      \
-		{							      \
-		  *string-- = spec;					      \
-		  *string-- = L_('0');					      \
-		}							      \
-									      \
-	      if (is_negative)						      \
-		*string-- = L_('-');					      \
-	      else if (showsign)					      \
-		*string-- = L_('+');					      \
-	      else if (space)						      \
-		*string-- = L_(' ');					      \
+	      PAD (L_(' '));						      \
+	      width = 0;						      \
 	    }								      \
-	  else								      \
+									      \
+	  if (is_negative)						      \
+	    PUTC (L_('-'), s);						      \
+	  else if (showsign)						      \
+	    PUTC (L_('+'), s);						      \
+	  else if (space)						      \
+	    PUTC (L_(' '), s);						      \
+									      \
+	  if (number.word != 0 && alt && base == 16)			      \
 	    {								      \
-	      if (number.word != 0 && alt && base == 16)		      \
-		{							      \
-		  *string-- = spec;					      \
-		  *string-- = L_('0');					      \
-		}							      \
-									      \
-	      if (is_negative)						      \
-		*string-- = L_('-');					      \
-	      else if (showsign)					      \
-		*string-- = L_('+');					      \
-	      else if (space)						      \
-		*string-- = L_(' ');					      \
-									      \
-	      while (width-- > 0)					      \
-		*string-- = L_(' ');					      \
+	      PUTC (L_('0'), s);					      \
+	      PUTC (spec, s);						      \
 	    }								      \
 									      \
+	  width += prec;						      \
+	  PAD (L_('0'));						      \
+									      \
 	  outstring (string + 1, workend - string);			      \
 									      \
 	  break;							      \
 	}								      \
       else								      \
 	{								      \
-	  if (number.word != 0 && alt && base == 16)			      \
+	  if (is_negative)						      \
 	    {								      \
-	      *string-- = spec;						      \
-	      *string-- = L_('0');					      \
+	      PUTC (L_('-'), s);					      \
+	      --width;							      \
 	    }								      \
-									      \
-	  if (is_negative)						      \
-	    *string-- = L_('-');					      \
 	  else if (showsign)						      \
-	    *string-- = L_('+');					      \
+	    {								      \
+	      PUTC (L_('+'), s);					      \
+	      --width;							      \
+	    }								      \
 	  else if (space)						      \
-	    *string-- = L_(' ');					      \
+	    {								      \
+	      PUTC (L_(' '), s);					      \
+	      --width;							      \
+	    }								      \
+									      \
+	  if (number.word != 0 && alt && base == 16)			      \
+	    {								      \
+	      PUTC (L_('0'), s);					      \
+	      PUTC (spec, s);						      \
+	      width -= 2;						      \
+	    }								      \
+									      \
+	  width -= workend - string + prec;				      \
+									      \
+	  if (prec > 0)							      \
+	    {								      \
+	      int temp = width;						      \
+	      width = prec;						      \
+	      PAD (L_('0'));;						      \
+	      width = temp;						      \
+	    }								      \
 									      \
-	  width -= workend - string;					      \
 	  outstring (string + 1, workend - string);			      \
 									      \
 	  PAD (L_(' '));						      \