Piotr Caban : msvcrt: Add _mbscspn_l implementation.

Alexandre Julliard julliard at winehq.org
Mon Oct 28 16:43:36 CDT 2019


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Oct 28 13:29:09 2019 +0100

msvcrt: Add _mbscspn_l implementation.

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 +-
 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                                 | 39 +++++++++++++++++-----
 dlls/msvcrt/msvcrt.spec                            |  2 +-
 dlls/msvcrt/tests/string.c                         | 18 ++++++++++
 dlls/ucrtbase/ucrtbase.spec                        |  2 +-
 10 files changed, 56 insertions(+), 17 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 059e366aea..f25dfb7d8f 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
@@ -101,7 +101,7 @@
 @ cdecl _mbscpy_s(ptr long str) ucrtbase._mbscpy_s
 @ cdecl _mbscpy_s_l(ptr long str ptr) ucrtbase._mbscpy_s_l
 @ cdecl _mbscspn(str str) ucrtbase._mbscspn
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr) ucrtbase._mbscspn_l
 @ cdecl _mbsdec(ptr ptr) ucrtbase._mbsdec
 @ stub _mbsdec_l
 @ cdecl _mbsdup(str) ucrtbase._mbsdup
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index b59e8cf5cc..63c3a9d8a0 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1108,7 +1108,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ cdecl _mbsicmp(str str)
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 0697029962..366c771746 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1465,7 +1465,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ cdecl _mbsicmp(str str)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 07ce01c90e..07ff5abdff 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1475,7 +1475,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ cdecl _mbsicmp(str str)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 1e03b4d4d9..14ed7f3553 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -780,7 +780,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ cdecl _mbsicmp(str str)
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index a8369cb6c6..acb976a7b0 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -758,7 +758,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ cdecl _mbsicmp(str str)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index ce98749e9f..6a62909128 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -156,11 +156,6 @@ static inline unsigned char *u__strnset( unsigned char *s, unsigned char c, MSVC
   return (unsigned char*) MSVCRT__strnset( (char*)s, c, len );
 }
 
-static inline MSVCRT_size_t u_strcspn( const unsigned char *s, const unsigned char *rej )
-{
-  return strcspn( (const char *)s, (const char*)rej );
-}
-
 /*********************************************************************
  *		__p__mbctype (MSVCRT.@)
  */
@@ -2073,13 +2068,39 @@ unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned char*
 }
 
 /*********************************************************************
- *		_mbscspn(MSVCRT.@)
+ *		_mbscspn_l (MSVCRT.@)
+ */
+MSVCRT_size_t CDECL _mbscspn_l(const unsigned char* str,
+        const unsigned char* cmp, MSVCRT__locale_t locale)
+{
+    const unsigned char *p, *q;
+
+    for (p = str; *p; p++)
+    {
+        for (q = cmp; *q; q++)
+        {
+            if (_ismbblead_l(*q, locale))
+            {
+                /* duplicate a bug in native implementation */
+                if (!q[1]) return 0;
+
+                if (p[0] == q[0] && p[1] == q[1])
+                    return p - str;
+                q++;
+            }
+            else if (p[0] == q[0])
+                return p - str;
+        }
+    }
+    return p - str;
+}
+
+/*********************************************************************
+ *		_mbscspn (MSVCRT.@)
  */
 MSVCRT_size_t CDECL _mbscspn(const unsigned char* str, const unsigned char* cmp)
 {
-  if (get_mbcinfo()->ismbcodepage)
-    FIXME("don't handle double character case\n");
-  return u_strcspn(str, cmp);
+    return _mbscspn_l(str, cmp, NULL);
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index e4fad75c18..b3b9cca0b9 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -724,7 +724,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-# stub _mbscspn_l(str str ptr)
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 # stub _mbsdec_l(ptr ptr ptr)
 @ cdecl _mbsdup(str) MSVCRT__strdup
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 0da7c52809..f83130fc26 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -553,6 +553,13 @@ static void test_mbsspn( void)
     ret=_mbsspn( str1, empty);
     ok( ret==0, "_mbsspn returns %d should be 0\n", ret);
 
+    ret=_mbscspn( str1, set);
+    ok( ret==0, "_mbscspn returns %d should be 0\n", ret);
+    ret=_mbscspn( str2, set);
+    ok( ret==4, "_mbscspn returns %d should be 4\n", ret);
+    ret=_mbscspn( str1, empty);
+    ok( ret==8, "_mbscspn returns %d should be 8\n", ret);
+
     _setmbcp( 932);
     ret=_mbsspn( mbstr, mbset1);
     ok( ret==8, "_mbsspn returns %d should be 8\n", ret);
@@ -565,6 +572,17 @@ static void test_mbsspn( void)
     ret=_mbsspn( mbstr, mbset3);
     ok( ret==14, "_mbsspn returns %d should be 14\n", ret);
 
+    ret=_mbscspn( mbstr, mbset1);
+    ok( ret==0, "_mbscspn returns %d should be 0\n", ret);
+    ret=_mbscspn( mbstr, mbset2);
+    ok( ret==0, "_mbscspn returns %d should be 0\n", ret);
+    ret=_mbscspn( mbstr+8, mbset1);
+    ok( ret==2, "_mbscspn returns %d should be 2\n", ret);
+    ret=_mbscspn( mbstr+8, mbset2);
+    ok( ret==0, "_mbscspn returns %d should be 0\n", ret);
+    ret=_mbscspn( mbstr, mbset3);
+    ok( ret==0, "_mbscspn returns %d should be 0\n", ret);
+
     _setmbcp( cp);
 }
 
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 7dfa9147d7..a262cc6345 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -620,7 +620,7 @@
 @ cdecl _mbscpy_s(ptr long str)
 @ cdecl _mbscpy_s_l(ptr long str ptr)
 @ cdecl _mbscspn(str str)
-@ stub _mbscspn_l
+@ cdecl _mbscspn_l(str str ptr)
 @ cdecl _mbsdec(ptr ptr)
 @ stub _mbsdec_l
 @ stub _mbsdup(str)




More information about the wine-cvs mailing list