Commit 7c203422 authored by Pierre Carrier's avatar Pierre Carrier Committed by Linus Torvalds

lib/vsprintf.c: "%#o",0 becomes '0' instead of '00'

number()'s behaviour is slighly changed: 0 becomes "0" instead of "00"
when using the flag SPECIAL and base 8.

Before:
Number\Format  %o    %#o  %x    %#x
            0     0   00    0   0x0
            1     1   01    1   0x1
           16    20  020   10  0x10

After:
Number\Format  %o    %#o  %x    %#x
            0     0    0    0   0x0
            1     1   01    1   0x1
           16    20  020   10  0x10
Signed-off-by: default avatarPierre Carrier <pierre@spotify.com>
Acked-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Cc: Joe Perches <joe@perches.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 55368052
...@@ -284,6 +284,7 @@ char *number(char *buf, char *end, unsigned long long num, ...@@ -284,6 +284,7 @@ char *number(char *buf, char *end, unsigned long long num,
char locase; char locase;
int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10); int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
int i; int i;
bool is_zero = num == 0LL;
/* locase = 0 or 0x20. ORing digits or letters with 'locase' /* locase = 0 or 0x20. ORing digits or letters with 'locase'
* produces same digits or (maybe lowercased) letters */ * produces same digits or (maybe lowercased) letters */
...@@ -305,8 +306,9 @@ char *number(char *buf, char *end, unsigned long long num, ...@@ -305,8 +306,9 @@ char *number(char *buf, char *end, unsigned long long num,
} }
} }
if (need_pfx) { if (need_pfx) {
spec.field_width--;
if (spec.base == 16) if (spec.base == 16)
spec.field_width -= 2;
else if (!is_zero)
spec.field_width--; spec.field_width--;
} }
...@@ -353,9 +355,11 @@ char *number(char *buf, char *end, unsigned long long num, ...@@ -353,9 +355,11 @@ char *number(char *buf, char *end, unsigned long long num,
} }
/* "0x" / "0" prefix */ /* "0x" / "0" prefix */
if (need_pfx) { if (need_pfx) {
if (buf < end) if (spec.base == 16 || !is_zero) {
*buf = '0'; if (buf < end)
++buf; *buf = '0';
++buf;
}
if (spec.base == 16) { if (spec.base == 16) {
if (buf < end) if (buf < end)
*buf = ('X' | locase); *buf = ('X' | locase);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment