LOCALE_SGROUPING's string and the `Grouping` field in NUMBERFMTW are confusingly different. The former, which is what is fixed here, treats a '0' as a repeat of the previous grouping. But a 0 at the end of the `Grouping` field prevents it from repeating (it repeats by default otherwise) so it's the opposite. Note that without a '0' in the LOCALE_SGROUPING string, it shouldn't even repeat in the first place.
This fixes the typical "3;0" default grouping, for example.
See: https://learn.microsoft.com/en-us/windows/win32/intl/locale-sgrouping
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Fixes a regression introduced by 56099a31242dcc522fb94643e70553e152c522ec.
LOCALE_SGROUPING's string and the `Grouping` field in NUMBERFMTW are confusingly different. The former, which is what is fixed here, treats a '0' as a repeat of the previous grouping. But a 0 at the end of the `Grouping` field prevents it from repeating (it repeats by default otherwise) so it's the opposite. Note that without a '0' in the LOCALE_SGROUPING string, it shouldn't even repeat in the first place.
This fixes the typical "3;0" default grouping, for example.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
See: https://learn.microsoft.com/en-us/windows/win32/intl/locale-sgrouping --- dlls/kernelbase/locale.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 1e96e49622e..31664ae07b4 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -7272,9 +7272,9 @@ static WCHAR *prepend_str( WCHAR *end, const WCHAR *str ) static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decimal_sep, const WCHAR *thousand_sep, const WCHAR *grouping, UINT digits, BOOL lzero ) { + UINT i, len = 0, limit = 0, repeat = 0; const WCHAR *frac = NULL; BOOL round = FALSE; - UINT i, len = 0;
*(--end) = 0;
@@ -7327,9 +7327,10 @@ static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decima } if (len) lzero = FALSE;
+ if (*grouping >= '1' && *grouping <= '9') + limit = repeat = *grouping - '0'; while (len) { - UINT limit = *grouping == '0' ? ~0u : *grouping - '0'; while (len && limit--) { WCHAR ch = value[--len]; @@ -7345,7 +7346,16 @@ static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decima *(--end) = ch; } if (len) end = prepend_str( end, thousand_sep ); - if (grouping[1] == ';') grouping += 2; + if (*grouping == '0') + limit = repeat; + else if (grouping[1] == ';') + { + grouping += 2; + if (*grouping == '0') + limit = repeat; + else if (*grouping >= '1' && *grouping <= '9') + limit = repeat = *grouping - '0'; + } } if (round) *(--end) = '1'; else if (lzero) *(--end) = '0';
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=128307
Your paranoid android.
=== debian11 (32 bit report) ===
kernel32: locale.c:1324: Test failed: expected success, got error 122 locale.c:1329: Test failed: unexpected gle 122 locale.c:1329: Test failed: Expected ret 8, got 9 locale.c:1329: Test failed: Expected '$2353.0', got '$2353,.0' locale.c:1334: Test failed: unexpected gle 122 locale.c:1339: Test failed: unexpected gle 122 locale.c:1343: Test failed: unexpected gle 122 locale.c:1343: Test failed: Expected ret 21, got 16 locale.c:1343: Test failed: Expected '$1,2,3,4,5,6,7,890.0', got '$123456,7,890.0' locale.c:1347: Test failed: unexpected gle 122 locale.c:1347: Test failed: Expected ret 18, got 17 locale.c:1347: Test failed: Expected '$12,34,56,7,890.0', got '$1234,56,7,890.0' locale.c:1351: Test failed: unexpected gle 122 locale.c:1351: Test failed: Expected ret 16, got 21 locale.c:1351: Test failed: Expected '$123456,7,890.0', got '$1,2,3,4,5,6,7,890.0' locale.c:1356: Test failed: unexpected gle 122 locale.c:1361: Test failed: unexpected gle 122 locale.c:1363: Test failed: unexpected gle 122 locale.c:1367: Test failed: unexpected gle 122 locale.c:1369: Test failed: unexpected gle 122 locale.c:1373: Test failed: unexpected gle 122 locale.c:1377: Test failed: unexpected gle 122 locale.c:1381: Test failed: unexpected gle 122 locale.c:1390: Test failed: 0: unexpected gle 122 locale.c:1390: Test failed: 1: unexpected gle 122 locale.c:1390: Test failed: 2: unexpected gle 122 locale.c:1390: Test failed: 3: unexpected gle 122 locale.c:1390: Test failed: 4: unexpected gle 122 locale.c:1390: Test failed: 5: unexpected gle 122 locale.c:1390: Test failed: 6: unexpected gle 122 locale.c:1390: Test failed: 7: unexpected gle 122 locale.c:1390: Test failed: 8: unexpected gle 122 locale.c:1390: Test failed: 9: unexpected gle 122 locale.c:1390: Test failed: 10: unexpected gle 122 locale.c:1390: Test failed: 11: unexpected gle 122 locale.c:1390: Test failed: 12: unexpected gle 122 locale.c:1390: Test failed: 13: unexpected gle 122 locale.c:1390: Test failed: 14: unexpected gle 122 locale.c:1390: Test failed: 15: unexpected gle 122 locale.c:1500: Test failed: expected success, got error 122 locale.c:1504: Test failed: unexpected gle 122 locale.c:1504: Test failed: Expected ret 7, got 8 locale.c:1504: Test failed: Expected '2353.0', got '2353,.0' locale.c:1508: Test failed: unexpected gle 122 locale.c:1513: Test failed: unexpected gle 122 locale.c:1515: Test failed: unexpected gle 122 locale.c:1519: Test failed: unexpected gle 122 locale.c:1519: Test failed: Expected ret 15, got 14 locale.c:1519: Test failed: Expected '1,234,567,89.0', got '1234,567,89.0' locale.c:1523: Test failed: unexpected gle 122 locale.c:1523: Test failed: Expected ret 14, got 15 locale.c:1523: Test failed: Expected '1234,567,89.0', got '1,234,567,89.0' locale.c:1529: Test failed: unexpected gle 122 locale.c:1531: Test failed: unexpected gle 122 locale.c:1535: Test failed: unexpected gle 122 locale.c:1537: Test failed: unexpected gle 122 locale.c:1541: Test failed: unexpected gle 122 locale.c:1545: Test failed: unexpected gle 122 locale.c:1549: Test failed: unexpected gle 122 locale.c:1553: Test failed: unexpected gle 122 locale.c:1557: Test failed: unexpected gle 122 locale.c:1564: Test failed: unexpected gle 122 locale.c:1683: Test failed: expected success, got error 122 locale.c:1688: Test failed: unexpected gle 122 locale.c:1688: Test failed: Expected ret 7, got 8 locale.c:1688: Test failed: Expected L"2353.0", got L"2353,.0" locale.c:1693: Test failed: unexpected gle 122 locale.c:1698: Test failed: unexpected gle 122 locale.c:1703: Test failed: unexpected gle 122 locale.c:1708: Test failed: unexpected gle 122 locale.c:1710: Test failed: unexpected gle 122 locale.c:1714: Test failed: unexpected gle 122 locale.c:1716: Test failed: unexpected gle 122 locale.c:1720: Test failed: unexpected gle 122 locale.c:1724: Test failed: unexpected gle 122 locale.c:1728: Test failed: unexpected gle 122 locale.c:1732: Test failed: unexpected gle 122 locale.c:1736: Test failed: unexpected gle 122 locale.c:1742: Test failed: unexpected gle 122
oleaut32: varformat.c:65: Test failed: VarFormatNumber (vt 16): string different varformat.c:66: Test failed: VarFormatNumber (vt 17): string different varformat.c:67: Test failed: VarFormatNumber (vt 2): string different varformat.c:68: Test failed: VarFormatNumber (vt 18): string different varformat.c:69: Test failed: VarFormatNumber (vt 3): string different varformat.c:70: Test failed: VarFormatNumber (vt 19): string different varformat.c:71: Test failed: VarFormatNumber (vt 20): string different varformat.c:72: Test failed: VarFormatNumber (vt 21): string different varformat.c:73: Test failed: VarFormatNumber (vt 4): string different varformat.c:74: Test failed: VarFormatNumber (vt 5): string different varformat.c:75: Test failed: VarFormatNumber (vt 11): string different varformat.c:83: Test failed: VarFormatNumber (bstr): string different varformat.c:91: Test failed: VarFormatNumber (-bstr): string different
shlwapi: string.c:758: Test failed: Formatted 3e7ffa9b wrong: got 1023,999 KB, expected 1,023,999 KB string.c:758: Test failed: Formatted 3fffffcf wrong: got 1048,576 KB, expected 1,048,576 KB string.c:758: Test failed: Formatted f9fffff94e wrong: got 1048575,999 KB, expected 1,048,575,999 KB string.c:758: Test failed: Formatted fffffffa9b wrong: got 1073741,823 KB, expected 1,073,741,823 KB string.c:758: Test failed: Formatted 3e7fffffffa9b wrong: got 1073741823,999 KB, expected 1,073,741,823,999 KB string.c:758: Test failed: Formatted 3fffffffffbe8 wrong: got 1099511627,775 KB, expected 1,099,511,627,775 KB string.c:758: Test failed: Formatted f9ffffffffffd35 wrong: got 1099511627776,000 KB, expected 1,099,511,627,776,000 KB string.c:758: Test failed: Formatted ffffffffffffa9b wrong: got 1125899906842,623 KB, expected 1,125,899,906,842,623 KB string.c:735: Test failed: Formatted 3e7ffa9b wrong: got 1023,999 KB, expected 1,023,999 KB string.c:735: Test failed: Formatted 3fffffcf wrong: got 1048,576 KB, expected 1,048,576 KB string.c:735: Test failed: Formatted f9fffff94e wrong: got 1048575,999 KB, expected 1,048,575,999 KB string.c:735: Test failed: Formatted fffffffa9b wrong: got 1073741,823 KB, expected 1,073,741,823 KB string.c:735: Test failed: Formatted 3e7fffffffa9b wrong: got 1073741823,999 KB, expected 1,073,741,823,999 KB string.c:735: Test failed: Formatted 3fffffffffbe8 wrong: got 1099511627,775 KB, expected 1,099,511,627,775 KB string.c:735: Test failed: Formatted f9ffffffffffd35 wrong: got 1099511627776,000 KB, expected 1,099,511,627,776,000 KB string.c:735: Test failed: Formatted ffffffffffffa9b wrong: got 1125899906842,623 KB, expected 1,125,899,906,842,623 KB
On Wed Jan 11 15:53:58 2023 +0000, **** wrote:
Marvin replied on the mailing list:
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details: The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=128307 Your paranoid android. === debian11 (32 bit report) === kernel32: locale.c:1324: Test failed: expected success, got error 122 locale.c:1329: Test failed: unexpected gle 122 locale.c:1329: Test failed: Expected ret 8, got 9 locale.c:1329: Test failed: Expected '$2353.0', got '$2353,.0' locale.c:1334: Test failed: unexpected gle 122 locale.c:1339: Test failed: unexpected gle 122 locale.c:1343: Test failed: unexpected gle 122 locale.c:1343: Test failed: Expected ret 21, got 16 locale.c:1343: Test failed: Expected '$1,2,3,4,5,6,7,890.0', got '$123456,7,890.0' locale.c:1347: Test failed: unexpected gle 122 locale.c:1347: Test failed: Expected ret 18, got 17 locale.c:1347: Test failed: Expected '$12,34,56,7,890.0', got '$1234,56,7,890.0' locale.c:1351: Test failed: unexpected gle 122 locale.c:1351: Test failed: Expected ret 16, got 21 locale.c:1351: Test failed: Expected '$123456,7,890.0', got '$1,2,3,4,5,6,7,890.0' locale.c:1356: Test failed: unexpected gle 122 locale.c:1361: Test failed: unexpected gle 122 locale.c:1363: Test failed: unexpected gle 122 locale.c:1367: Test failed: unexpected gle 122 locale.c:1369: Test failed: unexpected gle 122 locale.c:1373: Test failed: unexpected gle 122 locale.c:1377: Test failed: unexpected gle 122 locale.c:1381: Test failed: unexpected gle 122 locale.c:1390: Test failed: 0: unexpected gle 122 locale.c:1390: Test failed: 1: unexpected gle 122 locale.c:1390: Test failed: 2: unexpected gle 122 locale.c:1390: Test failed: 3: unexpected gle 122 locale.c:1390: Test failed: 4: unexpected gle 122 locale.c:1390: Test failed: 5: unexpected gle 122 locale.c:1390: Test failed: 6: unexpected gle 122 locale.c:1390: Test failed: 7: unexpected gle 122 locale.c:1390: Test failed: 8: unexpected gle 122 locale.c:1390: Test failed: 9: unexpected gle 122 locale.c:1390: Test failed: 10: unexpected gle 122 locale.c:1390: Test failed: 11: unexpected gle 122 locale.c:1390: Test failed: 12: unexpected gle 122 locale.c:1390: Test failed: 13: unexpected gle 122 locale.c:1390: Test failed: 14: unexpected gle 122 locale.c:1390: Test failed: 15: unexpected gle 122 locale.c:1500: Test failed: expected success, got error 122 locale.c:1504: Test failed: unexpected gle 122 locale.c:1504: Test failed: Expected ret 7, got 8 locale.c:1504: Test failed: Expected '2353.0', got '2353,.0' locale.c:1508: Test failed: unexpected gle 122 locale.c:1513: Test failed: unexpected gle 122 locale.c:1515: Test failed: unexpected gle 122 locale.c:1519: Test failed: unexpected gle 122 locale.c:1519: Test failed: Expected ret 15, got 14 locale.c:1519: Test failed: Expected '1,234,567,89.0', got '1234,567,89.0' locale.c:1523: Test failed: unexpected gle 122 locale.c:1523: Test failed: Expected ret 14, got 15 locale.c:1523: Test failed: Expected '1234,567,89.0', got '1,234,567,89.0' locale.c:1529: Test failed: unexpected gle 122 locale.c:1531: Test failed: unexpected gle 122 locale.c:1535: Test failed: unexpected gle 122 locale.c:1537: Test failed: unexpected gle 122 locale.c:1541: Test failed: unexpected gle 122 locale.c:1545: Test failed: unexpected gle 122 locale.c:1549: Test failed: unexpected gle 122 locale.c:1553: Test failed: unexpected gle 122 locale.c:1557: Test failed: unexpected gle 122 locale.c:1564: Test failed: unexpected gle 122 locale.c:1683: Test failed: expected success, got error 122 locale.c:1688: Test failed: unexpected gle 122 locale.c:1688: Test failed: Expected ret 7, got 8 locale.c:1688: Test failed: Expected L"2353.0", got L"2353,.0" locale.c:1693: Test failed: unexpected gle 122 locale.c:1698: Test failed: unexpected gle 122 locale.c:1703: Test failed: unexpected gle 122 locale.c:1708: Test failed: unexpected gle 122 locale.c:1710: Test failed: unexpected gle 122 locale.c:1714: Test failed: unexpected gle 122 locale.c:1716: Test failed: unexpected gle 122 locale.c:1720: Test failed: unexpected gle 122 locale.c:1724: Test failed: unexpected gle 122 locale.c:1728: Test failed: unexpected gle 122 locale.c:1732: Test failed: unexpected gle 122 locale.c:1736: Test failed: unexpected gle 122 locale.c:1742: Test failed: unexpected gle 122 oleaut32: varformat.c:65: Test failed: VarFormatNumber (vt 16): string different varformat.c:66: Test failed: VarFormatNumber (vt 17): string different varformat.c:67: Test failed: VarFormatNumber (vt 2): string different varformat.c:68: Test failed: VarFormatNumber (vt 18): string different varformat.c:69: Test failed: VarFormatNumber (vt 3): string different varformat.c:70: Test failed: VarFormatNumber (vt 19): string different varformat.c:71: Test failed: VarFormatNumber (vt 20): string different varformat.c:72: Test failed: VarFormatNumber (vt 21): string different varformat.c:73: Test failed: VarFormatNumber (vt 4): string different varformat.c:74: Test failed: VarFormatNumber (vt 5): string different varformat.c:75: Test failed: VarFormatNumber (vt 11): string different varformat.c:83: Test failed: VarFormatNumber (bstr): string different varformat.c:91: Test failed: VarFormatNumber (-bstr): string different shlwapi: string.c:758: Test failed: Formatted 3e7ffa9b wrong: got 1023,999 KB, expected 1,023,999 KB string.c:758: Test failed: Formatted 3fffffcf wrong: got 1048,576 KB, expected 1,048,576 KB string.c:758: Test failed: Formatted f9fffff94e wrong: got 1048575,999 KB, expected 1,048,575,999 KB string.c:758: Test failed: Formatted fffffffa9b wrong: got 1073741,823 KB, expected 1,073,741,823 KB string.c:758: Test failed: Formatted 3e7fffffffa9b wrong: got 1073741823,999 KB, expected 1,073,741,823,999 KB string.c:758: Test failed: Formatted 3fffffffffbe8 wrong: got 1099511627,775 KB, expected 1,099,511,627,775 KB string.c:758: Test failed: Formatted f9ffffffffffd35 wrong: got 1099511627776,000 KB, expected 1,099,511,627,776,000 KB string.c:758: Test failed: Formatted ffffffffffffa9b wrong: got 1125899906842,623 KB, expected 1,125,899,906,842,623 KB string.c:735: Test failed: Formatted 3e7ffa9b wrong: got 1023,999 KB, expected 1,023,999 KB string.c:735: Test failed: Formatted 3fffffcf wrong: got 1048,576 KB, expected 1,048,576 KB string.c:735: Test failed: Formatted f9fffff94e wrong: got 1048575,999 KB, expected 1,048,575,999 KB string.c:735: Test failed: Formatted fffffffa9b wrong: got 1073741,823 KB, expected 1,073,741,823 KB string.c:735: Test failed: Formatted 3e7fffffffa9b wrong: got 1073741823,999 KB, expected 1,073,741,823,999 KB string.c:735: Test failed: Formatted 3fffffffffbe8 wrong: got 1099511627,775 KB, expected 1,099,511,627,775 KB string.c:735: Test failed: Formatted f9ffffffffffd35 wrong: got 1099511627776,000 KB, expected 1,099,511,627,776,000 KB string.c:735: Test failed: Formatted ffffffffffffa9b wrong: got 1125899906842,623 KB, expected 1,125,899,906,842,623 KB
Yeah, clearly something else is going on here. I'll have a look. Sorry.