mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
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.
This commit is contained in:
parent
447273e0bf
commit
2d4728e606
2
NEWS
2
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
|
||||
|
@ -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}
|
||||
|
@ -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);
|
||||
|
@ -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. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user