summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbcollins <tailor@grayson>2006-06-01 13:19:34 -0400
committerBen Collins <bcollins@ubuntu.com>2006-06-01 13:19:34 -0400
commit2eef8bee4ac907438f98a0dac9a3eaeef037933e (patch)
tree9f6ce33e3a686bb420a6d209be674f6557aecf92
parent2c1534d944a471e36d58573fb29713933b150f95 (diff)
downloadsilo-2eef8bee4ac907438f98a0dac9a3eaeef037933e.tar.gz
[silo @ 144]
Handle %L format.#
-rw-r--r--common/printf.c17
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);