aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/stdio
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2016-12-16 01:44:50 +0000
committerConrad Meyer <cem@FreeBSD.org>2016-12-16 01:44:50 +0000
commitec055aeff50e6b6311e3307fed436a89d01085da (patch)
tree72f04a1717dc92fd5558d247c91e549766594a7a /lib/libc/stdio
parent93326017f627976ea17f60a1bc17f98f1249c6b3 (diff)
Notes
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r--lib/libc/stdio/vfprintf.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c
index bf45bfb421ede..37b8f3f00d86b 100644
--- a/lib/libc/stdio/vfprintf.c
+++ b/lib/libc/stdio/vfprintf.c
@@ -611,6 +611,37 @@ reswitch: switch (ch) {
case 'z':
flags |= SIZET;
goto rflag;
+ case 'b':
+ {
+ const char *q;
+ int anybitset, bit;
+
+ ulval = (u_int)GETARG(int);
+ cp = GETARG(char *);
+
+ q = __ultoa(ulval, buf + BUF, *cp++, 0, xdigs_lower);
+ PRINT(q, buf + BUF - q);
+
+ if (ulval == 0)
+ break;
+
+ for (anybitset = 0; *cp;) {
+ bit = *cp++;
+ if (ulval & (1 << (bit - 1))) {
+ PRINT(anybitset ? "," : "<", 1);
+ q = cp;
+ for (; (bit = *cp) > ' '; ++cp)
+ continue;
+ PRINT(q, cp - q);
+ anybitset = 1;
+ } else
+ for (; *cp > ' '; ++cp)
+ continue;
+ }
+ if (anybitset)
+ PRINT(">", 1);
+ }
+ continue;
case 'C':
flags |= LONGINT;
/*FALLTHROUGH*/