public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] Update printf %b/%B C2x support
@ 2023-03-14 16:58 Joseph Myers
  0 siblings, 0 replies; only message in thread
From: Joseph Myers @ 2023-03-14 16:58 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=2d4728e60621c8844ec679291aa5458c622d8f4f

commit 2d4728e60621c8844ec679291aa5458c622d8f4f
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Tue Mar 14 16:58:35 2023 +0000

    Update printf %b/%B C2x support
    
    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.

Diff:
---
 NEWS                                  |  2 ++
 manual/stdio.texi                     |  2 +-
 stdio-common/tst-printf-binary-main.c | 53 +++++++++++++++++++++++++++++++++++
 stdlib/inttypes.h                     | 39 ++++++++++++++++++++++++++
 4 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 0f76e7a416..c54af824e0 100644
--- 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
diff --git a/manual/stdio.texi b/manual/stdio.texi
index e86aa5933b..c502a21036 100644
--- a/manual/stdio.texi
+++ b/manual/stdio.texi
@@ -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}
diff --git a/stdio-common/tst-printf-binary-main.c b/stdio-common/tst-printf-binary-main.c
index e94b8b5959..0784368d85 100644
--- a/stdio-common/tst-printf-binary-main.c
+++ b/stdio-common/tst-printf-binary-main.c
@@ -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);
diff --git a/stdlib/inttypes.h b/stdlib/inttypes.h
index a5fa97b7c8..0ace21f54d 100644
--- a/stdlib/inttypes.h
+++ b/stdlib/inttypes.h
@@ -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.  */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-14 16:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-14 16:58 [glibc] Update printf %b/%B C2x support Joseph Myers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).