From: Paul Gofman pgofman@codeweavers.com
--- dlls/shlwapi/tests/string.c | 15 +++++++++++++++ dlls/shlwapi/wsprintf.c | 20 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c index d3016837f9f..d5594fc4c21 100644 --- a/dlls/shlwapi/tests/string.c +++ b/dlls/shlwapi/tests/string.c @@ -1705,15 +1705,26 @@ static void test_printf_format(void) { "%qu", 0, "qu", NULL, 10 }, { "%ll", 0, "", NULL, 10 }, { "%lu", sizeof(ULONG), "10", NULL, 10 }, + { "%llu", sizeof(ULONG64), "10", NULL, 10 }, + { "%lllllllu", sizeof(ULONG64), "10", NULL, 10 }, { "%#lx", sizeof(ULONG), "0xa", NULL, 10 }, + { "%#llx", sizeof(ULONG64), "0x1000000000", NULL, 0x1000000000 }, + { "%#lllx", sizeof(ULONG64), "0x1000000000", NULL, 0x1000000000 }, { "%hu", sizeof(ULONG), "10", NULL, 10 }, { "%hhu", sizeof(ULONG), "10", NULL, 10 }, { "%hwu", sizeof(ULONG), "10", NULL, 10 }, { "%whu", sizeof(ULONG), "10", NULL, 10 }, + { "%04lhlwllx", sizeof(ULONG64), "1000000010", NULL, 0x1000000010 }, { "%s", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)"str", L"str" }, { "%S", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str", "str" }, { "%ls", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str" }, { "%lS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str" }, + { "%lls", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)"str", L"str" }, + { "%llS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str", "str" }, + { "%llls", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str" }, + { "%lllS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str" }, + { "%lllls", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)"str", L"str" }, + { "%llllS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str", "str" }, { "%hs", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)"str" }, { "%hS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)"str" }, { "%ws", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str" }, @@ -1738,11 +1749,15 @@ static void test_printf_format(void) { "%llhwS", sizeof(ULONG_PTR), "str", NULL, (ULONG_PTR)L"str", "str" }, { "%c", sizeof(SHORT), "\xc8", L"\x95c8", 0x95c8 }, { "%lc", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, + { "%llc", sizeof(SHORT), "\xc8", L"\x95c8", 0x95c8 }, { "%lllc", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, + { "%llllc", sizeof(SHORT), "\xc8", L"\x95c8", 0x95c8 }, { "%lllllc", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, { "%C", sizeof(SHORT), "\x3f", L"\xc8", 0x95c8 }, { "%lC", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, + { "%llC", sizeof(SHORT), "\x3f", L"\xc8", 0x95c8 }, { "%lllC", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, + { "%llllC", sizeof(SHORT), "\x3f", L"\xc8", 0x95c8 }, { "%lllllC", sizeof(SHORT), "\x3f", L"\x95c8", 0x95c8 }, { "%hc", sizeof(BYTE), "\xc8", L"\xc8", 0x95c8 }, { "%hhc", sizeof(BYTE), "\xc8", L"\xc8", 0x95c8 }, diff --git a/dlls/shlwapi/wsprintf.c b/dlls/shlwapi/wsprintf.c index eb64b5e3845..771c130be70 100644 --- a/dlls/shlwapi/wsprintf.c +++ b/dlls/shlwapi/wsprintf.c @@ -114,7 +114,15 @@ static INT WPRINTF_ParseFormatA( LPCSTR format, WPRINTF_FORMAT *res ) { switch (*p) { - case 'l': res->flags |= WPRINTF_LONG | WPRINTF_WIDE; ++p; break; + case 'l': + ++p; + if (*p == 'l') + { + res->flags |= WPRINTF_I64; + ++p; + } + else res->flags |= WPRINTF_LONG | WPRINTF_WIDE; + break; case 'I': if (p[1] == '6' && p[2] == '4') { res->flags |= WPRINTF_I64; p += 3; } else if (p[1] == '3' && p[2] == '2') p += 3; @@ -201,7 +209,15 @@ static INT WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res ) { switch (*p) { - case 'l': res->flags |= WPRINTF_LONG | WPRINTF_WIDE; ++p; break; + case 'l': + ++p; + if (*p == 'l') + { + res->flags |= WPRINTF_I64; + ++p; + } + else res->flags |= WPRINTF_LONG | WPRINTF_WIDE; + break; case 'I': if (p[1] == '6' && p[2] == '4') { res->flags |= WPRINTF_I64; p += 3; } else if (p[1] == '3' && p[2] == '2') p += 3;