aboutsummaryrefslogtreecommitdiff
path: root/stdio-common/vfscanf-internal.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2023-06-19 19:40:34 +0000
committerJoseph Myers <joseph@codesourcery.com>2023-06-19 19:40:34 +0000
commit2d88df541132f09454d947c498103aa7be76b652 (patch)
tree93e7cc592019cda92c8edb9a30ac4f1c2757386c /stdio-common/vfscanf-internal.c
parent5f83b2674e42cd74257731b281f66d0442bf045f (diff)
downloadglibc-2d88df541132f09454d947c498103aa7be76b652.zip
glibc-2d88df541132f09454d947c498103aa7be76b652.tar.gz
glibc-2d88df541132f09454d947c498103aa7be76b652.tar.bz2
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.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c
index a3ebf63..bfb9baa 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)