aboutsummaryrefslogtreecommitdiff
path: root/stdio-common/vfprintf.c
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 /stdio-common/vfprintf.c
parent7814856974388a856a575fa45f88d502c8a1ab29 (diff)
downloadglibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.zip
glibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.tar.gz
glibc-3e95f6602b226e0de06aaff686dc47b282d7cc16.tar.bz2
Update.
* stdio-common/vfprintf.c: Remove limitation on size of precision for integers.
Diffstat (limited to 'stdio-common/vfprintf.c')
-rw-r--r--stdio-common/vfprintf.c98
1 files changed, 49 insertions, 49 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 9a8ebab..0f892b1 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_(' ')); \