From: Dag-Erling Smørgrav Date: Mon, 28 Aug 2023 15:32:23 +0000 (+0000) Subject: lib/printf: Implement N2630. X-Git-Tag: base_9.1~97^2~3 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=3ca2253b13a871c97d72a014a261b41d7f75a660;p=mirror%2Ffrr.git lib/printf: Implement N2630. This adds formatted input/output of binary integer numbers to the printf(), scanf(), and strtol() families, including their wide-character counterparts. Reviewed by: imp, emaste Differential Revision: https://reviews.freebsd.org/D41511 FRR changes only include printf(), scanf/strtol are not locally implemented in FRR. Signed-off-by: David Lamparter (cherry picked from FreeBSD commit d9dc1603d6e48cca84cad3ebe859129131b8387c) --- diff --git a/lib/printf/printfcommon.h b/lib/printf/printfcommon.h index 7285e7f5ac..b3a7ca0c13 100644 --- a/lib/printf/printfcommon.h +++ b/lib/printf/printfcommon.h @@ -169,6 +169,13 @@ __ultoa(u_long val, CHAR *endp, int base, int octzero, const char *xdigs) } while (sval != 0); break; + case 2: + do { + *--cp = to_char(val & 1); + val >>= 1; + } while (val); + break; + case 8: do { *--cp = to_char(val & 7); @@ -219,6 +226,13 @@ __ujtoa(uintmax_t val, CHAR *endp, int base, int octzero, const char *xdigs) } while (sval != 0); break; + case 2: + do { + *--cp = to_char(val & 1); + val >>= 1; + } while (val); + break; + case 8: do { *--cp = to_char(val & 7); diff --git a/lib/printf/vfprintf.c b/lib/printf/vfprintf.c index 1290d08648..78f8be05cb 100644 --- a/lib/printf/vfprintf.c +++ b/lib/printf/vfprintf.c @@ -419,6 +419,19 @@ reswitch: switch (ch) { case 'z': flags |= SIZET; goto rflag; + case 'B': + case 'b': + if (flags & INTMAX_SIZE) + ujval = UJARG(); + else + ulval = UARG(); + base = 2; + /* leading 0b/B only if non-zero */ + if (flags & ALT && + (flags & INTMAX_SIZE ? ujval != 0 : ulval != 0)) + ox[1] = ch; + goto nosign; + break; case 'C': flags |= LONGINT; /*FALLTHROUGH*/