diff options
author | Keir Fraser <keir@xen.org> | 2011-01-14 15:21:24 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2011-01-14 15:21:24 +0000 |
commit | 23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa (patch) | |
tree | dbdd924b804bda549e0f12fd94483bfce780738e | |
parent | 48f902c059c84c1630b752cae00333814a96482a (diff) | |
download | xen-23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa.tar.gz xen-23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa.tar.bz2 xen-23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa.zip |
hvmloader: Fixes to printf() implementation.
1. Remove unportable O and D format specifiers
2. Fix X format specifier to print upper-case hex characters
3. Fix d format specifier to print -ve numbers
4. Fix handling of int vs. long (although not actually an issue
for the i386 compile target)
5. Don't use the antiquated C 'register' type attribute.
Signed-off-by: Keir Fraser <keir@xen.org>
-rw-r--r-- | tools/firmware/hvmloader/util.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index fe561a4f99..c58ea1071a 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -425,10 +425,10 @@ static char *printnum(char *p, unsigned long num, int base) static void _doprint(void (*put)(char), const char *fmt, va_list ap) { - register char *str, c; + char *str, c; int lflag, zflag, nflag; char buffer[17]; - unsigned value; + unsigned long value; int i, slen, pad; for ( ; *fmt != '\0'; fmt++ ) @@ -457,29 +457,40 @@ static void _doprint(void (*put)(char), const char *fmt, va_list ap) lflag = 1; c = *++fmt; } - if ( (c == 'd') || (c == 'u') || (c == 'o') || (c == 'x') ) + if ( (c == 'd') || (c == 'u') || (c == 'o') || + (c == 'x') || (c == 'X') ) { if ( lflag ) - value = va_arg(ap, unsigned); + { + value = va_arg(ap, unsigned long); + if ( (c == 'd') && ((long)value < 0) ) + { + value = -value; + put('-'); + } + } else - value = (unsigned) va_arg(ap, unsigned int); - str = buffer; - printnum(str, value, - c == 'o' ? 8 : (c == 'x' ? 16 : 10)); - goto printn; - } - else if ( (c == 'O') || (c == 'D') || (c == 'X') ) - { - value = va_arg(ap, unsigned); + { + value = va_arg(ap, unsigned int); + if ( (c == 'd') && ((int)value < 0) ) + { + value = -(int)value; + put('-'); + } + } str = buffer; printnum(str, value, - c == 'O' ? 8 : (c == 'X' ? 16 : 10)); - printn: + c == 'o' ? 8 : ((c == 'x') || (c == 'X') ? 16 : 10)); slen = strlen(str); for ( i = pad - slen; i > 0; i-- ) put(zflag ? '0' : ' '); while ( *str ) - put(*str++); + { + char ch = *str++; + if ( (ch >= 'a') && (c == 'X') ) + ch += 'A'-'a'; + put(ch); + } } else if ( c == 's' ) { |