diff options
author | Joseph Myers <joseph@codesourcery.com> | 2023-06-19 19:40:34 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2023-06-19 19:40:34 +0000 |
commit | 2d88df541132f09454d947c498103aa7be76b652 (patch) | |
tree | 93e7cc592019cda92c8edb9a30ac4f1c2757386c /stdio-common/vfscanf-internal.c | |
parent | 5f83b2674e42cd74257731b281f66d0442bf045f (diff) | |
download | glibc-2d88df541132f09454d947c498103aa7be76b652.tar.gz glibc-2d88df541132f09454d947c498103aa7be76b652.tar.xz glibc-2d88df541132f09454d947c498103aa7be76b652.zip |
C2x scanf %b support
ISO C2x defines scanf %b for input of binary integers (with an optional 0b or 0B prefix). Implement such support, along with the corresponding SCNb* macros in <inttypes.h>. Unlike the support for binary integers with 0b or 0B prefix with scanf %i, this is supported in all versions of scanf (independent of the standards mode used for compilation), because there are no backwards compatibility concerns (%b wasn't previously a supported format) the way there were for %i. Tested for x86_64 and x86.
Diffstat (limited to 'stdio-common/vfscanf-internal.c')
-rw-r--r-- | stdio-common/vfscanf-internal.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c index a3ebf63554..bfb9baa21a 100644 --- a/stdio-common/vfscanf-internal.c +++ b/stdio-common/vfscanf-internal.c @@ -1381,6 +1381,10 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, base = 8; goto number; + case L_('b'): /* Binary integer. */ + base = 2; + goto number; + case L_('u'): /* Unsigned decimal integer. */ base = 10; goto number; @@ -1428,10 +1432,11 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, c = inchar (); } } - else if ((mode_flags & SCANF_ISOC23_BIN_CST) != 0 - && base == 0 - && width != 0 - && TOLOWER (c) == L_('b')) + else if (width != 0 + && TOLOWER (c) == L_('b') + && (base == 2 + || ((mode_flags & SCANF_ISOC23_BIN_CST) != 0 + && base == 0))) { base = 2; if (width > 0) |