From 2de7f2021d1f4881ab1b19b63002e3c978634399 Mon Sep 17 00:00:00 2001 From: Jesse Buhagiar Date: Sat, 1 Jan 2022 21:11:02 +1100 Subject: [PATCH] LibC: Support `X` modifier for `scanf` This was currently crashing Half-Life because it was a considered an "Unknown" specifier. We can use the same case statement as the regular hex format conversion (lower case 'x'), as the backend to convert the number already supports upper/lower case input, hence we get it for free :^) --- Tests/LibC/TestScanf.cpp | 3 +++ Userland/Libraries/LibC/scanf.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/Tests/LibC/TestScanf.cpp b/Tests/LibC/TestScanf.cpp index dee99b6611..4291276a4d 100644 --- a/Tests/LibC/TestScanf.cpp +++ b/Tests/LibC/TestScanf.cpp @@ -153,6 +153,9 @@ const TestSuite test_suites[] { { "%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) } }, + { "%X", "0xCAFEBABE", 1, 1, { unsignedarg0 }, { to_value_t(0xcafebabe) } }, + { "%04X", "0x5E4E", 1, 1, { unsignedarg0 }, { to_value_t(0x5e4e) } }, + { "%X", "0x51Eg", 1, 1, { unsignedarg0 }, { to_value_t(0x51e) } }, { "\"%%%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) } }, diff --git a/Userland/Libraries/LibC/scanf.cpp b/Userland/Libraries/LibC/scanf.cpp index d66043aa10..f760922de3 100644 --- a/Userland/Libraries/LibC/scanf.cpp +++ b/Userland/Libraries/LibC/scanf.cpp @@ -488,6 +488,7 @@ extern "C" int vsscanf(const char* input, const char* format, va_list ap) conversion_specifier = ConversionSpecifier::Unsigned; break; case 'x': + case 'X': format_lexer.consume(); conversion_specifier = ConversionSpecifier::Hex; break;