[PATCH] msvcp140: Implement _To_wide.
Stefan Dösinger
stefan at codeweavers.com
Fri May 26 04:37:09 CDT 2017
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
How do I handle systems that have a different ANSI codepage?
---
dlls/msvcp140/msvcp140.spec | 2 +-
dlls/msvcp140/tests/msvcp140.c | 32 ++++++++++++++++++++++++++++++++
dlls/msvcp90/locale.c | 10 ++++++++++
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index f13ec563ac..284f674736 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -3732,7 +3732,7 @@
@ cdecl _Thrd_start(ptr ptr ptr) _Thrd_start
@ cdecl _Thrd_yield() _Thrd_yield
@ stub _To_byte
-@ stub _To_wide
+@ cdecl _To_wide(str ptr)
@ cdecl _Tolower(long ptr) _Tolower
@ cdecl _Toupper(long ptr) _Toupper
@ cdecl _Towlower(long ptr) _Towlower
diff --git a/dlls/msvcp140/tests/msvcp140.c b/dlls/msvcp140/tests/msvcp140.c
index c9646135e1..6e131d413a 100644
--- a/dlls/msvcp140/tests/msvcp140.c
+++ b/dlls/msvcp140/tests/msvcp140.c
@@ -148,6 +148,8 @@ static int (__cdecl *p__Schedule_chore)(_Threadpool_chore*);
static int (__cdecl *p__Reschedule_chore)(const _Threadpool_chore*);
static void (__cdecl *p__Release_chore)(_Threadpool_chore*);
+static int (__cdecl *p_To_wide)(const char *src, WCHAR *dst);
+
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
#define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
@@ -209,6 +211,8 @@ static BOOL init(void)
SET(p__Release_chore, "?_Release_chore at details@Concurrency@@YAXPAU_Threadpool_chore at 12@@Z");
}
+ SET(p_To_wide, "_To_wide");
+
init_thiscall_thunk();
return TRUE;
}
@@ -461,6 +465,33 @@ static void test_chore(void)
p__Release_chore(&chore);
}
+static void test_to_wide(void)
+{
+ static const char *input1 = "Testtest";
+ static const char input2[] = {0xf6, 0xe4, 0xfc, 0xdf, 0x80, 0x9f, 0}; /* öäü߀Ÿ in cp1252 */
+ WCHAR dst[32] = {'A', 'B', 'C', 0, 'X', 'X', 'X', 'X', 'X', 'X', 'X'};
+ static const WCHAR compare1[] = {'A', 'B', 'C', 0, 'X', 'X', 'X', 'X', 'X', 'X', 'X'};
+ static const WCHAR compare2[] = {'T', 'e', 's', 't', 't', 'e', 's', 't', 0};
+ static const WCHAR compare3[] = {0x00f6, 0x00e4, 0x00fc, 0x00df, 0x20ac, 0x0178, 0}; /* öäü߀Ÿ in utf16 */
+ int ret;
+
+ ret = p_To_wide(NULL, NULL);
+ ok(!ret, "Got unexpected result %d\n", ret);
+ ret = p_To_wide(input1, NULL);
+ ok(!ret, "Got unexpected result %d\n", ret);
+ ret = p_To_wide(NULL, dst);
+ ok(!ret, "Got unexpected result %d\n", ret);
+ ok(!memcmp(dst, compare1, sizeof(compare1)), "Destination was modified: %s\n", wine_dbgstr_w(dst));
+
+ ret = p_To_wide(input1, dst);
+ ok(ret == strlen(input1) + 1, "ret = %d\n", ret);
+ ok(!memcmp(dst, compare2, sizeof(compare2)), "Got unexpected output %s\n", wine_dbgstr_w(dst));
+
+ ret = p_To_wide(input2, dst);
+ ok(ret == strlen(input2) + 1, "ret = %d\n", ret);
+ ok(!memcmp(dst, compare3, sizeof(compare3)), "Got unexpected output %s\n", wine_dbgstr_w(dst));
+}
+
START_TEST(msvcp140)
{
if(!init()) return;
@@ -470,5 +501,6 @@ START_TEST(msvcp140)
test__ContextCallback();
test__TaskEventLogger();
test_chore();
+ test_to_wide();
FreeLibrary(msvcp);
}
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index d2fce47a4b..3d65bd8992 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -11224,6 +11224,16 @@ size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *s
}
#endif
+int __cdecl _To_wide(const char *src, wchar_t *dst)
+{
+ TRACE("(%s %p)\n", debugstr_a(src), dst);
+
+ if (!src || !dst)
+ return 0;
+
+ return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, strlen(src) + 1);
+}
+
DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base at std@@")
DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet at locale@std@@")
DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp at locale@std@@")
--
2.13.0
More information about the wine-patches
mailing list