diff options
author | bcollins <tailor@grayson> | 2006-06-01 13:19:34 -0400 |
---|---|---|
committer | Ben Collins <bcollins@ubuntu.com> | 2006-06-01 13:19:34 -0400 |
commit | 2eef8bee4ac907438f98a0dac9a3eaeef037933e (patch) | |
tree | 9f6ce33e3a686bb420a6d209be674f6557aecf92 | |
parent | 2c1534d944a471e36d58573fb29713933b150f95 (diff) | |
download | silo-2eef8bee4ac907438f98a0dac9a3eaeef037933e.tar.gz |
[silo @ 144]
Handle %L format.#
-rw-r--r-- | common/printf.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/common/printf.c b/common/printf.c index a0393de..eed5da2 100644 --- a/common/printf.c +++ b/common/printf.c @@ -64,9 +64,9 @@ int putchar (int __c) /* * Print an unsigned integer in base b, avoiding recursion. */ -static int printn (long n, int b) +static int printn (long long n, int b) { - static char prbuf[24]; + static char prbuf[33]; register char *cp; int count = 0; @@ -78,7 +78,7 @@ static int printn (long n, int b) cp = prbuf; do *cp++ = "0123456789ABCDEF"[(unsigned int) (((unsigned long)n) % b)]; - while ((n = ((unsigned long)n) / b & 0x0FFFFFFF)); + while ((n = ((unsigned long long)n) / b & 0x0FFFFFFFFFFFFFFFULL)); do { putchar (*--cp); count++; @@ -103,7 +103,7 @@ int vprintf (char *fmt, va_list adx) } c = *fmt++; if (c == 'd' || c == 'o' || c == 'x' || c == 'X') { - count += printn ((long) va_arg (adx, unsigned), + count += printn ((long long) va_arg (adx, unsigned), c == 'o' ? 8 : (c == 'd' ? 10 : 16)); } else if (c == 'c') { putchar (va_arg (adx, unsigned)); @@ -116,7 +116,14 @@ int vprintf (char *fmt, va_list adx) count++; } } else if (c == 'l' || c == 'O') { - count += printn ((long) va_arg (adx, long), c == 'l' ? 10 : 8); + count += printn ((long long) va_arg (adx, long), c == 'l' ? 10 : 8); + } else if (c == 'L') { + int hex = 0; + if (*fmt == 'x') { + fmt++; + hex = 1; + } + count += printn ((long long) va_arg (adx, long long), hex ? 16 : 10); } else { /* This is basically what libc's printf does */ putchar('%'); putchar(c); |