Piotr Caban : msvcp: Add _Strxfrm implementation.

Alexandre Julliard julliard at winehq.org
Tue Jun 4 16:28:14 CDT 2019


Module: wine
Branch: master
Commit: 1ad48d1b3c94e41fe24dd0d82bd252f5e6b3d380
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1ad48d1b3c94e41fe24dd0d82bd252f5e6b3d380

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Jun  4 21:51:57 2019 +0200

msvcp: Add _Strxfrm implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 2ae4e4c..d650ff8 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 5f2b664..128ec68 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 c2a2d7e..c8a6b91 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 cece375..99c7a57 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 8d2f43b..f83e440 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 196ac6a..5561297 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 b7c97a3..f07c622 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 ff6de62..4229023 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 43e179e..83b927a 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 ee14640..7b84874 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -32,6 +32,7 @@
 #include "winbase.h"
 #include "winnls.h"
 #include "msvcp90.h"
+#include "wine/heap.h"
 #include "wine/list.h"
 #include "wine/debug.h"
 
@@ -12664,6 +12665,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 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@@")
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index 2c1c0d7..e437c50 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 34a533a..d700b6d 100644
--- a/dlls/msvcp90/tests/misc.c
+++ b/dlls/msvcp90/tests/misc.c
@@ -105,6 +105,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__
@@ -248,6 +249,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 at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@7B@");
 
     SET(p_std_Ctraits_float__Isnan, "?_Isnan@?$_Ctraits at M@std@@SA_NM at Z");
@@ -1088,6 +1090,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())
@@ -1108,6 +1130,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");
 




More information about the wine-cvs mailing list