aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2011-01-14 15:21:24 +0000
committerKeir Fraser <keir@xen.org>2011-01-14 15:21:24 +0000
commit23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa (patch)
treedbdd924b804bda549e0f12fd94483bfce780738e
parent48f902c059c84c1630b752cae00333814a96482a (diff)
downloadxen-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.c43
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' )
{