aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--manual/stdio.texi2
-rw-r--r--stdio-common/tst-printf-binary-main.c53
-rw-r--r--stdlib/inttypes.h39
4 files changed, 95 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 0f76e7a..c54af82 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 e86aa59..c502a21 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 e94b8b5..0784368 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 a5fa97b..0ace21f 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. */