]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib/printf: Implement N2630.
authorDag-Erling Smørgrav <des@FreeBSD.org>
Mon, 28 Aug 2023 15:32:23 +0000 (15:32 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Sun, 3 Sep 2023 21:32:55 +0000 (23:32 +0200)
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 <equinox@opensourcerouting.org>
(cherry picked from FreeBSD commit d9dc1603d6e48cca84cad3ebe859129131b8387c)

lib/printf/printfcommon.h
lib/printf/vfprintf.c

index 7285e7f5acc979df0b1585630a89755704089826..b3a7ca0c13ebfa0f0cbc9267d3346cdd526a5e17 100644 (file)
@@ -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);
index 1290d0864838b04d30631cf9244e104c281e879a..78f8be05cbf9c13b1be165226356cbbc9dd4ecad 100644 (file)
@@ -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*/