summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorJelle Raaijmakers <jelle@gmta.nl>2021-04-04 02:01:24 +0200
committerAndreas Kling <kling@serenityos.org>2021-04-04 08:28:47 +0200
commit5e5f0245b6aa42d07343b8ae04b8dbfb175fe4ef (patch)
tree4bd8957f255aa1f4dec787b2864043580f247364 /Userland
parent7f1f6d96b404be21cd873a8a2eb408ec732c6a39 (diff)
downloadserenity-5e5f0245b6aa42d07343b8ae04b8dbfb175fe4ef.zip
LibC: Teach `vsscanf()` to consume the width specifier
Previously, `vsscanf()` would crash whenever it encountered a width specification. Now, it consumes the width specification but does not yet do anything with it.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibC/scanf.cpp8
-rw-r--r--Userland/Tests/LibC/scanf.cpp1
2 files changed, 9 insertions, 0 deletions
diff --git a/Userland/Libraries/LibC/scanf.cpp b/Userland/Libraries/LibC/scanf.cpp
index aae825a426..964f219d72 100644
--- a/Userland/Libraries/LibC/scanf.cpp
+++ b/Userland/Libraries/LibC/scanf.cpp
@@ -418,6 +418,14 @@ extern "C" int vsscanf(const char* input, const char* format, va_list ap)
format_lexer.ignore(); // '%'
+ // Parse width specification
+ [[maybe_unused]] int width_specifier = 0;
+ if (format_lexer.next_is(isdigit)) {
+ auto width_digits = format_lexer.consume_while([](char c) { return isdigit(c); });
+ width_specifier = width_digits.to_int().value();
+ // FIXME: Actually use width specifier
+ }
+
bool invert_scanlist = false;
StringView scanlist;
LengthModifier length_modifier { None };
diff --git a/Userland/Tests/LibC/scanf.cpp b/Userland/Tests/LibC/scanf.cpp
index 73f6c858ad..a23e93316b 100644
--- a/Userland/Tests/LibC/scanf.cpp
+++ b/Userland/Tests/LibC/scanf.cpp
@@ -170,6 +170,7 @@ const TestSuite test_suites[] {
{ "%d", "", 0, 0, {}, {} },
{ "%x", "0x519", 1, 1, { unsignedarg0 }, { to_value_t(0x519) } },
{ "%x", "0x51g", 1, 1, { unsignedarg0 }, { to_value_t(0x51u) } },
+ { "%06x", "0xabcdef", 1, 1, { unsignedarg0 }, { to_value_t(0xabcdefu) } },
{ "\"%%%d#", "\"%42#", 1, 1, { intarg0 }, { to_value_t(42) } },
{ " %d", "42", 1, 1, { intarg0 }, { to_value_t(42) } },
{ "%d", " 42", 1, 1, { intarg0 }, { to_value_t(42) } },