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