diff options
Diffstat (limited to 'stdio-common/vfprintf.c')
-rw-r--r-- | stdio-common/vfprintf.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 4abee7ed91..e6c2df25d6 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -492,10 +492,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) long int signed_number; \ \ if (fspec == NULL) \ - if (is_long) \ - signed_number = va_arg (ap, long int); \ - else /* `char' and `short int' will be promoted to `int'. */ \ - signed_number = va_arg (ap, int); \ + { \ + if (is_long) \ + signed_number = va_arg (ap, long int); \ + else /* `char' and `short int' will be promoted to `int'. */ \ + signed_number = va_arg (ap, int); \ + } \ else \ if (is_long) \ signed_number = args_value[fspec->data_arg].pa_long_int; \ @@ -550,9 +552,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) pad = ' '; \ \ /* If the precision is 0 and the number is 0 nothing has to \ - be written for the number. */ \ + be written for the number, except for the 'o' format in \ + alternate form. */ \ if (prec == 0 && number.longlong == 0) \ - string = workend; \ + { \ + string = workend; \ + if (base == 8 && alt) \ + *string-- = '0'; \ + } \ else \ { \ /* Put the number in WORK. */ \ @@ -569,12 +576,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) else \ { \ if (fspec == NULL) \ - if (is_long) \ - number.word = va_arg (ap, unsigned long int); \ - else if (!is_short) \ - number.word = va_arg (ap, unsigned int); \ - else \ - number.word = (unsigned short int) va_arg (ap, unsigned int); \ + { \ + if (is_long) \ + number.word = va_arg (ap, unsigned long int); \ + else if (!is_short) \ + number.word = va_arg (ap, unsigned int); \ + else \ + number.word = (unsigned short int) va_arg (ap, unsigned int); \ + } \ else \ if (is_long) \ number.word = args_value[fspec->data_arg].pa_u_long_int; \ @@ -597,9 +606,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) pad = ' '; \ \ /* If the precision is 0 and the number is 0 nothing has to \ - be written for the number. */ \ + be written for the number, except for the 'o' format in \ + alternate form. */ \ if (prec == 0 && number.word == 0) \ - string = workend; \ + { \ + string = workend; \ + if (base == 8 && alt) \ + *string-- = '0'; \ + } \ else \ { \ /* Put the number in WORK. */ \ @@ -926,14 +940,16 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) LABEL (form_number): \ /* Answer the count of characters written. */ \ if (fspec == NULL) \ - if (is_longlong) \ - *(long long int *) va_arg (ap, void *) = done; \ - else if (is_long) \ - *(long int *) va_arg (ap, void *) = done; \ - else if (!is_short) \ - *(int *) va_arg (ap, void *) = done; \ - else \ - *(short int *) va_arg (ap, void *) = done; \ + { \ + if (is_longlong) \ + *(long long int *) va_arg (ap, void *) = done; \ + else if (is_long) \ + *(long int *) va_arg (ap, void *) = done; \ + else if (!is_short) \ + *(int *) va_arg (ap, void *) = done; \ + else \ + *(short int *) va_arg (ap, void *) = done; \ + } \ else \ if (is_longlong) \ *(long long int *) args_value[fspec->data_arg].pa_pointer = done; \ @@ -1360,8 +1376,8 @@ do_positional: int showsign = specs[nspecs_done].info.showsign; int group = specs[nspecs_done].info.group; int is_long_double = specs[nspecs_done].info.is_long_double; - int is_short = specs[nspecs_done].info.is_short == 1; - int is_char = specs[nspecs_done].info.is_short == 2; + int is_short = specs[nspecs_done].info.is_short; + int is_char = specs[nspecs_done].info.is_char; int is_long = specs[nspecs_done].info.is_long; int width = specs[nspecs_done].info.width; int prec = specs[nspecs_done].info.prec; |