فهرست منبع

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 :^)
Jesse Buhagiar 3 سال پیش
والد
کامیت
2de7f2021d
2فایلهای تغییر یافته به همراه4 افزوده شده و 0 حذف شده
  1. 3 0
      Tests/LibC/TestScanf.cpp
  2. 1 0
      Userland/Libraries/LibC/scanf.cpp

+ 3 - 0
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) } },

+ 1 - 0
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;