Paul Gofman : msvcrt: Implement _mbscmp_l().

Alexandre Julliard julliard at winehq.org
Thu Sep 24 15:49:06 CDT 2020


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

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Wed Sep 23 22:54:28 2020 +0300

msvcrt: Implement _mbscmp_l().

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 .../api-ms-win-crt-multibyte-l1-1-0.spec           |  2 +-
 .../api-ms-win-crt-private-l1-1-0.spec             |  2 +-
 dlls/msvcr100/msvcr100.spec                        |  2 +-
 dlls/msvcr110/msvcr110.spec                        |  2 +-
 dlls/msvcr120/msvcr120.spec                        |  2 +-
 dlls/msvcr80/msvcr80.spec                          |  2 +-
 dlls/msvcr90/msvcr90.spec                          |  2 +-
 dlls/msvcrt/mbcs.c                                 | 22 +++++++++++++++++-----
 dlls/msvcrt/msvcrt.spec                            |  2 +-
 dlls/msvcrt/tests/string.c                         | 11 +++++++++++
 dlls/ucrtbase/ucrtbase.spec                        |  4 ++--
 include/msvcrt/mbstring.h                          |  1 +
 12 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec
index f33d8c8f3d..287c3c105b 100644
--- a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec
@@ -95,7 +95,7 @@
 @ cdecl _mbschr(str long) ucrtbase._mbschr
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str) ucrtbase._mbscmp
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr) ucrtbase._mbscmp_l
 @ cdecl _mbscoll(str str) ucrtbase._mbscoll
 @ cdecl _mbscoll_l(str str ptr) ucrtbase._mbscoll_l
 @ cdecl _mbscpy_s(ptr long str) ucrtbase._mbscpy_s
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index d260ff138e..3bbe14613d 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -520,7 +520,7 @@
 @ cdecl _o__mbschr(str long) ucrtbase._o__mbschr
 @ stub _o__mbschr_l
 @ cdecl _o__mbscmp(str str) ucrtbase._o__mbscmp
-@ stub _o__mbscmp_l
+@ cdecl _o__mbscmp_l(str str ptr) ucrtbase._o__mbscmp_l
 @ cdecl _o__mbscoll(str str) ucrtbase._o__mbscoll
 @ cdecl _o__mbscoll_l(str str ptr) ucrtbase._o__mbscoll_l
 @ cdecl _o__mbscpy_s(ptr long str) ucrtbase._o__mbscpy_s
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 02cba0e3e7..ec1eb0a771 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1102,7 +1102,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index b545ffc25c..f32f8faba9 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1459,7 +1459,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 662c097367..82598b74ed 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1469,7 +1469,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index bc5c6f7bd9..95ffa62ab5 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -774,7 +774,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 38b3912b4a..f2d5616609 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -752,7 +752,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 2a42c097b4..abd1f1df05 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -872,13 +872,17 @@ unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSV
 }
 
 /*********************************************************************
- *		_mbscmp(MSVCRT.@)
+ *		_mbscmp_l(MSVCRT.@)
  */
