Module: wine Branch: stable Commit: 1b925afd249a69ea1f02ded9ac8c318e80790ca3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=1b925afd249a69ea1f02ded9a...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Jun 4 21:51:57 2019 +0200
msvcp: Add _Strxfrm implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 1ad48d1b3c94e41fe24dd0d82bd252f5e6b3d380) Conflicts: dlls/msvcp90/locale.c Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/msvcp100/msvcp100.spec | 2 +- dlls/msvcp110/msvcp110.spec | 2 +- dlls/msvcp120/msvcp120.spec | 2 +- dlls/msvcp120_app/msvcp120_app.spec | 2 +- dlls/msvcp140/msvcp140.spec | 2 +- dlls/msvcp60/msvcp60.spec | 2 +- dlls/msvcp70/msvcp70.spec | 2 +- dlls/msvcp71/msvcp71.spec | 2 +- dlls/msvcp80/msvcp80.spec | 2 +- dlls/msvcp90/locale.c | 39 +++++++++++++++++++++++++++++++++++++ dlls/msvcp90/msvcp90.spec | 2 +- dlls/msvcp90/tests/misc.c | 23 ++++++++++++++++++++++ 12 files changed, 72 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec index 55217a6d66..0d6f4420d1 100644 --- a/dlls/msvcp100/msvcp100.spec +++ b/dlls/msvcp100/msvcp100.spec @@ -2958,7 +2958,7 @@ @ cdecl -ret64 _Stoullx(ptr ptr long ptr) @ cdecl _Stoulx(ptr ptr long ptr) @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Towlower(long ptr) diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index 882dbbe12f..5477ada853 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -3854,7 +3854,7 @@ @ cdecl _Stoulx(ptr ptr long ptr) @ stub _Stoxflt @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ stub _Thrd_abort @ cdecl _Thrd_create(ptr ptr ptr) @ cdecl -norelay _Thrd_current() diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 73024a0d9d..a399b7ee12 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -3801,7 +3801,7 @@ @ cdecl _Stoulx(ptr ptr long ptr) @ stub _Stoxflt @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ stub _Thrd_abort @ cdecl _Thrd_create(ptr ptr ptr) @ cdecl -norelay _Thrd_current() diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index cece375f7f..99c7a57ee0 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -3801,7 +3801,7 @@ @ cdecl _Stoulx(ptr ptr long ptr) msvcp120._Stoulx @ stub _Stoxflt @ cdecl _Strcoll(ptr ptr ptr ptr ptr) msvcp120._Strcoll -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) msvcp120._Strxfrm @ stub _Thrd_abort @ cdecl _Thrd_create(ptr ptr ptr) msvcp120._Thrd_create @ cdecl -norelay _Thrd_current() msvcp120._Thrd_current diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 96dff341d3..770cb0ef9d 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -3715,7 +3715,7 @@ @ cdecl -ret64 _Stoullx(ptr ptr long ptr) _Stoullx @ cdecl _Stoulx(ptr ptr long ptr) _Stoulx @ cdecl _Strcoll(ptr ptr ptr ptr ptr) _Strcoll -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Symlink(wstr wstr) tr2_sys__Symlink_wchar @ stub _Symlink_get @ cdecl _Temp_get(ptr) diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec index f49643072c..b0e43e0c4b 100644 --- a/dlls/msvcp60/msvcp60.spec +++ b/dlls/msvcp60/msvcp60.spec @@ -4302,7 +4302,7 @@ @ cdecl _Stof(ptr ptr long) @ cdecl _Stold(ptr ptr long) _Stod @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Wcrtomb(ptr long ptr ptr) diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec index 4e75c20618..04f45a3f03 100644 --- a/dlls/msvcp70/msvcp70.spec +++ b/dlls/msvcp70/msvcp70.spec @@ -5090,7 +5090,7 @@ @ cdecl _Stof(ptr ptr long) @ cdecl _Stold(ptr ptr long) _Stod @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Wcrtomb(ptr long ptr ptr) diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec index 6d3e931aa3..a9d1cc2562 100644 --- a/dlls/msvcp71/msvcp71.spec +++ b/dlls/msvcp71/msvcp71.spec @@ -5146,7 +5146,7 @@ @ cdecl _Stof(ptr ptr long) @ cdecl _Stold(ptr ptr long) _Stod @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Towlower(long ptr) diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec index 8cf9e5489c..6073b996cc 100644 --- a/dlls/msvcp80/msvcp80.spec +++ b/dlls/msvcp80/msvcp80.spec @@ -5772,7 +5772,7 @@ @ cdecl _Stoulx(ptr ptr long ptr) @ stub _Stoxflt @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Towlower(long ptr) diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c index 068e81e2df..1c577cda13 100644 --- a/dlls/msvcp90/locale.c +++ b/dlls/msvcp90/locale.c @@ -35,6 +35,7 @@ #include "winnls.h" #include "msvcp90.h" #include "wine/unicode.h" +#include "wine/heap.h" #include "wine/list.h" #include "wine/debug.h"
@@ -12667,6 +12668,44 @@ int __cdecl _To_wide(const char *src, wchar_t *dst) return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, MAX_PATH); }
+MSVCP_size_t __cdecl _Strxfrm(char *dest, char *dest_end, const char *src, const char *src_end, _Collvec *coll) +{ + MSVCP_size_t dest_len = dest_end - dest; + MSVCP_size_t src_len = src_end - src; + _Collvec cv; + WCHAR *buf; + LCID lcid; + int len; + + TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll); + + if (coll) cv = *coll; + else getcoll(&cv); + +#if _MSVCP_VER < 110 + lcid = cv.handle; +#else + lcid = LocaleNameToLCID(cv.lc_name, 0); +#endif + + if (!lcid && !cv.page) + { + if (src_len > dest_len) return src_len; + memcpy(dest, src, src_len); + return src_len; + } + + len = MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, NULL, 0); + if (!len) return 0; + buf = heap_alloc(len * sizeof(WCHAR)); + if (!buf) return 0; + MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, buf, len); + + len = LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, (WCHAR*)dest, dest_len); + heap_free(buf); + return len; +} + DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base@std@@") DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@") DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp@locale@std@@") diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 1df283ab22..b0b8665d24 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -6547,7 +6547,7 @@ @ cdecl -ret64 _Stoullx(ptr ptr long ptr) @ cdecl _Stoulx(ptr ptr long ptr) @ cdecl _Strcoll(ptr ptr ptr ptr ptr) -@ stub _Strxfrm +@ cdecl _Strxfrm(ptr ptr ptr ptr ptr) @ cdecl _Tolower(long ptr) @ cdecl _Toupper(long ptr) @ cdecl _Towlower(long ptr) diff --git a/dlls/msvcp90/tests/misc.c b/dlls/msvcp90/tests/misc.c index e9fd1e06be..260695af97 100644 --- a/dlls/msvcp90/tests/misc.c +++ b/dlls/msvcp90/tests/misc.c @@ -119,6 +119,7 @@ static /*MSVCP__Collvec*/ULONGLONG (__cdecl *p__Getcoll)(void); static wctrans_t (__cdecl *p_wctrans)(const char*); static wint_t (__cdecl *p_towctrans)(wint_t, wctrans_t); static void (__cdecl *p_locale__Locimp__Locimp_Addfac)(locale__Locimp*,locale_facet*,size_t); +static size_t (__cdecl *p__Strxfrm)(char*, char*, const char*, const char*, const MSVCP__Collvec*);
#undef __thiscall #ifdef __i386__ @@ -262,6 +263,7 @@ static BOOL init(void) SET(p__Getcoll, "_Getcoll"); SET(p_wctrans, "wctrans"); SET(p_towctrans, "towctrans"); + SET(p__Strxfrm, "_Strxfrm"); SET(basic_ostringstream_char_vbtable, "??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@");
SET(p_std_Ctraits_float__Isnan, "?_Isnan@?$_Ctraits@M@std@@SA_NM@Z"); @@ -1102,6 +1104,26 @@ static void test_raise_handler(void) *p_Raise_handler = NULL; }
+static void test__Strxfrm(void) +{ + const char in[] = "abc"; + + MSVCP__Collvec coll; + char out[64]; + size_t ret; + + memset(&coll, 0, sizeof(coll)); + + out[0] = 'z'; + ret = p__Strxfrm(out, out + 1, in, in + 2, &coll); + ok(ret == 2, "ret = %d\n", (int)ret); + ok(out[0] == 'z', "out[0] = %x\n", out[0]); + + ret = p__Strxfrm(out, out + sizeof(out), in, in + 4, &coll); + ok(ret == 4, "ret = %d\n", (int)ret); + ok(!strcmp(in, out), "out = %s\n", out); +} + START_TEST(misc) { if(!init()) @@ -1122,6 +1144,7 @@ START_TEST(misc) test_vbtable_size_exports(); test_locale__Locimp__Locimp_Addfac(); test_raise_handler(); + test__Strxfrm();
ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n");