Gijs Vermeulen : msvcr120: Add [to]wctrans.

Alexandre Julliard julliard at winehq.org
Thu Mar 21 17:21:20 CDT 2019


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

Author: Gijs Vermeulen <gijsvrm at gmail.com>
Date:   Thu Mar 21 16:30:21 2019 +0100

msvcr120: Add [to]wctrans.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46848
Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 .../api-ms-win-crt-convert-l1-1-0.spec             |  2 +-
 .../api-ms-win-crt-string-l1-1-0.spec              |  2 +-
 dlls/msvcr120/msvcr120.spec                        |  4 +--
 dlls/msvcr120/tests/msvcr120.c                     | 37 ++++++++++++++++++++++
 dlls/msvcr120_app/msvcr120_app.spec                |  4 +--
 dlls/msvcrt/locale.c                               | 27 ++++++++++++++++
 dlls/msvcrt/msvcrt.h                               |  3 ++
 dlls/ucrtbase/ucrtbase.spec                        |  4 +--
 8 files changed, 75 insertions(+), 8 deletions(-)

diff --git a/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec b/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec
index a72ec0a..1b877e3 100644
--- a/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec
@@ -119,4 +119,4 @@
 @ cdecl wctob(long) ucrtbase.wctob
 @ cdecl wctomb(ptr long) ucrtbase.wctomb
 @ cdecl wctomb_s(ptr ptr long long) ucrtbase.wctomb_s
-@ stub wctrans
+@ cdecl wctrans(str) ucrtbase.wctrans
diff --git a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
index 0a61576..7854437 100644
--- a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
@@ -151,7 +151,7 @@
 @ cdecl strxfrm(ptr str long) ucrtbase.strxfrm
 @ cdecl tolower(long) ucrtbase.tolower
 @ cdecl toupper(long) ucrtbase.toupper
-@ stub towctrans
+@ cdecl towctrans(long long) ucrtbase.towctrans
 @ cdecl towlower(long) ucrtbase.towlower
 @ cdecl towupper(long) ucrtbase.towupper
 @ cdecl wcscat(wstr wstr) ucrtbase.wcscat
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 0e3d7bb..b4a0d7e 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -2414,7 +2414,7 @@
 @ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
-@ stub towctrans
+@ cdecl towctrans(long long) MSVCR120_towctrans
 @ cdecl towlower(long) MSVCRT_towlower
 @ cdecl towupper(long) MSVCRT_towupper
 @ cdecl trunc(double) MSVCR120_trunc
@@ -2486,7 +2486,7 @@
 @ cdecl wctob(long) MSVCRT_wctob
 @ cdecl wctomb(ptr long) MSVCRT_wctomb
 @ cdecl wctomb_s(ptr ptr long long) MSVCRT_wctomb_s
-@ stub wctrans
+@ cdecl wctrans(str) MSVCR120_wctrans
 @ cdecl wctype(str)
 @ cdecl wmemcpy_s(ptr long ptr long)
 @ cdecl wmemmove_s(ptr long ptr long)
diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c
index 3077a18..be5df27 100644
--- a/dlls/msvcr120/tests/msvcr120.c
+++ b/dlls/msvcr120/tests/msvcr120.c
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <float.h>
 #include <limits.h>
+#include <wctype.h>
 
 #include <windef.h>
 #include <winbase.h>
@@ -205,6 +206,8 @@ static double (__cdecl *p_creal)(_Dcomplex);
 static double (__cdecl *p_nexttoward)(double, double);
 static float (__cdecl *p_nexttowardf)(float, double);
 static double (__cdecl *p_nexttowardl)(double, double);
+static wctrans_t (__cdecl *p_wctrans)(const char*);
+static wint_t (__cdecl *p_towctrans)(wint_t, wctrans_t);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -268,6 +271,8 @@ static BOOL init(void)
     SET(p_nexttoward, "nexttoward");
     SET(p_nexttowardf, "nexttowardf");
     SET(p_nexttowardl, "nexttowardl");
+    SET(p_wctrans, "wctrans");
+    SET(p_towctrans, "towctrans");
     if(sizeof(void*) == 8) { /* 64-bit initialization */
         SET(p_critical_section_ctor,
                 "??0critical_section at Concurrency@@QEAA at XZ");
@@ -1052,6 +1057,37 @@ static void test_nexttoward(void)
     ok(e == -1, "Expected no error, got %d.\n", e);
 }
 
