Despite what msdn states, I and I32 are supported width modifiers.
V2: - better code structure - added support and tests for I32
v3: - fix 'test & copy & paste & don't test' error
v4: - move the tests in ucrtbase instead of msvcrt (as Piotr suggestion)
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/msvcrt/scanf.h | 10 ++++++++-- dlls/ucrtbase/tests/scanf.c | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index 3ab2efef13d..02284379854 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -279,13 +279,19 @@ _FUNCTION_ { *(format + 2) == '4') { I64_prefix = 1; format += 2; + break; } - break; + else if (*(format + 1) == '3' && + *(format + 2) == '2') { + format += 2; + break; + } + /* fall through */ #if _MSVCR_VER == 0 || _MSVCR_VER >= 140 case 'z': +#endif if (sizeof(void *) == sizeof(LONGLONG)) I64_prefix = 1; break; -#endif default: prefix_finished = 1; } diff --git a/dlls/ucrtbase/tests/scanf.c b/dlls/ucrtbase/tests/scanf.c index 3d77746d23b..12a08864642 100644 --- a/dlls/ucrtbase/tests/scanf.c +++ b/dlls/ucrtbase/tests/scanf.c @@ -43,6 +43,7 @@ static void test_sscanf(void) char buffer[100], buffer1[100]; int result, ret, hour, min, count; LONGLONG result64; + DWORD_PTR result_ptr; char c; void *ptr; float ret_float1, ret_float2; @@ -296,6 +297,30 @@ static void test_sscanf(void) ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); ok(ret_size == 1, "got wrong size_t %s for flags %#x\n", wine_dbgstr_longlong((LONGLONG)ret_size), tests[i]); + + result64 = 0; + ret = vsscanf_wrapper(tests[i], "12345678901234", -1, "%I64d", &result64); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(result64 == 12345678901234ll, "got wrong number 0x%s for flags %#x\n", + wine_dbgstr_longlong(result64), tests[i]); + + result = 0; + ret = vsscanf_wrapper(tests[i], "12345678901234", -1, "%I32d", &result); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(result == (int)12345678901234ll, /* this is always truncated to 32bit */ + "got wrong number 0x%d for flags %#x\n", result, tests[i]); + + result_ptr = 0; + ret = vsscanf_wrapper(tests[i], "0x87654321", -1, "%Ix", &result_ptr); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(result_ptr == 0x87654321, + "got wrong number %Ix for flags %#x\n", result_ptr, tests[i]); + + result_ptr = 0; + ret = vsscanf_wrapper(tests[i], "0x123456789", -1, "%Ix", &result_ptr); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(result_ptr == (DWORD_PTR)0x123456789ull, /* this is truncated on 32bit systems */ + "got wrong number %Ix for flags %#x\n", result_ptr, tests[i]); } }