-int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
+int CDECL _mbscmp_l(const unsigned char* str, const unsigned char* cmp, MSVCRT__locale_t locale)
 {
+  MSVCRT_pthreadmbcinfo mbcinfo;
+
   if (!str || !cmp) return INT_MAX;
 
-  if(get_mbcinfo()->ismbcodepage)
+  mbcinfo = locale ? locale->mbcinfo : get_mbcinfo();
+
+  if(mbcinfo->ismbcodepage)
   {
     unsigned int strc, cmpc;
     do {
@@ -886,8 +890,8 @@ int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
         return *cmp ? -1 : 0;
       if(!*cmp)
         return 1;
-      strc = _mbsnextc(str);
-      cmpc = _mbsnextc(cmp);
+      strc = _mbsnextc_l(str, locale);
+      cmpc = _mbsnextc_l(cmp, locale);
       if(strc != cmpc)
         return strc < cmpc ? -1 : 1;
       str +=(strc > 255) ? 2 : 1;
@@ -897,6 +901,14 @@ int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
   return u_strcmp(str, cmp); /* ASCII CP */
 }
 
+/*********************************************************************
+ *		_mbscmp(MSVCRT.@)
+ */
+int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp, MSVCRT__locale_t locale)
+{
+    return _mbscmp_l(str, cmp, NULL);
+}
+
 /*********************************************************************
  *              _mbsnbicoll_l(MSVCRT.@)
  */
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 9c049455af..6d6767b435 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -717,7 +717,7 @@
 @ cdecl _mbschr(str long)
 # stub _mbschr_l(str long ptr)
 @ cdecl _mbscmp(str str)
-# stub _mbscmp_l(str str ptr)
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy(ptr str)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index c617518988..6517995edd 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -115,6 +115,7 @@ static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
 static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
 static size_t (__cdecl *p___strncnt)(const char*, size_t);
 static unsigned int (__cdecl *p_mbsnextc_l)(const unsigned char*, _locale_t);
+static int (__cdecl *p_mbscmp_l)(const unsigned char*, const unsigned char*, _locale_t);
 
 int CDECL __STRINGTOLD(_LDOUBLE*, char**, const char*, int);
 
@@ -3725,6 +3726,15 @@ static void test__mbscmp(void)
 
     ret = _mbscmp(b, a);
     ok(ret == 1, "got %d\n", ret);
+
+    if (!p_mbscmp_l)
+    {
+        win_skip("_mbscmp_l tests\n");
+        return;
+    }
+
+    ret = p_mbscmp_l(a, b, NULL);
+    ok(ret == -1, "got %d\n", ret);
 }
 
 static void test__ismbclx(void)
@@ -4458,6 +4468,7 @@ START_TEST(string)
     p__memicmp_l = (void*)GetProcAddress(hMsvcrt, "_memicmp_l");
     p___strncnt = (void*)GetProcAddress(hMsvcrt, "__strncnt");
     p_mbsnextc_l = (void*)GetProcAddress(hMsvcrt, "_mbsnextc_l");
+    p_mbscmp_l = (void*)GetProcAddress(hMsvcrt, "_mbscmp_l");
 
     /* MSVCRT memcpy behaves like memmove for overlapping moves,
        MFC42 CString::Insert seems to rely on that behaviour */
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index ee06053a70..a6c30f9a15 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -614,7 +614,7 @@
 @ cdecl _mbschr(str long)
 @ stub _mbschr_l
 @ cdecl _mbscmp(str str)
-@ stub _mbscmp_l
+@ cdecl _mbscmp_l(str str ptr)
 @ cdecl _mbscoll(str str)
 @ cdecl _mbscoll_l(str str ptr)
 @ cdecl _mbscpy_s(ptr long str)
@@ -1184,7 +1184,7 @@
 @ cdecl _o__mbschr(str long) _mbschr
 @ stub _o__mbschr_l
 @ cdecl _o__mbscmp(str str) _mbscmp
-@ stub _o__mbscmp_l
+@ cdecl _o__mbscmp_l(str str ptr) _mbscmp_l
 @ cdecl _o__mbscoll(str str) _mbscoll
 @ cdecl _o__mbscoll_l(str str ptr) _mbscoll_l
 @ cdecl _o__mbscpy_s(ptr long str) _mbscpy_s
diff --git a/include/msvcrt/mbstring.h b/include/msvcrt/mbstring.h
index 82bc6f1aee..b3336a2fba 100644
--- a/include/msvcrt/mbstring.h
+++ b/include/msvcrt/mbstring.h
@@ -65,6 +65,7 @@ int            __cdecl _mbsbtype(const unsigned char*,size_t);
 unsigned char* __cdecl _mbscat(unsigned char*,const unsigned char*);
 unsigned char* __cdecl _mbschr(const unsigned char*,unsigned int);
 int            __cdecl _mbscmp(const unsigned char*,const unsigned char*);
+int            __cdecl _mbscmp_l(const unsigned char*,const unsigned char*,_locale_t);
 int            __cdecl _mbscoll(const unsigned char*,const unsigned char*);
 unsigned char* __cdecl _mbscpy(unsigned char*,const unsigned char*);
 size_t         __cdecl _mbscspn(const unsigned char*,const unsigned char*);




More information about the wine-cvs mailing list