]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update printf %b/%B C2x support
authorJoseph Myers <joseph@codesourcery.com>
Tue, 14 Mar 2023 16:58:35 +0000 (16:58 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 14 Mar 2023 16:58:35 +0000 (16:58 +0000)
WG14 recently accepted two additions to the printf/scanf %b/%B
support: there are now PRIb* and SCNb* macros in <inttypes.h>, and
printf %B is now an optional feature defined in normative text,
instead of recommended practice, with corresponding PRIB* macros that
can also be used to test whether that optional feature is supported.
See N3072 items 14 and 15 for details (those changes were accepted,
some other changes in that paper weren't).

Add the corresponding PRI* macros to glibc and update one place in the
manual referring to %B as recommended.  (SCNb* should naturally be
added at the same time as the corresponding scanf %b support.)

Tested for x86_64 and x86.

NEWS
manual/stdio.texi
stdio-common/tst-printf-binary-main.c
stdlib/inttypes.h

diff --git a/NEWS b/NEWS
index 0f76e7a416b5e628004c56d40ead9c279aa12dbc..c54af824e05539aa50dbb300f4a0243eb53c1868 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,8 @@ Major new features:
   input to the %i format: fscanf, scanf, sscanf, vscanf, vsscanf,
   vfscanf, fwscanf, wscanf, swscanf, vfwscanf, vwscanf, vswscanf.
 
+* PRIb* and PRIB* macros from C2X have been added to <inttypes.h>.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * In the Linux kernel for the hppa/parisc architecture some of the
index e86aa5933b68656e20e9afa093b480610651f7e9..c502a21036ef3566b407375d8556746fdfa77188 100644 (file)
@@ -1829,7 +1829,7 @@ output, but are different when used with @code{scanf} for input
 Print an integer as an unsigned binary number.  @samp{%b} uses
 lower-case @samp{b} with the @samp{#} flag and @samp{%B} uses
 upper-case.  @samp{%b} is an ISO C2X feature; @samp{%B} is an
-extension recommended by ISO C2X.  @xref{Integer Conversions}, for
+optional ISO C2X feature.  @xref{Integer Conversions}, for
 details.
 
 @item @samp{%o}
index e94b8b5959fc014f1c553cc09b64458ed2c02c9f..0784368d85be61d5f4d13f473fd7ddfe38ba95c5 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <inttypes.h>
 #include <limits.h>
 #include <stdio.h>
 #include <string.h>
@@ -77,6 +78,58 @@ do_test (void)
                "10000111011001010100001100100001", "%lB",
                0xfedcba9987654321ul);
 #endif
+  CHECK_PRINTF ("0b11", "%#" PRIb8, (uint8_t) 3);
+  CHECK_PRINTF ("0b11", "%#" PRIb16, (uint16_t) 3);
+  CHECK_PRINTF ("0b10000111011001010100001100100001", "%#" PRIb32,
+               (uint32_t) 0x87654321);
+  CHECK_PRINTF ("0b11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIb64,
+               (uint64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0b11", "%#" PRIbLEAST8, (uint_least8_t) 3);
+  CHECK_PRINTF ("0b11", "%#" PRIbLEAST16, (uint_least16_t) 3);
+  CHECK_PRINTF ("0b10000111011001010100001100100001", "%#" PRIbLEAST32,
+               (uint_least32_t) 0x87654321);
+  CHECK_PRINTF ("0b11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIbLEAST64,
+               (uint_least64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0b11", "%#" PRIbFAST8, (uint_fast8_t) 3);
+  CHECK_PRINTF ("0b11", "%#" PRIbFAST16, (uint_fast16_t) 3);
+  CHECK_PRINTF ("0b10000111011001010100001100100001", "%#" PRIbFAST32,
+               (uint_fast32_t) 0x87654321);
+  CHECK_PRINTF ("0b11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIbFAST64,
+               (uint_fast64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0b10000111011001010100001100100001", "%#" PRIbPTR,
+               (uintptr_t) 0x87654321);
+  CHECK_PRINTF ("0b11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIbMAX,
+               (uintmax_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0B11", "%#" PRIB8, (uint8_t) 3);
+  CHECK_PRINTF ("0B11", "%#" PRIB16, (uint16_t) 3);
+  CHECK_PRINTF ("0B10000111011001010100001100100001", "%#" PRIB32,
+               (uint32_t) 0x87654321);
+  CHECK_PRINTF ("0B11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIB64,
+               (uint64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0B11", "%#" PRIBLEAST8, (uint_least8_t) 3);
+  CHECK_PRINTF ("0B11", "%#" PRIBLEAST16, (uint_least16_t) 3);
+  CHECK_PRINTF ("0B10000111011001010100001100100001", "%#" PRIBLEAST32,
+               (uint_least32_t) 0x87654321);
+  CHECK_PRINTF ("0B11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIBLEAST64,
+               (uint_least64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0B11", "%#" PRIBFAST8, (uint_fast8_t) 3);
+  CHECK_PRINTF ("0B11", "%#" PRIBFAST16, (uint_fast16_t) 3);
+  CHECK_PRINTF ("0B10000111011001010100001100100001", "%#" PRIBFAST32,
+               (uint_fast32_t) 0x87654321);
+  CHECK_PRINTF ("0B11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIBFAST64,
+               (uint_fast64_t) 0xfedcba9987654321ull);
+  CHECK_PRINTF ("0B10000111011001010100001100100001", "%#" PRIBPTR,
+               (uintptr_t) 0x87654321);
+  CHECK_PRINTF ("0B11111110110111001011101010011001"
+               "10000111011001010100001100100001", "%#" PRIBMAX,
+               (uintmax_t) 0xfedcba9987654321ull);
   CHECK_PRINTF (" 1010", "%5b", 10u);
   CHECK_PRINTF (" 1010", "%5B", 10u);
   CHECK_PRINTF ("01010", "%05b", 10u);
index a5fa97b7c8b126eaf39177fbd501c17c7764ff4e..0ace21f54d86e663f984f5cf706e78b432ed781f 100644 (file)
@@ -164,6 +164,45 @@ typedef wchar_t __gwchar_t;
 # define PRIxPTR       __PRIPTR_PREFIX "x"
 # define PRIXPTR       __PRIPTR_PREFIX "X"
 
+/* Binary notation.  */
+# if __GLIBC_USE (ISOC2X)
+#  define PRIb8                "b"
+#  define PRIb16       "b"
+#  define PRIb32       "b"
+#  define PRIb64       __PRI64_PREFIX "b"
+
+#  define PRIbLEAST8   "b"
+#  define PRIbLEAST16  "b"
+#  define PRIbLEAST32  "b"
+#  define PRIbLEAST64  __PRI64_PREFIX "b"
+
+#  define PRIbFAST8    "b"
+#  define PRIbFAST16   __PRIPTR_PREFIX "b"
+#  define PRIbFAST32   __PRIPTR_PREFIX "b"
+#  define PRIbFAST64   __PRI64_PREFIX "b"
+
+#  define PRIbMAX      __PRI64_PREFIX "b"
+#  define PRIbPTR      __PRIPTR_PREFIX "b"
+
+#  define PRIB8                "B"
+#  define PRIB16       "B"
+#  define PRIB32       "B"
+#  define PRIB64       __PRI64_PREFIX "B"
+
+#  define PRIBLEAST8   "B"
+#  define PRIBLEAST16  "B"
+#  define PRIBLEAST32  "B"
+#  define PRIBLEAST64  __PRI64_PREFIX "B"
+
+#  define PRIBFAST8    "B"
+#  define PRIBFAST16   __PRIPTR_PREFIX "B"
+#  define PRIBFAST32   __PRIPTR_PREFIX "B"
+#  define PRIBFAST64   __PRI64_PREFIX "B"
+
+#  define PRIBMAX      __PRI64_PREFIX "B"
+#  define PRIBPTR      __PRIPTR_PREFIX "B"
+# endif
+
 
 /* Macros for scanning format specifiers.  */