+static void test_towctrans(void)
+{
+    wchar_t ret;
+
+    ret = p_wctrans("tolower");
+    ok(ret == 2, "wctrans returned %d, expected 2\n", ret);
+    ret = p_wctrans("toupper");
+    ok(ret == 1, "wctrans returned %d, expected 1\n", ret);
+    ret = p_wctrans("toLower");
+    ok(ret == 0, "wctrans returned %d, expected 0\n", ret);
+    ret = p_wctrans("");
+    ok(ret == 0, "wctrans returned %d, expected 0\n", ret);
+    if(0) { /* crashes on windows */
+        ret = p_wctrans(NULL);
+        ok(ret == 0, "wctrans returned %d, expected 0\n", ret);
+    }
+
+    ret = p_towctrans('t', 2);
+    ok(ret == 't', "towctrans('t', 2) returned %c, expected t\n", ret);
+    ret = p_towctrans('T', 2);
+    ok(ret == 't', "towctrans('T', 2) returned %c, expected t\n", ret);
+    ret = p_towctrans('T', 0);
+    ok(ret == 't', "towctrans('T', 0) returned %c, expected t\n", ret);
+    ret = p_towctrans('T', 3);
+    ok(ret == 't', "towctrans('T', 3) returned %c, expected t\n", ret);
+    ret = p_towctrans('t', 1);
+    ok(ret == 'T', "towctrans('t', 1) returned %c, expected T\n", ret);
+    ret = p_towctrans('T', 1);
+    ok(ret == 'T', "towctrans('T', 1) returned %c, expected T\n", ret);
+}
+
 START_TEST(msvcr120)
 {
     if (!init()) return;
@@ -1072,4 +1108,5 @@ START_TEST(msvcr120)
     test_vsscanf();
     test__Cbuild();
     test_nexttoward();
+    test_towctrans();
 }
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 5b1549b..2bb377b 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -2076,7 +2076,7 @@
 @ cdecl tmpnam_s(ptr long) msvcr120.tmpnam_s
 @ cdecl tolower(long) msvcr120.tolower
 @ cdecl toupper(long) msvcr120.toupper
-@ stub towctrans
+@ cdecl towctrans(long long) msvcr120.towctrans
 @ cdecl towlower(long) msvcr120.towlower
 @ cdecl towupper(long) msvcr120.towupper
 @ cdecl trunc(double) msvcr120.trunc
@@ -2148,7 +2148,7 @@
 @ cdecl wctob(long) msvcr120.wctob
 @ cdecl wctomb(ptr long) msvcr120.wctomb
 @ cdecl wctomb_s(ptr ptr long long) msvcr120.wctomb_s
-@ stub wctrans
+@ cdecl wctrans(str) msvcr120.wctrans
 @ cdecl wctype(str) msvcr120.wctype
 @ cdecl wmemcpy_s(ptr long ptr long) msvcr120.wmemcpy_s
 @ cdecl wmemmove_s(ptr long ptr long) msvcr120.wmemmove_s
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index a1e827d..4282fed 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -2069,3 +2069,30 @@ BOOL msvcrt_init_locale(void)
     _setmbcp(_MB_CP_ANSI);
     return TRUE;
 }
+
+#if _MSVCR_VER >= 120
+/*********************************************************************
+ *      wctrans (MSVCR120.@)
+ */
+MSVCRT_wctrans_t CDECL MSVCR120_wctrans(const char *property)
+{
+    static const char str_tolower[] = "tolower";
+    static const char str_toupper[] = "toupper";
+
+    if(!strcmp(property, str_tolower))
+        return 2;
+    if(!strcmp(property, str_toupper))
+        return 1;
+    return 0;
+}
+
+/*********************************************************************
+ *      towctrans (MSVCR120.@)
+ */
+MSVCRT_wint_t CDECL MSVCR120_towctrans(MSVCRT_wint_t c, MSVCRT_wctrans_t category)
+{
+    if(category == 1)
+        return MSVCRT__towupper_l(c, NULL);
+    return MSVCRT__towlower_l(c, NULL);
+}
+#endif
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 8df8e3b..ed12dee 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -63,6 +63,7 @@
 typedef unsigned char  MSVCRT_bool;
 typedef unsigned short MSVCRT_wchar_t;
 typedef unsigned short MSVCRT_wint_t;
+typedef unsigned short MSVCRT_wctrans_t;
 typedef unsigned short MSVCRT_wctype_t;
 typedef unsigned short MSVCRT__ino_t;
 typedef unsigned int   MSVCRT__fsize_t;
@@ -1145,6 +1146,8 @@ void __cdecl MSVCRT__invalid_parameter(const MSVCRT_wchar_t *expr, const MSVCRT_
                                        const MSVCRT_wchar_t *file, unsigned int line, MSVCRT_uintptr_t arg);
 int __cdecl      MSVCRT__toupper_l(int,MSVCRT__locale_t);
 int __cdecl      MSVCRT__tolower_l(int,MSVCRT__locale_t);
+int __cdecl      MSVCRT__towupper_l(MSVCRT_wint_t,MSVCRT__locale_t);
+int __cdecl      MSVCRT__towlower_l(MSVCRT_wint_t,MSVCRT__locale_t);
 int __cdecl      MSVCRT__strnicmp(const char*, const char*, MSVCRT_size_t);
 int __cdecl      MSVCRT__strnicoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
 int __cdecl      MSVCRT__strncoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 770dd4f..544ebf8 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2543,7 +2543,7 @@
 @ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
-@ stub towctrans
+@ cdecl towctrans(long long) MSVCR120_towctrans
 @ cdecl towlower(long) MSVCRT_towlower
 @ cdecl towupper(long) MSVCRT_towupper
 @ cdecl trunc(double) MSVCR120_trunc
@@ -2593,7 +2593,7 @@
 @ cdecl wctob(long) MSVCRT_wctob
 @ cdecl wctomb(ptr long) MSVCRT_wctomb
 @ cdecl wctomb_s(ptr ptr long long) MSVCRT_wctomb_s
-@ stub wctrans
+@ cdecl wctrans(str) MSVCR120_wctrans
 @ cdecl wctype(str)
 @ cdecl wmemcpy_s(ptr long ptr long)
 @ cdecl wmemmove_s(ptr long ptr long)




More information about the wine-cvs mailing list