Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
December 2019
- 73 participants
- 1394 messages
Re: [PATCH 1/3] user32/tests: Remove unnecessary uses of CREATE_SUSPENDED.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=62626
Your paranoid android.
=== w2003std (task log) ===
Task errors:
The task timed out
Dec. 27, 2019
[PATCH 3/3] user32/tests: Work around failures on Windows 10 version 1607.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/user32/tests/dde.c | 65 ++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 21 deletions(-)
diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index 5eb5ec9d29..54fec3914d 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -315,7 +315,12 @@ static void test_ddeml_client(void)
DdeGetLastError(client_pid);
conversation = DdeConnect(client_pid, server, topic, NULL);
- ok(conversation != NULL, "Expected non-NULL conversation\n");
+ if (broken(!conversation)) /* Windows 10 version 1607 */
+ {
+ win_skip("Failed to connect; error %#x.\n", DdeGetLastError(client_pid));
+ DdeUninitialize(client_pid);
+ return;
+ }
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
@@ -1573,7 +1578,12 @@ static void test_dde_aw_transaction( BOOL client_unicode, BOOL server_unicode )
hsz_server = DdeCreateStringHandleW(dde_inst, TEST_DDE_SERVICE, CP_WINUNICODE);
hconv = DdeConnect(dde_inst, hsz_server, 0, NULL);
- ok(hconv != 0, "DdeConnect error %x\n", DdeGetLastError(dde_inst));
+ if (broken(!hconv)) /* Windows 10 version 1607 */
+ {
+ win_skip("Failed to connect; error %#x.\n", DdeGetLastError(dde_inst));
+ DdeUninitialize(dde_inst);
+ return;
+ }
err = DdeGetLastError(dde_inst);
ok(err == DMLERR_NO_ERROR, "wrong dde error %x\n", err);
@@ -2352,7 +2362,8 @@ static WCHAR test_cmd_w_to_w[][32] = {
{ 0x4efa, 0x4efc, 0x0061, 0x4efe, 0 }, /* some Chinese chars */
{ 0x0061, 0x0062, 0x0063, 0x9152, 0 }, /* Chinese with latin characters begin */
};
-static const int nb_callbacks = 5 + ARRAY_SIZE(test_cmd_w_to_w);
+static int msg_index;
+static BOOL unicode_server, unicode_client;
static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV hconv,
HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
@@ -2360,24 +2371,26 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
{
DWORD size, rsize;
char str[MAX_PATH];
- static int msg_index = 0;
static HCONV conversation = 0;
static const char test_service [] = "TestDDEService";
static const char test_topic [] = "TestDDETopic";
+ trace("type %#x, fmt %#x\n", uType, uFmt);
+
+ ok(msg_index < 5 + ARRAY_SIZE(test_cmd_w_to_w), "Got unexpected message type %#x.\n", uType);
msg_index++;
switch (uType)
{
case XTYP_REGISTER:
{
- ok(msg_index % nb_callbacks == 1, "Expected 1 modulo %u, got %d\n", nb_callbacks, msg_index);
+ ok(msg_index == 1, "Expected 1, got %d\n", msg_index);
return (HDDEDATA)TRUE;
}
case XTYP_CONNECT:
{
- ok(msg_index % nb_callbacks == 2, "Expected 2 modulo %u, got %d\n", nb_callbacks, msg_index);
+ ok(msg_index == 2, "Expected 2, got %d\n", msg_index);
ok(uFmt == 0, "Expected 0, got %d, msg_index=%d\n", uFmt, msg_index);
ok(hconv == 0, "Expected 0, got %p, msg_index=%d\n", hconv, msg_index);
ok(hdata == 0, "Expected 0, got %p, msg_index=%d\n", hdata, msg_index);
@@ -2398,7 +2411,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
}
case XTYP_CONNECT_CONFIRM:
{
- ok(msg_index % nb_callbacks == 3, "Expected 3 modulo %u, got %d\n", nb_callbacks, msg_index);
+ ok(msg_index == 3, "Expected 3, got %d\n", msg_index);
conversation = hconv;
return (HDDEDATA) TRUE;
}
@@ -2409,7 +2422,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
char test_cmd_w_to_a[64];
WCHAR test_cmd_a_to_w[64];
DWORD size_a, size_w, size_w_to_a, size_a_to_w;
- BOOL unicode_server, unicode_client, str_index;
+ BOOL str_index;
ok(uFmt == 0, "Expected 0, got %d\n", uFmt);
ok(hconv == conversation, "Expected conversation handle, got %p, msg_index=%d\n",
@@ -2429,9 +2442,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV
size, rsize, msg_index);
trace("msg %u strA \"%s\" strW %s\n", msg_index, buffer, wine_dbgstr_w((WCHAR*)buffer));
- unicode_server = (msg_index / nb_callbacks == 1 || msg_index / nb_callbacks == 2);
- unicode_client = (msg_index / nb_callbacks == 1 || msg_index / nb_callbacks == 3);
- str_index = msg_index % nb_callbacks - 4;
+ str_index = msg_index - 4;
cmd_w = test_cmd_w_to_w[str_index - 1];
size_a = strlen(test_cmd_a_to_a) + 1;
size_w = (lstrlenW(cmd_w) + 1) * sizeof(WCHAR);
@@ -2606,7 +2617,12 @@ static void test_end_to_end_client(BOOL type_a)
DdeGetLastError(client_pid);
hconv = DdeConnect(client_pid, server, topic, NULL);
- ok(hconv != NULL, "Expected non-NULL conversation\n");
+ if (broken(!hconv)) /* Windows 10 version 1607 */
+ {
+ win_skip("Failed to connect; error %#x.\n", DdeGetLastError(client_pid));
+ DdeUninitialize(client_pid);
+ return;
+ }
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %x\n", ret);
DdeFreeStringHandle(client_pid, server);
@@ -2639,7 +2655,7 @@ static void test_end_to_end_client(BOOL type_a)
}
-static void test_end_to_end_server(BOOL client_unicode, BOOL server_unicode)
+static void test_end_to_end_server(void)
{
HANDLE client;
MSG msg;
@@ -2649,11 +2665,12 @@ static void test_end_to_end_server(BOOL client_unicode, BOOL server_unicode)
HDDEDATA hdata;
static const char test_service[] = "TestDDEService";
- trace("client %s, server %s\n", client_unicode ? "unicode" : "ascii",
- server_unicode ? "unicode" : "ascii");
+ trace("client %s, server %s\n", unicode_client ? "unicode" : "ascii",
+ unicode_server ? "unicode" : "ascii");
server_pid = 0;
+ msg_index = 0;
- if (server_unicode)
+ if (unicode_server)
res = DdeInitializeW(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0);
else
res = DdeInitializeA(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0);
@@ -2665,7 +2682,7 @@ static void test_end_to_end_server(BOOL client_unicode, BOOL server_unicode)
hdata = DdeNameService(server_pid, server, 0, DNS_REGISTER);
ok(hdata == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", hdata);
- client = create_process(client_unicode ? "endw" : "enda");
+ client = create_process(unicode_client ? "endw" : "enda");
while (MsgWaitForMultipleObjects(1, &client, FALSE, INFINITE, QS_ALLINPUT) != 0)
{
@@ -2709,10 +2726,16 @@ START_TEST(dde)
/* Test the combinations of A and W interfaces with A and W data
end to end to ensure that data conversions are accurate */
- test_end_to_end_server(FALSE, FALSE);
- test_end_to_end_server(TRUE, TRUE);
- test_end_to_end_server(FALSE, TRUE);
- test_end_to_end_server(TRUE, FALSE);
+ unicode_client = unicode_server = FALSE;
+ test_end_to_end_server();
+ unicode_client = unicode_server = TRUE;
+ test_end_to_end_server();
+ unicode_client = FALSE;
+ unicode_server = TRUE;
+ test_end_to_end_server();
+ unicode_client = TRUE;
+ unicode_server = FALSE;
+ test_end_to_end_server();
test_dde_aw_transaction( FALSE, TRUE );
test_dde_aw_transaction( TRUE, FALSE );
--
2.24.1
Dec. 27, 2019
[PATCH 2/3] user32/tests: Get rid of some Windows 9x workarounds.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/user32/tests/dde.c | 249 ++++++++++++++--------------------------
1 file changed, 83 insertions(+), 166 deletions(-)
diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index 786d4eca07..5eb5ec9d29 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -215,7 +215,7 @@ static LRESULT WINAPI dde_server_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPA
if (msg_index == 5)
{
size = GlobalSize((HGLOBAL)lo);
- ok(size == 4 || broken(size == 32), /* sizes are rounded up on win9x */ "got %d\n", size);
+ ok(size == 4, "got %d\n", size);
}
else
ok(!lstrcmpA((LPSTR)poke->Value, "poke data\r\n"),
@@ -257,11 +257,6 @@ static LRESULT WINAPI dde_server_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPA
break;
}
- case WM_DDE_ACK: /* happens on win9x when fAckReq is TRUE, ignore it */
- ok(msg_index == 4, "Expected 4, got %d\n", msg_index);
- msg_index--;
- break;
-
default:
ok(FALSE, "Unhandled msg: %08x\n", msg);
}
@@ -334,8 +329,7 @@ static void test_ddeml_client(void)
hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
- ok(res == DDE_FNOTPROCESSED || broken(res == 0xdeadbeef), /* win9x */
- "Expected DDE_FNOTPROCESSED, got %08x\n", res);
+ ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %08x\n", res);
ok( hdata != NULL, "hdata is NULL\n" );
if (hdata)
{
@@ -352,11 +346,9 @@ static void test_ddeml_client(void)
DdeGetLastError(client_pid);
hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
ret = DdeGetLastError(client_pid);
- ok(res == DDE_FNOTPROCESSED || broken(res == 0xdeadbeef), /* win9x */
- "Expected DDE_FNOTPROCESSED, got %x\n", res);
+ ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %x\n", res);
todo_wine
- ok(ret == DMLERR_MEMORY_ERROR || broken(ret == 0), /* win9x */
- "Expected DMLERR_MEMORY_ERROR, got %d\n", ret);
+ ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret);
ok( hdata != NULL, "hdata is NULL\n" );
if (hdata)
{
@@ -374,8 +366,7 @@ todo_wine
hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
- ok(res == DDE_FNOTPROCESSED || broken(res == 0xdeadbeef), /* win9x */
- "Expected DDE_FNOTPROCESSED, got %x\n", res);
+ ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %x\n", res);
if (hdata == NULL)
ok(FALSE, "hdata is NULL\n");
else
@@ -430,8 +421,7 @@ todo_wine
op = DdeClientTransaction((LPBYTE)hdata, 0, conversation, item, CF_TEXT, XTYP_POKE, default_timeout, &res);
ret = DdeGetLastError(client_pid);
ok(op == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", op);
- ok(res == DDE_FACK || broken(res == (0xdead0000 | DDE_FACK)), /* win9x */
- "Expected DDE_FACK, got %x\n", res);
+ ok(res == DDE_FACK, "Expected DDE_FACK, got %x\n", res);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
/* XTYP_POKE, correct params */
@@ -440,8 +430,7 @@ todo_wine
op = DdeClientTransaction((LPBYTE)hdata, -1, conversation, item, CF_TEXT, XTYP_POKE, default_timeout, &res);
ret = DdeGetLastError(client_pid);
ok(op == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", op);
- ok(res == DDE_FACK || broken(res == (0xdead0000 | DDE_FACK)), /* win9x */
- "Expected DDE_FACK, got %x\n", res);
+ ok(res == DDE_FACK, "Expected DDE_FACK, got %x\n", res);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
DdeFreeDataHandle(hdata);
@@ -458,25 +447,16 @@ todo_wine
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
ok(op == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", op);
- ok(res == DDE_FACK || broken(res == (0xdead0000 | DDE_FACK)), /* win9x */
- "Expected DDE_FACK, got %x\n", res);
+ ok(res == DDE_FACK, "Expected DDE_FACK, got %x\n", res);
/* XTYP_EXECUTE, no data */
res = 0xdeadbeef;
DdeGetLastError(client_pid);
op = DdeClientTransaction(NULL, 0, conversation, NULL, 0, XTYP_EXECUTE, default_timeout, &res);
ret = DdeGetLastError(client_pid);
- ok(op == NULL || broken(op == (HDDEDATA)TRUE), /* win9x */ "Expected NULL, got %p\n", op);
- if (!op)
- {
- ok(res == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", res);
- ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret);
- }
- else /* win9x */
- {
- ok(res == (0xdead0000 | DDE_FACK), "Expected DDE_FACK, got %x\n", res);
- ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
- }
+ ok(op == NULL, "Expected NULL, got %p\n", op);
+ ok(res == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", res);
+ ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret);
/* XTYP_EXECUTE, no data, -1 size */
res = 0xdeadbeef;
@@ -485,8 +465,7 @@ todo_wine
ret = DdeGetLastError(client_pid);
ok(op == NULL, "Expected NULL, got %p\n", op);
ok(res == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", res);
- ok(ret == DMLERR_INVALIDPARAMETER || broken(ret == DMLERR_NO_ERROR), /* win9x */
- "Expected DMLERR_INVALIDPARAMETER, got %d\n", ret);
+ ok(ret == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", ret);
DdeFreeStringHandle(client_pid, topic);
DdeFreeDataHandle(hdata);
@@ -499,19 +478,13 @@ todo_wine
hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
ret = DdeGetLastError(client_pid);
ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
- ok(res == DDE_FNOTPROCESSED || broken(res == (0xdead0000 | DDE_FNOTPROCESSED)), /* win9x */
- "Expected DDE_FNOTPROCESSED, got %d\n", res);
- if (hdata == NULL)
- ok(FALSE, "hdata is NULL\n");
- else
- {
- str = (LPSTR)DdeAccessData(hdata, &size);
- ok(!lstrcmpA(str, "command executed\r\n"), "Expected 'command executed\\r\\n', got %s\n", str);
- ok(size == 19, "Expected 19, got %d\n", size);
+ ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %d\n", res);
+ str = (LPSTR)DdeAccessData(hdata, &size);
+ ok(!strcmp(str, "command executed\r\n"), "Expected 'command executed\\r\\n', got %s\n", str);
+ ok(size == 19, "Expected 19, got %d\n", size);
- ret = DdeUnaccessData(hdata);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- }
+ ret = DdeUnaccessData(hdata);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
/* invalid transactions */
res = 0xdeadbeef;
@@ -634,16 +607,9 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon
ok(size == 13, "Expected 13, got %d\n", size);
size = DdeQueryStringA(server_pid, hsz2, str, MAX_PATH, CP_WINANSI);
- if (!strncmp( str, "TestDDEServer:(", 15 )) /* win9x style */
- {
- ok(size == 16 + 2*sizeof(WORD), "Got size %d for %s\n", size, str);
- }
- else
- {
- ok(!strncmp(str, "TestDDEServer(", 14), "Expected TestDDEServer(, got %s\n", str);
- ok(size == 17 + 2*sizeof(ULONG_PTR), "Got size %d for %s\n", size, str);
- }
- ok(str[size - 1] == ')', "Expected ')', got %c\n", str[size - 1]);
+ ok(!strncmp(str, "TestDDEServer(", 14), "Expected TestDDEServer(, got %s\n", str);
+ ok(size == 17 + 2*sizeof(ULONG_PTR), "Got size %d for %s\n", size, str);
+ ok(str[size - 1] == ')', "Expected ')', got %c\n", str[size - 1]);
return (HDDEDATA)TRUE;
}
@@ -747,8 +713,7 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon
ptr = (LPSTR)DdeAccessData(hdata, &size);
ok(!lstrcmpA(ptr, "poke data\r\n"), "Expected 'poke data\\r\\n', got %s\n", ptr);
- ok(size == 12 || broken(size == 28), /* sizes are rounded up on win9x */
- "Expected 12, got %d\n", size);
+ ok(size == 12, "Expected 12, got %d\n", size);
DdeUnaccessData(hdata);
size = DdeQueryStringA(server_pid, hsz2, str, MAX_PATH, CP_WINANSI);
@@ -1139,14 +1104,8 @@ static void test_msg_client(void)
/* WM_DDE_POKE, no ddepoke */
lparam = PackDDElParam(WM_DDE_POKE, 0, item);
- /* win9x returns 0 here and crashes in PostMessageA */
- if (lparam) {
- PostMessageA(server_hwnd, WM_DDE_POKE, (WPARAM)client_hwnd, lparam);
- flush_events();
- }
- else
- win_skip("no lparam for WM_DDE_POKE\n");
-
+ PostMessageA(server_hwnd, WM_DDE_POKE, (WPARAM)client_hwnd, lparam);
+ flush_events();
/* WM_DDE_POKE, no item */
lparam = PackDDElParam(WM_DDE_POKE, (UINT_PTR)hglobal, 0);
@@ -1638,8 +1597,7 @@ todo_wine {
ret = 0xdeadbeef;
hdata = DdeClientTransaction((LPBYTE)test_cmd, strlen(test_cmd) + 1, hconv, (HSZ)0xdead, 0xbeef, XTYP_EXECUTE, 1000, &ret);
ok(!hdata, "DdeClientTransaction succeeded\n");
- ok(ret == DDE_FNOTPROCESSED || broken(ret == (0xdead0000 | DDE_FNOTPROCESSED)), /* win9x */
- "wrong status code %04x\n", ret);
+ ok(ret == DDE_FNOTPROCESSED, "wrong status code %04x\n", ret);
err = DdeGetLastError(dde_inst);
ok(err == DMLERR_NOTPROCESSED, "wrong dde error %x\n", err);
@@ -1686,8 +1644,7 @@ todo_wine {
else /* no mapping */
{
ok(!hdata, "DdeClientTransaction returned %p, error %x\n", hdata, err);
- ok(ret == DDE_FNOTPROCESSED || broken(ret == (0xdead0000 | DDE_FNOTPROCESSED)), /* win9x */
- "wrong status code %04x\n", ret);
+ ok(ret == DDE_FNOTPROCESSED, "wrong status code %04x\n", ret);
ok(err == DMLERR_NOTPROCESSED, "DdeClientTransaction returned error %x\n", err);
}
@@ -1929,10 +1886,7 @@ static void test_DdeCreateDataHandle(void)
item = DdeCreateStringHandleA(dde_inst2, "item", CP_WINANSI);
ok(item != NULL, "Expected non-NULL hsz\n");
- if (0) {
- /* do not test with an invalid instance id: that crashes on win9x */
- hdata = DdeCreateDataHandle(0xdeadbeef, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0);
- }
+ hdata = DdeCreateDataHandle(0xdeadbeef, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0);
/* 0 instance id
* This block tests an invalid instance Id. The correct behaviour is that if the instance Id
@@ -2169,24 +2123,19 @@ static void test_PackDDElParam(void)
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
lparam = PackDDElParam(WM_DDE_ADVISE, 0xcafe, 0xbeef);
- /* win9x returns 0 here */
- if (lparam) {
- ptr = GlobalLock((HGLOBAL)lparam);
- ok(ptr != NULL, "Expected non-NULL ptr\n");
- ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
- ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
+ ptr = GlobalLock((HGLOBAL)lparam);
+ ok(ptr != NULL, "Expected non-NULL ptr\n");
+ ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
+ ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
- ret = GlobalUnlock((HGLOBAL)lparam);
- ok(ret == 1, "Expected 1, got %d\n", ret);
+ ret = GlobalUnlock((HGLOBAL)lparam);
+ ok(ret == 1, "Expected 1, got %d\n", ret);
- lo = hi = 0;
- ret = UnpackDDElParam(WM_DDE_ADVISE, lparam, &lo, &hi);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
- ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
- }
- else
- win_skip("no lparam for WM_DDE_ADVISE\n");
+ lo = hi = 0;
+ ret = UnpackDDElParam(WM_DDE_ADVISE, lparam, &lo, &hi);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+ ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
+ ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
ret = FreeDDElParam(WM_DDE_ADVISE, lparam);
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
@@ -2204,47 +2153,37 @@ static void test_PackDDElParam(void)
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
lparam = PackDDElParam(WM_DDE_ACK, 0xcafe, 0xbeef);
- /* win9x returns the input (0xbeef<<16 | 0xcafe) here */
- if (lparam != (int)0xbeefcafe) {
- ptr = GlobalLock((HGLOBAL)lparam);
- ok(ptr != NULL, "Expected non-NULL ptr\n");
- ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
- ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
+ ptr = GlobalLock((HGLOBAL)lparam);
+ ok(ptr != NULL, "Expected non-NULL ptr\n");
+ ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
+ ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
- ret = GlobalUnlock((HGLOBAL)lparam);
- ok(ret == 1, "Expected 1, got %d\n", ret);
+ ret = GlobalUnlock((HGLOBAL)lparam);
+ ok(ret == 1, "Expected 1, got %d\n", ret);
- lo = hi = 0;
- ret = UnpackDDElParam(WM_DDE_ACK, lparam, &lo, &hi);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
- ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
+ lo = hi = 0;
+ ret = UnpackDDElParam(WM_DDE_ACK, lparam, &lo, &hi);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+ ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
+ ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
- ret = FreeDDElParam(WM_DDE_ACK, lparam);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- }
- else
- win_skip("got lparam 0x%lx for WM_DDE_ACK\n", lparam);
+ ret = FreeDDElParam(WM_DDE_ACK, lparam);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
lparam = PackDDElParam(WM_DDE_DATA, 0xcafe, 0xbeef);
- /* win9x returns 0 here */
- if (lparam) {
- ptr = GlobalLock((HGLOBAL)lparam);
- ok(ptr != NULL, "Expected non-NULL ptr\n");
- ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
- ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
+ ptr = GlobalLock((HGLOBAL)lparam);
+ ok(ptr != NULL, "Expected non-NULL ptr\n");
+ ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
+ ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
- ret = GlobalUnlock((HGLOBAL)lparam);
- ok(ret == 1, "Expected 1, got %d\n", ret);
+ ret = GlobalUnlock((HGLOBAL)lparam);
+ ok(ret == 1, "Expected 1, got %d\n", ret);
- lo = hi = 0;
- ret = UnpackDDElParam(WM_DDE_DATA, lparam, &lo, &hi);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
- ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
- }
- else
- win_skip("no lparam for WM_DDE_DATA\n");
+ lo = hi = 0;
+ ret = UnpackDDElParam(WM_DDE_DATA, lparam, &lo, &hi);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+ ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
+ ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
ret = FreeDDElParam(WM_DDE_DATA, lparam);
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
@@ -2262,24 +2201,19 @@ static void test_PackDDElParam(void)
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
lparam = PackDDElParam(WM_DDE_POKE, 0xcafe, 0xbeef);
- /* win9x returns 0 here */
- if (lparam) {
- ptr = GlobalLock((HGLOBAL)lparam);
- ok(ptr != NULL, "Expected non-NULL ptr\n");
- ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
- ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
+ ptr = GlobalLock((HGLOBAL)lparam);
+ ok(ptr != NULL, "Expected non-NULL ptr\n");
+ ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]);
+ ok(ptr[1] == 0xbeef, "Expected 0xbeef, got %08lx\n", ptr[1]);
- ret = GlobalUnlock((HGLOBAL)lparam);
- ok(ret == 1, "Expected 1, got %d\n", ret);
+ ret = GlobalUnlock((HGLOBAL)lparam);
+ ok(ret == 1, "Expected 1, got %d\n", ret);
- lo = hi = 0;
- ret = UnpackDDElParam(WM_DDE_POKE, lparam, &lo, &hi);
- ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
- ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
- }
- else
- win_skip("no lparam for WM_DDE_POKE\n");
+ lo = hi = 0;
+ ret = UnpackDDElParam(WM_DDE_POKE, lparam, &lo, &hi);
+ ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+ ok(lo == 0xcafe, "Expected 0xcafe, got %08lx\n", lo);
+ ok(hi == 0xbeef, "Expected 0xbeef, got %08lx\n", hi);
ret = FreeDDElParam(WM_DDE_POKE, lparam);
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
@@ -2768,13 +2702,7 @@ START_TEST(dde)
test_initialisation();
- SetLastError(0xdeadbeef);
DdeInitializeW(&dde_inst, client_ddeml_callback, APPCMD_CLIENTONLY, 0);
- if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
- {
- win_skip("Skipping tests on win9x because of brokenness\n");
- return;
- }
test_msg_server();
test_ddeml_server();
@@ -2782,29 +2710,18 @@ START_TEST(dde)
/* Test the combinations of A and W interfaces with A and W data
end to end to ensure that data conversions are accurate */
test_end_to_end_server(FALSE, FALSE);
+ test_end_to_end_server(TRUE, TRUE);
+ test_end_to_end_server(FALSE, TRUE);
+ test_end_to_end_server(TRUE, FALSE);
- /* Don't bother testing W interfaces on Win9x/WinMe */
- SetLastError(0xdeadbeef);
- lstrcmpW(NULL, NULL);
- if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
- {
- win_skip("Skipping W-interface tests\n");
- }
- else
- {
- test_end_to_end_server(TRUE, TRUE);
- test_end_to_end_server(FALSE, TRUE);
- test_end_to_end_server(TRUE, FALSE);
-
- test_dde_aw_transaction( FALSE, TRUE );
- test_dde_aw_transaction( TRUE, FALSE );
- test_dde_aw_transaction( TRUE, TRUE );
- test_dde_aw_transaction( FALSE, FALSE );
+ test_dde_aw_transaction( FALSE, TRUE );
+ test_dde_aw_transaction( TRUE, FALSE );
+ test_dde_aw_transaction( TRUE, TRUE );
+ test_dde_aw_transaction( FALSE, FALSE );
- test_dde_aw_transaction( FALSE, TRUE );
- test_dde_aw_transaction( TRUE, FALSE );
- test_dde_aw_transaction( TRUE, TRUE );
- }
+ test_dde_aw_transaction( FALSE, TRUE );
+ test_dde_aw_transaction( TRUE, FALSE );
+ test_dde_aw_transaction( TRUE, TRUE );
test_dde_aw_transaction( FALSE, FALSE );
test_DdeCreateDataHandle();
--
2.24.1
Dec. 27, 2019
[PATCH 1/3] user32/tests: Remove unnecessary uses of CREATE_SUSPENDED.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/user32/tests/dde.c | 102 ++++++++++++++++++----------------------
1 file changed, 46 insertions(+), 56 deletions(-)
diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index d370df181a..786d4eca07 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -43,6 +43,22 @@ static WNDPROC old_dde_client_wndproc;
static const DWORD default_timeout = 200;
+static HANDLE create_process(const char *arg)
+{
+ STARTUPINFOA si = {.cb = sizeof(si)};
+ PROCESS_INFORMATION pi;
+ char cmdline[200];
+ char **argv;
+ BOOL ret;
+
+ winetest_get_mainargs(&argv);
+ sprintf(cmdline, "\"%s\" %s %s", argv[0], argv[1], arg);
+ ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+ ok(ret, "CreateProcess failed: %u\n", GetLastError());
+ CloseHandle(pi.hThread);
+ return pi.hProcess;
+}
+
static BOOL is_cjk(void)
{
int lang_id = PRIMARYLANGID(GetUserDefaultLangID());
@@ -253,23 +269,25 @@ static LRESULT WINAPI dde_server_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPA
return DefWindowProcA(hwnd, msg, wparam, lparam);
}
-static void test_msg_server(HANDLE hproc, HANDLE hthread)
+static void test_msg_server(void)
{
+ HANDLE client;
MSG msg;
HWND hwnd;
DWORD res;
create_dde_window(&hwnd, "dde_server", dde_server_wndproc);
- ResumeThread( hthread );
+ client = create_process("ddeml");
- while (MsgWaitForMultipleObjects( 1, &hproc, FALSE, INFINITE, QS_ALLINPUT ) != 0)
+ while (MsgWaitForMultipleObjects(1, &client, FALSE, INFINITE, QS_ALLINPUT) != 0)
{
while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg);
}
destroy_dde_window(&hwnd, "dde_server");
- GetExitCodeProcess( hproc, &res );
+ GetExitCodeProcess(client, &res);
ok( !res, "client failed with %u error(s)\n", res );
+ CloseHandle(client);
}
static HDDEDATA CALLBACK client_ddeml_callback(UINT uType, UINT uFmt, HCONV hconv,
@@ -823,14 +841,17 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon
return 0;
}
-static void test_ddeml_server(HANDLE hproc)
+static void test_ddeml_server(void)
{
+ HANDLE client;
MSG msg;
UINT res;
BOOL ret;
HSZ server;
HDDEDATA hdata;
+ client = create_process("msg");
+
/* set up DDE server */
server_pid = 0;
res = DdeInitializeA(&server_pid, server_ddeml_callback, APPCLASS_STANDARD, 0);
@@ -842,14 +863,15 @@ static void test_ddeml_server(HANDLE hproc)
hdata = DdeNameService(server_pid, server, 0, DNS_REGISTER);
ok(hdata == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", hdata);
- while (MsgWaitForMultipleObjects( 1, &hproc, FALSE, INFINITE, QS_ALLINPUT ) != 0)
+ while (MsgWaitForMultipleObjects(1, &client, FALSE, INFINITE, QS_ALLINPUT) != 0)
{
while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg);
}
ret = DdeUninitialize(server_pid);
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- GetExitCodeProcess( hproc, &res );
+ GetExitCodeProcess(client, &res);
ok( !res, "client failed with %u error(s)\n", res );
+ CloseHandle(client);
}
static HWND client_hwnd, server_hwnd;
@@ -2683,8 +2705,9 @@ static void test_end_to_end_client(BOOL type_a)
}
-static void test_end_to_end_server(HANDLE hproc, HANDLE hthread, BOOL type_a)
+static void test_end_to_end_server(BOOL client_unicode, BOOL server_unicode)
{
+ HANDLE client;
MSG msg;
HSZ server;
BOOL ret;
@@ -2692,13 +2715,14 @@ static void test_end_to_end_server(HANDLE hproc, HANDLE hthread, BOOL type_a)
HDDEDATA hdata;
static const char test_service[] = "TestDDEService";
- trace("start end to end server %s\n", type_a ? "ASCII" : "UNICODE");
+ trace("client %s, server %s\n", client_unicode ? "unicode" : "ascii",
+ server_unicode ? "unicode" : "ascii");
server_pid = 0;
- if (type_a)
- res = DdeInitializeA(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0);
- else
+ if (server_unicode)
res = DdeInitializeW(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0);
+ else
+ res = DdeInitializeA(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0);
ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res);
server = DdeCreateStringHandleA(server_pid, test_service, CP_WINANSI);
@@ -2706,27 +2730,25 @@ static void test_end_to_end_server(HANDLE hproc, HANDLE hthread, BOOL type_a)
hdata = DdeNameService(server_pid, server, 0, DNS_REGISTER);
ok(hdata == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", hdata);
- ResumeThread( hthread );
+ client = create_process(client_unicode ? "endw" : "enda");
- while (MsgWaitForMultipleObjects( 1, &hproc, FALSE, INFINITE, QS_ALLINPUT ) != 0)
+ while (MsgWaitForMultipleObjects(1, &client, FALSE, INFINITE, QS_ALLINPUT) != 0)
{
while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg);
}
ret = DdeUninitialize(server_pid);
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
- GetExitCodeProcess( hproc, &res );
+ GetExitCodeProcess(client, &res);
ok( !res, "client failed with %u error(s)\n", res );
+ CloseHandle(client);
}
START_TEST(dde)
{
int argc;
char **argv;
- char buffer[MAX_PATH];
- STARTUPINFOA startup;
- PROCESS_INFORMATION proc;
DWORD dde_inst = 0xdeadbeef;
argc = winetest_get_mainargs(&argv);
@@ -2754,30 +2776,12 @@ START_TEST(dde)
return;
}
- ZeroMemory(&startup, sizeof(STARTUPINFOA));
- sprintf(buffer, "%s dde ddeml", argv[0]);
- startup.cb = sizeof(startup);
- startup.dwFlags = STARTF_USESHOWWINDOW;
- startup.wShowWindow = SW_SHOWNORMAL;
-
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- CREATE_SUSPENDED, NULL, NULL, &startup, &proc);
-
- test_msg_server(proc.hProcess, proc.hThread);
-
- sprintf(buffer, "%s dde msg", argv[0]);
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- 0, NULL, NULL, &startup, &proc);
-
- test_ddeml_server(proc.hProcess);
+ test_msg_server();
+ test_ddeml_server();
/* Test the combinations of A and W interfaces with A and W data
end to end to ensure that data conversions are accurate */
- sprintf(buffer, "%s dde enda", argv[0]);
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- CREATE_SUSPENDED, NULL, NULL, &startup, &proc);
-
- test_end_to_end_server(proc.hProcess, proc.hThread, TRUE);
+ test_end_to_end_server(FALSE, FALSE);
/* Don't bother testing W interfaces on Win9x/WinMe */
SetLastError(0xdeadbeef);
@@ -2788,23 +2792,9 @@ START_TEST(dde)
}
else
{
- sprintf(buffer, "%s dde endw", argv[0]);
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- CREATE_SUSPENDED, NULL, NULL, &startup, &proc);
-
- test_end_to_end_server(proc.hProcess, proc.hThread, FALSE);
-
- sprintf(buffer, "%s dde enda", argv[0]);
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- CREATE_SUSPENDED, NULL, NULL, &startup, &proc);
-
- test_end_to_end_server(proc.hProcess, proc.hThread, FALSE);
-
- sprintf(buffer, "%s dde endw", argv[0]);
- CreateProcessA(NULL, buffer, NULL, NULL, FALSE,
- CREATE_SUSPENDED, NULL, NULL, &startup, &proc);
-
- test_end_to_end_server(proc.hProcess, proc.hThread, TRUE);
+ test_end_to_end_server(TRUE, TRUE);
+ test_end_to_end_server(FALSE, TRUE);
+ test_end_to_end_server(TRUE, FALSE);
test_dde_aw_transaction( FALSE, TRUE );
test_dde_aw_transaction( TRUE, FALSE );
--
2.24.1
Dec. 27, 2019
Re: msvcrt:scanf float conversion behavior
by Piotr Caban
On 12/27/19 4:41 AM, Erich E. Hoover wrote:
> On Thu, Dec 26, 2019 at 7:05 AM Piotr Caban <piotr.caban(a)gmail.com> wrote:
>> ...
>> I was working on different strtod implementation (ucrtbase (as well as
>> glibc) uses sub 0.5 ulp precision algorithm). It's not ready yet. Also
>> it's not something that can be added during code-freeze.
>
> Yeah, I was struggling to get something that passes this scanf test
> (without breaking the more numerous strtod tests):
> ===
> ret = vsscanf_wrapper(tests[i], "1.1e-30", "%lf", &double_res);
> ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
> ok(double_res == 1.1e-30, "got wrong double %.16e for flags %#x\n",
> double_res, tests[i]);
> ===
> I finally came up with the attached the other day, which seems to do
> the trick*. If you think AJ might be okay with it then would only
> leave webservices/reader.c:str_to_double with "long double" usage,
> which I now have a patch for implementing with scanf.
The 1.1e-30 tests is an example of a test that stopped working in strtod
with your patches. While working on new implementation of strtod I was
running Chromium string conversion tests (it's a 100k semi random
doubles conversion test). Here are some results:
ucrtbase:
- Windows: 0 failures
- Current 32-bit Wine: 32062 failures, biggest error: 3 ulp
- 6e7f357 32-bit Wine: 36 failures, biggest error: 1 ulp
msvcrt:
- Windows 10: 16 failures
ucrtbase scanf tests:
- Windows: 0 failures
- Current 32-bit Wine: 36 failures, biggest error: 1 ulp
- Current 32-bit Wine with the patch you have attached: 49779
failures, the exponent is sometimes off by 1, e.g. on
"1.5475148155234508e-252"
The test that produces the biggest error for strtod function is:
4.0621786324484882e-053
I'm afraid that your patches will possibly cause tons of regressions and
I'm not sure yet how to proceed with it during the code-freeze. There's
a quite simple algorithm that should have similar results as msvcrt (I
will need to implement it in order to know) that can possibly go into
Wine during code-freeze. On the other hand it will need to be rewritten
after the code-freeze so I'm not a fun of it. The proper algorithm I was
working on will definitely exceed 1k lines of code.
>
>> I was not working on scanf changes. It definitely makes sense to not
>> duplicate the code.
>
> I've been poking at this a little bit and it looks like scanf supports
> everything that strtod and wcstod need. There are a couple things
> that our scanf implementation doesn't support yet (inf/nan,
> Fortran-style exponent notation, and hex notation for floats), but
> once those are in place we should be good to go. So, it may make
> sense to centralize everything in scanf (rather than the other way
> around) so that there isn't any duplication for wide character
> support.
I was thinking about having a common helper that will be used both in
strtod and scanf. Proper string to double conversion is complicated and
I don't think it should be mixed with scanf implementation.
Changing the strtod_helper signature to something like:
double strtod_helper(MSVCRT_wchar_t get(void *ctx), void
unget(MSVCRT_wchar_t c, void *ctx), void *ctx, MSVCRT__locale_t locale,
int *err)
should make it usable both for strtod like functions and scanf.
> * Also works well enough that the new compare_double should not be
> necessary, unless you've come up with some more test cases ;)
It will be still needed in string.c:3074. The test is written in a way
that exact comparison will not work on Windows. It would probably also
make sense to add most conversion tests to ucrtbase because other
versions have bugs that we probably don't want to reproduce.
Thanks,
Piotr
Dec. 27, 2019
[PATCH] msscript.ocx/tests: Fix a typo.
by Andrey Gusev
And the same for mshtml/tests and scrobj/tests
Dec. 27, 2019
[PATCH] msscript.ocx/tests: Fix a typo.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/msscript.ocx/tests/msscript.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c
index 7693f0b51b..d95c43d9b4 100644
--- a/dlls/msscript.ocx/tests/msscript.c
+++ b/dlls/msscript.ocx/tests/msscript.c
@@ -448,7 +448,7 @@ static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveSc
IActiveScriptSiteWindow *window;
IActiveScriptSiteDebug *debug;
IServiceProvider *service;
- ICanHandleException *canexpection;
+ ICanHandleException *canexception;
LCID lcid;
HRESULT hres;
@@ -468,7 +468,7 @@ static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveSc
hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteDebug, (void**)&debug);
ok(hres == E_NOINTERFACE, "Got IActiveScriptSiteDebug interface: %08x\n", hres);
- hres = IActiveScriptSite_QueryInterface(pass, &IID_ICanHandleException, (void**)&canexpection);
+ hres = IActiveScriptSite_QueryInterface(pass, &IID_ICanHandleException, (void**)&canexception);
ok(hres == E_NOINTERFACE, "Got IID_ICanHandleException interface: %08x\n", hres);
hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service);
--
2.20.1
Dec. 27, 2019
[PATCH] po: Update Catalan translation
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
po/ca.po | 508 ++++++++++++++++---------------------------------------
1 file changed, 146 insertions(+), 362 deletions(-)
diff --git a/po/ca.po b/po/ca.po
index 4b7466522b..7255f30d38 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: Wine\n"
"Report-Msgid-Bugs-To: https://bugs.winehq.org\n"
"POT-Creation-Date: N/A\n"
-"PO-Revision-Date: 2018-12-17 21:33-0700\n"
+"PO-Revision-Date: 2019-12-26 18:54-0700\n"
"Last-Translator: Alex Henrie <alexhenrie24(a)gmail.com>\n"
"Language-Team: Catalan\n"
"Language: ca\n"
@@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Poedit 2.2.4\n"
#: appwiz.rc:58
msgid "Install/Uninstall"
@@ -629,7 +629,7 @@ msgstr "Colors personalit&zats:"
#: comdlg32.rc:289
msgid "|S&olid"
-msgstr ""
+msgstr "|Sò&lid"
#: comdlg32.rc:290
msgid "&Red:"
@@ -666,11 +666,9 @@ msgid "&Define Custom Colors >>"
msgstr "D&efinició de colors personalitzats >>"
#: comdlg32.rc:312
-#, fuzzy
-#| msgid "&No"
msgctxt "Solid"
msgid "&o"
-msgstr "&No"
+msgstr "&l"
#: comdlg32.rc:318 regedit.rc:275 regedit.rc:285
msgid "Find"
@@ -1723,7 +1721,7 @@ msgstr "Correu electrònic segur"
#: crypt32.rc:142
msgid "Time Stamping"
-msgstr "Segellament de temps"
+msgstr "Marcació horària"
#: crypt32.rc:143
msgid "Microsoft Trust List Signing"
@@ -1731,7 +1729,7 @@ msgstr "Segellament de llista de confiança del Microsoft"
#: crypt32.rc:144
msgid "Microsoft Time Stamping"
-msgstr "Segellament de temps del Microsoft"
+msgstr "Marcació horària del Microsoft"
#: crypt32.rc:145
msgid "IP security end system"
@@ -3924,7 +3922,7 @@ msgstr "La longitud és dolenta.\n"
#: winerror.mc:153 winerror.mc:528
msgid "Seek error.\n"
-msgstr "Hi ha hagut un error en cercar.\n"
+msgstr "Hi ha hagut un error en saltar.\n"
#: winerror.mc:158
msgid "Not DOS disk.\n"
@@ -4216,7 +4214,7 @@ msgstr "L'ús d'identificador d'accés directe no és vàlid.\n"
#: winerror.mc:523
msgid "Negative seek.\n"
-msgstr "La cerca és negativa.\n"
+msgstr "El salt és negatiu.\n"
#: winerror.mc:533
msgid "Drive is a JOIN target.\n"
@@ -4372,7 +4370,7 @@ msgstr "El fitxer ja existeix.\n"
#: winerror.mc:723
msgid "Invalid flag number.\n"
-msgstr "El número de bandera no és vàlid.\n"
+msgstr "El número d'opció no és vàlid.\n"
#: winerror.mc:728
msgid "Semaphore name not found.\n"
@@ -4624,7 +4622,7 @@ msgstr "No es pot acabar.\n"
#: winerror.mc:1038
msgid "Invalid flags.\n"
-msgstr "Les banderes no són vàlides.\n"
+msgstr "Les opcions no són vàlides.\n"
#: winerror.mc:1043
msgid "Unrecognized volume.\n"
@@ -5700,7 +5698,7 @@ msgstr "L'autenticació mútua ha fallat.\n"
#: winerror.mc:2393
msgid "Time skew between client and server.\n"
-msgstr "Hi ha una asimetria de temps entre el client i el servidor.\n"
+msgstr "Hi ha una asimetria horària entre el client i el servidor.\n"
#: winerror.mc:2398
msgid "Invalid window handle.\n"
@@ -6840,541 +6838,387 @@ msgstr "Envia correu"
#: mferror.mc:249 mferror.mc:256
msgid "Begin request has already been made.\n"
-msgstr ""
+msgstr "Ja s'ha fet la sol·licitud per començar.\n"
#: mferror.mc:599
-#, fuzzy
-#| msgid "Object UUID not found.\n"
msgid "Sink has not been finalized.\n"
-msgstr "No s'ha trobat l'UUID de l'objecte.\n"
+msgstr "No s'ha finalitzat el receptor.\n"
#: mferror.mc:32
-#, fuzzy
-#| msgid "Installation platform not supported.\n"
msgid "Media Foundation platform is not initialized.\n"
-msgstr "La plataforma d'instal·lació no és compatible.\n"
+msgstr "No s'ha inicialitzat la plataforma de Fundació de Mitjans.\n"
#: mferror.mc:39
-#, fuzzy
-#| msgid "Byte count too small.\n"
msgid "Buffer is too small.\n"
-msgstr "El nombre de bytes és massa petit.\n"
+msgstr "La memòria intermèdia és massa petita.\n"
#: mferror.mc:46
-#, fuzzy
-#| msgid "Invalid query syntax.\n"
msgid "Invalid request.\n"
-msgstr "La sintaxi de consulta no és vàlida.\n"
+msgstr "La sol·licitud no és vàlida.\n"
#: mferror.mc:53
-#, fuzzy
-#| msgid "Invalid segment number.\n"
msgid "Invalid stream number.\n"
-msgstr "El número de segment no és vàlid.\n"
+msgstr "El número de flux no és vàlid.\n"
#: mferror.mc:60
-#, fuzzy
-#| msgid "Invalid data type.\n"
msgid "Invalid media type.\n"
-msgstr "El tipus de dades no és vàlid.\n"
+msgstr "El tipus de mitjans no és vàlid.\n"
#: mferror.mc:67
-#, fuzzy
-#| msgid "No more entries.\n"
msgid "No more input is accepted.\n"
-msgstr "No hi ha més entrades.\n"
+msgstr "No s'accepten més entrades.\n"
#: mferror.mc:74
-#, fuzzy
-#| msgid "Object UUID not found.\n"
msgid "Object is not initialized.\n"
-msgstr "No s'ha trobat l'UUID de l'objecte.\n"
+msgstr "No s'ha inicialitzat l'objecte.\n"
#: mferror.mc:81
-#, fuzzy
-#| msgid "Operation not supported.\n"
msgid "Representation is not supported.\n"
-msgstr "No s'admet l'operació.\n"
+msgstr "No s'admet la representació.\n"
#: mferror.mc:88
msgid "No more types in the list of suggested media types.\n"
-msgstr ""
+msgstr "No hi ha més tipus en la llista de tipus de mitjans suggerits.\n"
#: mferror.mc:95
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported service.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "El servei és incompatible.\n"
#: mferror.mc:102
-#, fuzzy
-#| msgid "Unexpected network error.\n"
msgid "Unexpected error.\n"
-msgstr "Hi ha hagut un error de xarxa inesperat.\n"
+msgstr "Hi ha hagut un error inesperat.\n"
#: mferror.mc:116
-#, fuzzy
-#| msgid "Invalid time.\n"
msgid "Invalid type.\n"
-msgstr "L'hora no és vàlida.\n"
+msgstr "El tipus no és vàlid.\n"
#: mferror.mc:123
-#, fuzzy
-#| msgid "Invalid pixel format.\n"
msgid "Invalid file format.\n"
-msgstr "El format de píxels no és vàlid.\n"
+msgstr "El format de fitxer no és vàlid.\n"
#: mferror.mc:137
-#, fuzzy
-#| msgid "Invalid time.\n"
msgid "Invalid timestamp.\n"
-msgstr "L'hora no és vàlida.\n"
+msgstr "La marca horària no és vàlida.\n"
#: mferror.mc:144
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported scheme.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "L'esquema és incompatible.\n"
#: mferror.mc:151
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported bytestream type.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "El flux de bytes és incompatible.\n"
#: mferror.mc:158
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported time format.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "El format horari és incompatible.\n"
#: mferror.mc:165
msgid "Timestamp is not set for the sample.\n"
-msgstr ""
+msgstr "La marca horària de la mostra no està establerta.\n"
#: mferror.mc:172
msgid "No duration set for the sample.\n"
-msgstr ""
+msgstr "La mostra no té cap duració establerta.\n"
#: mferror.mc:179
-#, fuzzy
-#| msgid "Invalid data.\n"
msgid "Invalid stream data.\n"
-msgstr "Les dades no són vàlides.\n"
+msgstr "Les dades de flux no són vàlides.\n"
#: mferror.mc:186
-#, fuzzy
-#| msgid "Help not available."
msgid "Realtime support is not available.\n"
-msgstr "No hi ha cap ajuda disponible."
+msgstr "Suport per a temps real no està disponible.\n"
#: mferror.mc:193
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported rate.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "La velocitat és incompatible.\n"
#: mferror.mc:200
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported thinning.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "L'aprimament és incompatible.\n"
#: mferror.mc:207
-#, fuzzy
-#| msgid "Request not supported.\n"
msgid "Reversing is not supported.\n"
-msgstr "No s'admet la sol·licitud.\n"
+msgstr "No s'admet marxa enrere.\n"
#: mferror.mc:214
-#, fuzzy
-#| msgid "Unsupported authorization level.\n"
msgid "Unsupported rate transition.\n"
-msgstr "No s'admet el nivell d'autorització.\n"
+msgstr "La transició de velocitat no és compatible.\n"
#: mferror.mc:221
msgid "Rate change was preempted.\n"
-msgstr ""
+msgstr "El canvi de velocitat ha estat cancel·lat per un altre.\n"
#: mferror.mc:228
-#, fuzzy
-#| msgid "Object UUID not found.\n"
msgid "Object or value wasn't found.\n"
-msgstr "No s'ha trobat l'UUID de l'objecte.\n"
+msgstr "No s'ha trobat l'objecte o el valor.\n"
#: mferror.mc:235
-#, fuzzy
-#| msgid "Help not available."
msgid "Value is not available.\n"
-msgstr "No hi ha cap ajuda disponible."
+msgstr "El valor no està disponible.\n"
#: mferror.mc:242
-#, fuzzy
-#| msgid "Help not available."
msgid "Clock is not available.\n"
-msgstr "No hi ha cap ajuda disponible."
+msgstr "El rellotge no està disponible.\n"
#: mferror.mc:263
-#, fuzzy
-#| msgid "Extended attributes not supported.\n"
msgid "Multiple subscribers are not supported.\n"
-msgstr "No s'accepten atributs extensos.\n"
+msgstr "No s'accepten múltiples subscriptors.\n"
#: mferror.mc:270
-#, fuzzy
-#| msgid "The driver was not enabled."
msgid "The timer was orphaned.\n"
-msgstr "El controlador no estava habilitat."
+msgstr "El temporitzador s'ha fet orfe.\n"
#: mferror.mc:277
-#, fuzzy
-#| msgid "Character translation table open failed.\n"
msgid "State transition is pending.\n"
-msgstr "Ha fallat l'obertura de la taula de traducció de caràcters.\n"
+msgstr "Una transició d'estat està penjada.\n"
#: mferror.mc:284
-#, fuzzy
-#| msgid "Unsupported authorization level.\n"
msgid "Unsupported state transition.\n"
-msgstr "No s'admet el nivell d'autorització.\n"
+msgstr "La transició de velocitat no és compatible.\n"
#: mferror.mc:291
-#, fuzzy
-#| msgid "An internal error has occurred.\n"
msgid "Unrecoverable error occurred.\n"
-msgstr "Ha ocorregut un error intern.\n"
+msgstr "Ha ocorregut un error no recuperable.\n"
#: mferror.mc:298
msgid "Sample has too many buffers.\n"
-msgstr ""
+msgstr "La mostra té massa memòria intermèdia.\n"
#: mferror.mc:305
-#, fuzzy
-#| msgid "Temporary directory not writable.\n"
msgid "Sample is not writable.\n"
-msgstr "No es pot escriure al directori temporal.\n"
+msgstr "No es pot escriure a la mostra.\n"
#: mferror.mc:312
-#, fuzzy
-#| msgid "Path is invalid.\n"
msgid "Key is invalid.\n"
-msgstr "El camí no és vàlid.\n"
+msgstr "La clau no és vàlida.\n"
#: mferror.mc:319
-#, fuzzy
-#| msgid "Wrong stub version.\n"
msgid "Bad startup version.\n"
-msgstr "La versió d'esbós (stub) és incorrecta.\n"
+msgstr "La versió d'inici és dolenta.\n"
#: mferror.mc:326
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported caption.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "El subtítol és incompatible.\n"
#: mferror.mc:333
-#, fuzzy
-#| msgid "Invalid workstation.\n"
msgid "Invalid position.\n"
-msgstr "L'estació de treball no és vàlida.\n"
+msgstr "La posició no és vàlida.\n"
#: mferror.mc:340
-#, fuzzy
-#| msgid "File not found.\n"
msgid "Attribute is not found.\n"
-msgstr "No s'ha trobat el fitxer.\n"
+msgstr "No s'ha trobat l'atribut.\n"
#: mferror.mc:347
-#, fuzzy
-#| msgid "Hook type not allowed.\n"
msgid "Property type is not allowed.\n"
-msgstr "El tipus de ganxo no es permet.\n"
+msgstr "El tipus de propietat no es permet.\n"
#: mferror.mc:354
-#, fuzzy
-#| msgid "Operation not supported.\n"
msgid "Property type is not supported.\n"
-msgstr "No s'admet l'operació.\n"
+msgstr "El tipus de propietat no s'admet.\n"
#: mferror.mc:361
-#, fuzzy
-#| msgid "Directory is not empty.\n"
msgid "Property is empty.\n"
-msgstr "El directori no està buit.\n"
+msgstr "La propietat està buida.\n"
#: mferror.mc:368
-#, fuzzy
-#| msgid "Directory is not empty.\n"
msgid "Property is not empty.\n"
-msgstr "El directori no està buit.\n"
+msgstr "La propietat no està buida.\n"
#: mferror.mc:375
-#, fuzzy
-#| msgid "Hook type not allowed.\n"
msgid "Vector property is not allowed.\n"
-msgstr "El tipus de ganxo no es permet.\n"
+msgstr "No es permet una propietat vectora.\n"
#: mferror.mc:382
msgid "Vector property is required.\n"
-msgstr ""
+msgstr "Cal una propietat vectora.\n"
#: mferror.mc:389
-#, fuzzy
-#| msgid "Operation canceled by user.\n"
msgid "Operation was cancelled.\n"
-msgstr "L'usuari ha cancel·lat l'operació.\n"
+msgstr "S'ha cancel·lat l'operació.\n"
#: mferror.mc:396
-#, fuzzy
-#| msgid "Server not disabled.\n"
msgid "Bytestream is not seekable.\n"
-msgstr "El servidor no està inhabilitat.\n"
+msgstr "No es pot saltar en el flux de bytes.\n"
#: mferror.mc:403
msgid "Platform is disabled in safe mode.\n"
-msgstr ""
+msgstr "La plataforma està inhabilitat en el mode segur.\n"
#: mferror.mc:410
-#, fuzzy
-#| msgid "Cannot create service thread.\n"
msgid "Cannot parse bytestream.\n"
-msgstr "No es pot crear el fil de servei.\n"
+msgstr "No es pot analitzar el flux de bytes.\n"
#: mferror.mc:417
msgid "Mutually exclusive flags passed to source resolver.\n"
-msgstr ""
+msgstr "S'han passat opcions mutualment exclusives al resolutor de fons.\n"
#: mferror.mc:424
-#, fuzzy
-#| msgid "Unknown interface.\n"
msgid "Unknown bytestream length.\n"
-msgstr "La interfície és desconeguda.\n"
+msgstr "La llargada del flux de dades és desconeguda.\n"
#: mferror.mc:431
-#, fuzzy
-#| msgid "Invalid index.\n"
msgid "Invalid work queue index.\n"
-msgstr "L'índex no és vàlid.\n"
+msgstr "L'índex de cua de treball no és vàlida.\n"
#: mferror.mc:438
-#, fuzzy
-#| msgid "No logon servers available.\n"
msgid "No events available.\n"
-msgstr "Cap servidor d'autenticació està disponible.\n"
+msgstr "Cap esdeveniment està disponible.\n"
#: mferror.mc:445
-#, fuzzy
-#| msgid "Unsupported authorization level.\n"
msgid "Invalid media source state transition.\n"
-msgstr "No s'admet el nivell d'autorització.\n"
+msgstr "La transició d'estat de fons de mitjans no és vàlida.\n"
#: mferror.mc:452
-#, fuzzy
-#| msgid "Registry has been recovered.\n"
msgid "End of media stream has been reached.\n"
-msgstr "S'ha recuperat el registre.\n"
+msgstr "S'ha arribat al final del flux de mitjans.\n"
#: mferror.mc:459
msgid "Shutdown() was called.\n"
-msgstr ""
+msgstr "S'ha invocat Shutdown().\n"
#: mferror.mc:466
-#, fuzzy
-#| msgid "Registry has been recovered.\n"
msgid "Media stream has no duration set.\n"
-msgstr "S'ha recuperat el registre.\n"
+msgstr "El flux de mitjans no té cap duració establerta.\n"
#: mferror.mc:473
msgid "Media format was recognized but is invalid.\n"
-msgstr ""
+msgstr "El format de mitjans s'ha reconegut però no és vàlid.\n"
#: mferror.mc:480
-#, fuzzy
-#| msgid "Property set not found.\n"
msgid "Property wasn't found.\n"
-msgstr "No s'ha trobat el conjunt de propietats.\n"
+msgstr "No s'ha trobat la propietat.\n"
#: mferror.mc:487
-#, fuzzy
-#| msgid "Directory is not empty.\n"
msgid "Property is read-only.\n"
-msgstr "El directori no està buit.\n"
+msgstr "Només es pot llegir la propietat.\n"
#: mferror.mc:494
-#, fuzzy
-#| msgid "Hook type not allowed.\n"
msgid "Property is not allowed.\n"
-msgstr "El tipus de ganxo no es permet.\n"
+msgstr "No es permet la propietat.\n"
#: mferror.mc:501
-#, fuzzy
-#| msgid "Resource in use.\n"
msgid "Media source is not started.\n"
-msgstr "El recurs està en ús.\n"
+msgstr "No s'ha començat la font de mitjans.\n"
#: mferror.mc:508
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported media format.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "El format de mitjans és incompatible.\n"
#: mferror.mc:515
-#, fuzzy
-#| msgid "Resource in use.\n"
msgid "Media source is in wrong state.\n"
-msgstr "El recurs està en ús.\n"
+msgstr "La font de mitjans està en un estat incorrecte.\n"
#: mferror.mc:522
-#, fuzzy
-#| msgid "No data detected.\n"
msgid "No media streams were selected.\n"
-msgstr "No s'ha detectat dades.\n"
+msgstr "No s'ha seleccionat cap flux de mitjans.\n"
#: mferror.mc:529
-#, fuzzy
-#| msgid "Unsupported type.\n"
msgid "Unsupported media source characteristics.\n"
-msgstr "El tipus és incompatible.\n"
+msgstr "Les característiques de font de mitjans són incompatibles.\n"
#: mferror.mc:536
msgid "Stream sink was removed.\n"
-msgstr ""
+msgstr "S'ha eliminat el receptor de flux.\n"
#: mferror.mc:543
msgid "Stream sinks are out of sync.\n"
-msgstr ""
+msgstr "Els receptors de flux no estan sincronitzats.\n"
#: mferror.mc:550
-#, fuzzy
-#| msgid "Registry has been recovered.\n"
msgid "Media sink stream sinks set is fixed.\n"
-msgstr "S'ha recuperat el registre.\n"
+msgstr "El conjunt de receptors del flux de mitjans és fix.\n"
#: mferror.mc:557
-#, fuzzy
-#| msgid "Domain already exists.\n"
msgid "Stream sink already exists.\n"
-msgstr "El domini ja existeix.\n"
+msgstr "El receptor de flux ja existeix.\n"
#: mferror.mc:564
-#, fuzzy
-#| msgid "Operation canceled by user.\n"
msgid "Sample allocation was canceled.\n"
-msgstr "L'usuari ha cancel·lat l'operació.\n"
+msgstr "S'ha cancel·lat l'assignació de mostra.\n"
#: mferror.mc:571
-#, fuzzy
-#| msgid "Directory is not empty.\n"
msgid "Sample allocator is empty.\n"
-msgstr "El directori no està buit.\n"
+msgstr "L'assignador de mostra està buit.\n"
#: mferror.mc:578
-#, fuzzy
-#| msgid "Class already exists.\n"
msgid "Sink was already stopped.\n"
-msgstr "La classe ja existeix.\n"
+msgstr "El receptor ja s'ha aturat.\n"
#: mferror.mc:585
msgid "Bitrate was unknown for ASF file sink.\n"
-msgstr ""
+msgstr "No s'ha reconegut la velocitat de bits del receptor ASF.\n"
#: mferror.mc:592
-#, fuzzy
-#| msgid "No data detected.\n"
msgid "No streams were selected for the sink.\n"
-msgstr "No s'ha detectat dades.\n"
+msgstr "No s'ha seleccionat cap flux per al receptor.\n"
#: mferror.mc:606
-#, fuzzy
-#| msgid "File name is too long.\n"
msgid "Metadata was too long.\n"
-msgstr "El nom de fitxer és massa llarg.\n"
+msgstr "Les metadades han estat massa llargues.\n"
#: mferror.mc:613
msgid "No samples were processed by the sink.\n"
-msgstr ""
+msgstr "El receptor no ha processat cap mostra.\n"
#: mferror.mc:620
msgid "Sink was not provided with required headers.\n"
-msgstr ""
+msgstr "No s'han proporcionat les capçaleres requerides al receptor.\n"
#: mferror.mc:627
-#, fuzzy
-#| msgid "Connection invalid.\n"
msgid "Optional node is invalid.\n"
-msgstr "La connexió no és vàlida.\n"
+msgstr "El node opcional no és vàlid.\n"
#: mferror.mc:634
-#, fuzzy
-#| msgid "Cannot find the printer."
msgid "Cannot find decryptor.\n"
-msgstr "No es pot trobar la impressora."
+msgstr "No es pot trobar el desxifrador.\n"
#: mferror.mc:641
-#, fuzzy
-#| msgid "Module not found.\n"
msgid "Codec was not found.\n"
-msgstr "No s'ha trobat el mòdul.\n"
+msgstr "No s'ha trobat el còdec.\n"
#: mferror.mc:648
-#, fuzzy
-#| msgid "Cannot get call handle.\n"
msgid "Cannot connect topology nodes.\n"
-msgstr "No es pot obtenir l'identificador de trucada.\n"
+msgstr "No es poden connectar els nodes de la topologia.\n"
#: mferror.mc:655
-#, fuzzy
-#| msgid "Request not supported.\n"
msgid "Topology request is not supported.\n"
-msgstr "No s'admet la sol·licitud.\n"
+msgstr "No s'admet la sol·licitud de topologia.\n"
#: mferror.mc:662
-#, fuzzy
-#| msgid "Invalid group attributes.\n"
msgid "Invalid topology time attributes.\n"
-msgstr "Els atributs de grup no són vàlids.\n"
+msgstr "Els atributs de topologia horària no són vàlids.\n"
#: mferror.mc:669
msgid "Found loops in topology.\n"
-msgstr ""
+msgstr "S'han trobat bucles en la topologia.\n"
#: mferror.mc:676
-#, fuzzy
-#| msgid "Installation source is missing.\n"
msgid "Presentation descriptor is missing.\n"
-msgstr "Manca la font d'instal·lació.\n"
+msgstr "Manca el descriptor de presentació.\n"
#: mferror.mc:683
-#, fuzzy
-#| msgid "Index is missing.\n"
msgid "Stream descriptor is missing.\n"
-msgstr "Manca l'índex.\n"
+msgstr "Manca el descriptor de flux.\n"
#: mferror.mc:690
-#, fuzzy
-#| msgid "The device is not connected.\n"
msgid "Stream descriptor is not selected.\n"
-msgstr "El dispositiu no està connectat.\n"
+msgstr "El descriptor de flux no està seleccionat.\n"
#: mferror.mc:697
-#, fuzzy
-#| msgid "Index is missing.\n"
msgid "Source is missing.\n"
-msgstr "Manca l'índex.\n"
+msgstr "Manca la font.\n"
#: mferror.mc:704
msgid "Topology loader does not support sink activates.\n"
-msgstr ""
+msgstr "El carregador de topologia no admet activacions de receptor.\n"
#: mferror.mc:711
msgid "Clock has no time source set.\n"
-msgstr ""
+msgstr "El rellotge no té cap font d'hora establerta.\n"
#: mferror.mc:718
-#, fuzzy
-#| msgid "Class already exists.\n"
msgid "Clock state was already set.\n"
-msgstr "La classe ja existeix.\n"
+msgstr "Ja s'ha establert l'estat de rellotge.\n"
#: mpr.rc:35 wininet.rc:37
msgid "Enter Network Password"
@@ -8471,26 +8315,20 @@ msgid "Off"
msgstr "Inactiu"
#: version.rc:42
-#, fuzzy
-#| msgid "video"
msgid "Provider"
-msgstr "vídeo"
+msgstr "Proveïdor"
#: version.rc:45
-#, fuzzy
-#| msgid "Select the format you want to use:"
msgid "Select the data you want to connect to:"
-msgstr "Seleccioneu el format que voleu utilitzar:"
+msgstr "Seleccioneu les dades a les qualles voleu connectar:"
#: version.rc:36
-#, fuzzy
-#| msgid "Properties"
msgid "Data Link Properties"
-msgstr "Propietats"
+msgstr "Propietats d'enllaç de dades"
#: version.rc:37
msgid "OLE DB Provider(s)"
-msgstr ""
+msgstr "Proveïdors de base de dades OLE"
#: oledlg.rc:55
msgid "Insert Object"
@@ -9884,11 +9722,11 @@ msgstr "Hora d'estiu central"
#: tzres.rc:50
msgid "Azores Standard Time"
-msgstr "Hora estàndard dels Açores"
+msgstr "Hora estàndard de les Açores"
#: tzres.rc:51
msgid "Azores Daylight Time"
-msgstr "Hora d'estiu dels Açores"
+msgstr "Hora d'estiu de les Açores"
#: tzres.rc:158
msgid "North Asia East Standard Time"
@@ -10048,11 +9886,11 @@ msgstr "Hora d'estiu de les muntanyes"
#: tzres.rc:206
msgid "US Eastern Standard Time"
-msgstr "Hora estàndard oriental EEUU"
+msgstr "Hora estàndard oriental EUA"
#: tzres.rc:207
msgid "US Eastern Daylight Time"
-msgstr "Hora d'estiu oriental EEUU"
+msgstr "Hora d'estiu oriental EUA"
#: tzres.rc:196
msgid "Tasmania Standard Time"
@@ -10072,11 +9910,11 @@ msgstr "Hora d'estiu de l'Àmerica Central"
#: tzres.rc:208
msgid "US Mountain Standard Time"
-msgstr "Hora estàndard de les muntanyes EEUU"
+msgstr "Hora estàndard de les muntanyes EUA"
#: tzres.rc:209
msgid "US Mountain Daylight Time"
-msgstr "Hora d'estiu de les muntanyes EEUU"
+msgstr "Hora d'estiu de les muntanyes EUA"
#: tzres.rc:188
msgid "South Africa Standard Time"
@@ -10120,11 +9958,11 @@ msgstr "Hora d'estiu de Iakutsk"
#: tzres.rc:176
msgid "SA Eastern Standard Time"
-msgstr "Hora estàndard de l'Àmerica del Sud-Est"
+msgstr "Hora estàndard de l'Àmerica del Sud-est"
#: tzres.rc:177
msgid "SA Eastern Daylight Time"
-msgstr "Hora d'estiu de l'Àmerica del Sud-Est"
+msgstr "Hora d'estiu de l'Àmerica del Sud-est"
#: tzres.rc:34
msgid "Arab Standard Time"
@@ -10160,11 +9998,11 @@ msgstr "Hora d'estiu romànic"
#: tzres.rc:98
msgid "Ekaterinburg Standard Time"
-msgstr "Hora estàndard d'Iekaterinburg"
+msgstr "Hora estàndard de Iekaterinburg"
#: tzres.rc:99
msgid "Ekaterinburg Daylight Time"
-msgstr "Hora d'estiu d'Iekaterinburg"
+msgstr "Hora d'estiu de Iekaterinburg"
#: tzres.rc:192
msgid "Syria Standard Time"
@@ -10288,11 +10126,11 @@ msgstr "Hora d'estiu de Hawaii"
#: tzres.rc:184
msgid "SE Asia Standard Time"
-msgstr "Hora estàndard de l'Àsia del Sud-Est"
+msgstr "Hora estàndard de l'Àsia del Sud-est"
#: tzres.rc:185
msgid "SE Asia Daylight Time"
-msgstr "Hora d'estiu de l'Àsia del Sud-Est"
+msgstr "Hora d'estiu de l'Àsia del Sud-est"
#: tzres.rc:154
msgid "New Zealand Standard Time"
@@ -10320,11 +10158,11 @@ msgstr "Hora d'estiu de Bielorússia"
#: tzres.rc:180
msgid "SA Western Standard Time"
-msgstr "Hora estàndard de l'Àmerica del Sud-Oest"
+msgstr "Hora estàndard de l'Àmerica del Sud-oest"
#: tzres.rc:181
msgid "SA Western Daylight Time"
-msgstr "Hora d'estiu de l'Àmerica del Sud-Oest"
+msgstr "Hora d'estiu de l'Àmerica del Sud-oest"
#: tzres.rc:108
msgid "Greenland Standard Time"
@@ -10747,7 +10585,7 @@ msgstr "Un número d'error s'ha especificat que no està definit en el sistema."
#: winmm.rc:42
msgid "An invalid flag was passed to a system function."
-msgstr "S'ha passat una bandera no vàlida a una funció de sistema."
+msgstr "S'ha passat una opció no vàlida a una funció de sistema."
#: winmm.rc:43
msgid "An invalid parameter was passed to a system function."
@@ -10783,7 +10621,7 @@ msgid ""
"Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, "
"and then try again."
msgstr ""
-"No es pot obrir el dispositiu sense utilitzar la bandera WAVE_ALLOWSYNC. "
+"No es pot obrir el dispositiu sense utilitzar l'opció WAVE_ALLOWSYNC. "
"Utilitzeu la bandera i després torneu a intentar."
#: winmm.rc:52
@@ -11026,7 +10864,7 @@ msgid ""
"The specified value for the time format is invalid. Refer to the MCI "
"documentation for valid formats."
msgstr ""
-"El valor especificat per al format d'hora no és vàlid. Consulteu la "
+"El valor especificat per al format horari no és vàlid. Consulteu la "
"documentació MCI pels formats vàlids."
#: winmm.rc:93
@@ -11066,7 +10904,7 @@ msgstr "Heu d'especificar un àlies quan s'utilitza el paràmetre 'new'."
#: winmm.rc:99
msgid "Cannot use the 'notify' flag with auto-opened devices."
msgstr ""
-"No es pot utilitzar la bandera 'notify' amb els dispositius oberts "
+"No es pot utilitzar l'opció 'notify' amb els dispositius oberts "
"automàticament."
#: winmm.rc:100
@@ -11242,19 +11080,15 @@ msgid ""
"The time formats of the \"song pointer\" and SMPTE are mutually exclusive. "
"You can't use them together."
msgstr ""
-"Els formats d'hora de la \"punter de cançó\" i SMPTE són mútuament "
+"Els formats horaris de la \"punter de cançó\" i SMPTE són mútuament "
"excloents. No es poden utilitzar junts."
#: winmm.rc:128
-#, fuzzy
-#| msgid ""
-#| "The specified MIDI port is already in use. Wait until it is free; then "
-#| "try again."
msgid ""
"The specified MIDI port is already in use. Wait until it is free, and then "
"try again."
msgstr ""
-"El port MIDI especificat ja està en ús. Espereu fins que estigui lliure; "
+"El port MIDI especificat ja està en ús. Espereu fins que estigui lliure i "
"llavors torneu a intentar."
#: winmm.rc:131
@@ -11271,16 +11105,12 @@ msgid "An error occurred with the specified port."
msgstr "Ha ocorregut un error amb el port especificat."
#: winmm.rc:133
-#, fuzzy
-#| msgid ""
-#| "All multimedia timers are being used by other applications. Quit one of "
-#| "these applications; then, try again."
msgid ""
"All multimedia timers are being used by other applications. Quit one of "
"these applications, and then try again."
msgstr ""
-"Les altres aplicacions estan utilitzant tots els temporitzadors de "
-"multimèdia. Tanqueu una d'aquestes aplicacions, llavors torneu a intentar."
+"Tots els temporitzadors de multimèdia estan en ús per altres aplicacions. "
+"Tanqueu una d'aquestes aplicacions i llavors torneu a intentar."
#: winmm.rc:132
msgid "The system doesn't have a current MIDI port specified."
@@ -11692,7 +11522,7 @@ msgid ""
msgstr ""
"CALL <nom de fitxer BAT> s'utilitza dins un fitxer BAT per a executar\n"
"ordres d'un altre fitxer BAT. Quan se surt del fitxer BAT, el control\n"
-"retorna al fitxer que l'ha trucat. L'ordre CALL pot proveir paràmetres al\n"
+"retorna al fitxer que l'ha invocat. L'ordre CALL pot proveir paràmetres al\n"
"procediment trucat.\n"
"\n"
"El procediment trucant hereta els canvis al directori per defecte,\n"
@@ -11792,7 +11622,7 @@ msgstr ""
"\n"
"L'etiqueta que és la destinació d'un GOTO pot ser de fins a 255 caràcters\n"
"de longitud però no pot incloure espais (això és diferent d'altres sistemes\n"
-"operatius). Si dos o més etiquetes idèntiques existeixen en un fitxer BAT,\n"
+"operatius). Si dues o més etiquetes idèntiques existeixen en un fitxer BAT,\n"
"el primer sempre s'executarà. Intentar fer GOTO a una etiqueta no existent\n"
"termina l'execució del fitxer BAT.\n"
"\n"
@@ -12104,14 +11934,14 @@ msgid ""
"\n"
"The verify flag has no function in Wine.\n"
msgstr ""
-"S'utilitza VERIFY per a definir, esborrar o provar la bandera de\n"
+"S'utilitza VERIFY per a establir, esborrar o provar l'opció de\n"
"verificació. Les formes vàlides són:\n"
"\n"
-"VERIFY ON\tEstableix la bandera.\n"
-"VERIFY OFF\tEsborra la bandera.\n"
+"VERIFY ON\tEstableix l'opció.\n"
+"VERIFY OFF\tEsborra l'opció.\n"
"VERIFY\t\tMostra ON o OFF segons correspongui.\n"
"\n"
-"La bandera de verificació no té cap funció en el Wine.\n"
+"L'opció de verificació no té cap funció en el Wine.\n"
#: cmd.rc:256
msgid "VER displays the version of cmd you are running.\n"
@@ -13132,7 +12962,7 @@ msgstr "&Executa l'Editor de Registre"
#: oleview.rc:42
msgid "&CoCreateInstance Flag"
-msgstr "Bandera &CoCreateInstance"
+msgstr "Opció &CoCreateInstance"
#: oleview.rc:44
msgid "&In-process server"
@@ -14699,7 +14529,7 @@ msgstr "De&finició de la prioritat"
#: taskmgr.rc:156
msgid "&Realtime"
-msgstr "&Temps real"
+msgstr "Temps &real"
#: taskmgr.rc:160
msgid "&Above Normal"
@@ -15470,7 +15300,7 @@ msgstr "Visualitzador de Metafitxers Regular"
#: view.rc:50
msgid "Metafiles (*.wmf, *.emf)"
-msgstr ""
+msgstr "Metafitxers (*.wmf, *.emf)"
#: wineboot.rc:31
msgid "Waiting for Program"
@@ -15643,10 +15473,6 @@ msgid "Drive configuration"
msgstr "Configuració d'unitats"
#: winecfg.rc:233
-#, fuzzy
-#| msgid ""
-#| "Failed to connect to the mount manager, the drive configuration cannot be "
-#| "edited."
msgid ""
"Failed to connect to the mount manager; the drive configuration cannot be "
"edited."
@@ -15938,12 +15764,6 @@ msgid "System drive"
msgstr "Unitat de sistema"
#: winecfg.rc:76
-#, fuzzy
-#| msgid ""
-#| "Are you sure you want to delete drive C?\n"
-#| "\n"
-#| "Most Windows applications expect drive C to exist, and will die messily "
-#| "if it doesn't. If you proceed remember to recreate it!"
msgid ""
"Are you sure you want to delete drive C?\n"
"\n"
@@ -16375,7 +16195,7 @@ msgid ""
"A program on your system has crashed, but WineDbg was unable to attach to "
"the process to obtain a backtrace."
msgstr ""
-"Un program en el vostre sistema ha tingut una pana, però el WineDbg no ha "
+"Un programa en el vostre sistema ha tingut una pana, però el WineDbg no ha "
"pogut enganxar-se al procès per a obtenir una traça inversa."
#: winedbg.rc:41
@@ -17027,10 +16847,8 @@ msgid "Text documents (*.txt)"
msgstr "Documents de text (*.txt)"
#: wordpad.rc:149
-#, fuzzy
-#| msgid "Unicode text document (*.txt)"
msgid "Unicode text documents (*.txt)"
-msgstr "Documents de text d'Unicode (*.txt)"
+msgstr "Document de text d'Unicode (*.txt)"
#: wordpad.rc:150
msgid "Rich text format (*.rtf)"
@@ -17234,42 +17052,6 @@ msgid "D"
msgstr "D"
#: xcopy.rc:81
-#, fuzzy
-#| msgid ""
-#| "XCOPY - Copies source files or directory trees to a destination.\n"
-#| "\n"
-#| "Syntax:\n"
-#| "XCOPY source [destination] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n"
-#| "\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n"
-#| "\n"
-#| "Where:\n"
-#| "\n"
-#| "[/I] Assume directory if destination does not exist and copying two or\n"
-#| "\tmore files.\n"
-#| "[/S] Copy directories and subdirectories.\n"
-#| "[/E] Copy directories and subdirectories, including any empty ones.\n"
-#| "[/Q] Do not list names during copy, that is be quiet.\n"
-#| "[/F] Show full source and destination names during copy.\n"
-#| "[/L] Simulate operation, showing names which would be copied.\n"
-#| "[/W] Prompts before beginning the copy operation.\n"
-#| "[/T] Creates empty directory structure but does not copy files.\n"
-#| "[/Y] Suppress prompting when overwriting files.\n"
-#| "[/-Y] Enable prompting when overwriting files.\n"
-#| "[/P] Prompts on each source file before copying.\n"
-#| "[/N] Copy using short names.\n"
-#| "[/U] Copy only files which already exist in destination.\n"
-#| "[/R] Overwrite any read only files.\n"
-#| "[/H] Include hidden and system files in the copy.\n"
-#| "[/C] Continue even if an error occurs during the copy.\n"
-#| "[/A] Only copy files with archive attribute set.\n"
-#| "[/M] Only copy files with archive attribute set, removes the\n"
-#| "\tarchive attribute.\n"
-#| "[/K] Copy file attributes, without this attributes are not preserved.\n"
-#| "[/D | /D:m-d-y] Copy new files or those modified after the supplied "
-#| "date.\n"
-#| "\t\tIf no date is supplied, only copy if destination is older\n"
-#| "\t\tthan source.\n"
-#| "\n"
msgid ""
"XCOPY - Copies source files or directory trees to a destination.\n"
"\n"
@@ -17333,6 +17115,8 @@ msgstr ""
"[/A] Només copiar els fitxers amb l'atribut d'arxiu establert.\n"
"[/M] Només copiar els fitxers amb l'atribut d'arxiu establert, elimina\n"
"\tl'atribut d'arxiu.\n"
+"[/K] Copiar els atributs de fitxer; sense això, no se preserven els\n"
+" atributs.\n"
"[/D | /D:m-d-y] Copiar els fitxers nous o els modificats després de la data\n"
"\t\tproveïda.\n"
"\t\tSi no es proveeix cap data, només es copia si la destinació és més\n"
--
2.24.1
Dec. 27, 2019
Re: msvcrt:scanf float conversion behavior
by Greg
On Thu, 2019-12-26 at 20:41 -0700, Erich E. Hoover wrote:
> On Thu, Dec 26, 2019 at 7:05 AM Piotr Caban <piotr.caban(a)gmail.com>
> wrote:
> > ...I was working on different strtod implementation (ucrtbase (as
> > well asglibc) uses sub 0.5 ulp precision algorithm). It's not ready
> > yet. Alsoit's not something that can be added during code-freeze.
>
> Yeah, I was struggling to get something that passes this scanf
> test(without breaking the more numerous strtod tests):===ret =
> vsscanf_wrapper(tests[i], "1.1e-30", "%lf", &double_res);ok(ret == 1,
> "sscanf returned %d for flags %#x\n", ret, tests[i]);ok(double_res ==
> 1.1e-30, "got wrong double %.16e for flags %#x\n",double_res,
> tests[i]);===I finally came up with the attached the other day, which
> seems to dothe trick*. If you think AJ might be okay with it then
> would onlyleave webservices/reader.c:str_to_double with "long double"
> usage,which I now have a patch for implementing with scanf.
> > I was not working on scanf changes. It definitely makes sense to
> > notduplicate the code.
>
> I've been poking at this a little bit and it looks like scanf
> supportseverything that strtod and wcstod need. There are a couple
> thingsthat our scanf implementation doesn't support yet
> (inf/nan,Fortran-style exponent notation, and hex notation for
> floats), butonce those are in place we should be good to go. So, it
> may makesense to centralize everything in scanf (rather than the
> other wayaround) so that there isn't any duplication for wide
> charactersupport.
> Best,Erich
> * Also works well enough that the new compare_double should not
> benecessary, unless you've come up with some more test cases ;)
FYI,
The existing NaN behaviour for the scanf family is leading to issues
with a game. My report is here:
https://bugs.winehq.org/show_bug.cgi?id=48323
Returning NaN may not help that issue, but at least might be a better
to deal with than just not parsing.
Regards,
Greg
Dec. 27, 2019
Re: msvcrt:scanf float conversion behavior
by Erich E. Hoover
On Thu, Dec 26, 2019 at 7:05 AM Piotr Caban <piotr.caban(a)gmail.com> wrote:
> ...
> I was working on different strtod implementation (ucrtbase (as well as
> glibc) uses sub 0.5 ulp precision algorithm). It's not ready yet. Also
> it's not something that can be added during code-freeze.
Yeah, I was struggling to get something that passes this scanf test
(without breaking the more numerous strtod tests):
===
ret = vsscanf_wrapper(tests[i], "1.1e-30", "%lf", &double_res);
ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
ok(double_res == 1.1e-30, "got wrong double %.16e for flags %#x\n",
double_res, tests[i]);
===
I finally came up with the attached the other day, which seems to do
the trick*. If you think AJ might be okay with it then would only
leave webservices/reader.c:str_to_double with "long double" usage,
which I now have a patch for implementing with scanf.
> I was not working on scanf changes. It definitely makes sense to not
> duplicate the code.
I've been poking at this a little bit and it looks like scanf supports
everything that strtod and wcstod need. There are a couple things
that our scanf implementation doesn't support yet (inf/nan,
Fortran-style exponent notation, and hex notation for floats), but
once those are in place we should be good to go. So, it may make
sense to centralize everything in scanf (rather than the other way
around) so that there isn't any duplication for wide character
support.
Best,
Erich
* Also works well enough that the new compare_double should not be
necessary, unless you've come up with some more test cases ;)
Dec. 27, 2019