diff options
author | Daniel Stenberg <daniel@haxx.se> | 2013-06-25 09:52:06 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2013-06-25 09:55:49 +0200 |
commit | cb1aa8b0e32068ec4bbbc42d41267420b46a36e7 (patch) | |
tree | 932c53ecd4bd45976c38e6665e018f7ae3900e67 | |
parent | d3d5c4a40e962b37ebee5e01884748e024b66e7b (diff) |
printf: make sure %x are treated unsigned
When using %x, the number must be treated as unsigned as otherwise it
would get sign-extended on for example 64bit machines and do wrong
output. This problem showed when doing printf("%08x", 0xffeeddcc) on a
64bit host.
-rw-r--r-- | lib/mprintf.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/lib/mprintf.c b/lib/mprintf.c index 2ec4a7534..8f392c7f2 100644 --- a/lib/mprintf.c +++ b/lib/mprintf.c @@ -380,11 +380,11 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos, break; case 'x': vto[i].type = FORMAT_INT; - flags |= FLAGS_HEX; + flags |= FLAGS_HEX|FLAGS_UNSIGNED; break; case 'X': vto[i].type = FORMAT_INT; - flags |= FLAGS_HEX|FLAGS_UPPER; + flags |= FLAGS_HEX|FLAGS_UPPER|FLAGS_UNSIGNED; break; case 'c': vto[i].type = FORMAT_INT; @@ -633,23 +633,23 @@ static int dprintf_formatf( OUTCHAR(' '); break; } - if(p->flags & FLAGS_UNSIGNED) { - /* Decimal unsigned integer. */ - base = 10; - goto unsigned_number; - } if(p->flags & FLAGS_OCTAL) { /* Octal unsigned integer. */ base = 8; goto unsigned_number; } - if(p->flags & FLAGS_HEX) { + else if(p->flags & FLAGS_HEX) { /* Hexadecimal unsigned integer. */ digits = (p->flags & FLAGS_UPPER)? upper_digits : lower_digits; base = 16; goto unsigned_number; } + else if(p->flags & FLAGS_UNSIGNED) { + /* Decimal unsigned integer. */ + base = 10; + goto unsigned_number; + } /* Decimal integer. */ base = 10; |