Index: subr_prf.c =================================================================== RCS file: /cvsroot/src/sys/lib/libsa/subr_prf.c,v retrieving revision 1.16 diff -u -r1.16 subr_prf.c --- subr_prf.c 24 Nov 2007 13:20:57 -0000 1.16 +++ subr_prf.c 10 Jan 2010 15:27:19 -0000 @@ -43,6 +43,7 @@ #include "stand.h" static void kprintn(void (*)(int), u_long, int); +static void kprintq(void (*)(int), u_longlong_t, int); static void sputchar(int); static void kdoprnt(void (*)(int), const char *, va_list); @@ -82,7 +83,8 @@ { char *p; int ch; - unsigned long ul; + u_long ul; + u_longlong_t ull; int lflag; for (;;) { @@ -95,45 +97,66 @@ reswitch: switch (ch = *fmt++) { case 'l': - lflag = 1; + if (*fmt == 'l') { + ++fmt; + lflag = 2; + } else { + lflag = 1; + } goto reswitch; case 't': #if 0 /* XXX: abuse intptr_t until the situation with ptrdiff_t is clear */ - lflag = (sizeof(ptrdiff_t) == sizeof(long)); + lflag = !!(sizeof(ptrdiff_t) == sizeof(long)); #else - lflag = (sizeof(intptr_t) == sizeof(long)); + lflag = !!(sizeof(intptr_t) == sizeof(long)); #endif goto reswitch; case 'z': - lflag = (sizeof(size_t) == sizeof(unsigned long)); + lflag = !!(sizeof(size_t) == sizeof(u_long)); goto reswitch; case 'c': ch = va_arg(ap, int); - put(ch & 0x7f); + put(ch & 0xFF); break; case 's': p = va_arg(ap, char *); - while ((ch = *p++)) + while ((ch = (unsigned char)*p++)) put(ch); break; case 'd': - ul = lflag ? - va_arg(ap, long) : va_arg(ap, int); - if ((long)ul < 0) { - put('-'); - ul = -(long)ul; + if (lflag == 1) { + ull = va_arg(ap, longlong_t); + if ((longlong_t)ull < 0) { + put('-'); + ull = -(longlong_t)ull; + } + kprintq(put, ull, 10); + } else { + ul = lflag ? + va_arg(ap, long) : va_arg(ap, int); + if ((long)ul < 0) { + put('-'); + ul = -(long)ul; + } + kprintn(put, ul, 10); } - kprintn(put, ul, 10); break; case 'o': - ul = lflag ? - va_arg(ap, u_long) : va_arg(ap, u_int); - kprintn(put, ul, 8); +#define KPRINT(base) \ +do { \ + if (lflag == 2) { \ + ull = va_arg(ap, u_longlong_t); \ + kprintq(put, ull, base); \ + } else { \ + ul = lflag ? \ + va_arg(ap, u_long) : va_arg(ap, u_int); \ + kprintn(put, ul, base); \ + } \ +} while (/*CONSTCOND*/0) + KPRINT(8); break; case 'u': - ul = lflag ? - va_arg(ap, u_long) : va_arg(ap, u_int); - kprintn(put, ul, 10); + KPRINT(10); break; case 'p': put('0'); @@ -141,9 +164,7 @@ lflag = 1; /* FALLTHROUGH */ case 'x': - ul = lflag ? - va_arg(ap, u_long) : va_arg(ap, u_int); - kprintn(put, ul, 16); + KPRINT(16); break; default: put('%'); @@ -158,7 +179,7 @@ } static void -kprintn(void (*put)(int), unsigned long ul, int base) +kprintn(void (*put)(int), u_long ul, int base) { /* hold a long in base 8 */ char *p, buf[(sizeof(long) * NBBY / 3) + 1]; @@ -171,3 +192,18 @@ put(*--p); } while (p > buf); } + +static void +kprintq(void (*put)(int), u_longlong_t ull, int base) +{ + /* hold a long long in base 8 */ + char *p, buf[(sizeof(longlong_t) * NBBY / 3) + 1]; + + p = buf; + do { + *p++ = hexdigits[ull % base]; + } while (ull /= base); + do { + put(*--p); + } while (p > buf); +}