Akihiro Sagawa : msvcrt: Reimplement _mbsspnp using _mbsspn.

Alexandre Julliard julliard at winehq.org
Mon Sep 2 14:50:19 CDT 2019


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Mon Sep  2 19:50:29 2019 +0200

msvcrt: Reimplement _mbsspnp using _mbsspn.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47693
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/mbcs.c         | 47 +++++++++++++++-------------------------------
 dlls/msvcrt/tests/string.c |  4 ++--
 2 files changed, 17 insertions(+), 34 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index cc2a9f2..6f965f5 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -2028,19 +2028,26 @@ int CDECL _mbsupr_s(unsigned char* s, MSVCRT_size_t len)
 MSVCRT_size_t CDECL _mbsspn(const unsigned char* string, const unsigned char* set)
 {
     const unsigned char *p, *q;
-    unsigned int pc, qc;
 
     for (p = string; *p; p++)
     {
-        pc = _mbsnextc(p);
         for (q = set; *q; q++)
         {
-            qc = _mbsnextc(q);
-            if (pc == qc) break;
-            if (qc > 255 && q[1]) q++;
+            if (_ismbblead(*q))
+            {
+                if (p[0] == q[0] && p[1] == q[1])
+                {
+                    p++;
+                    break;
+                }
+                q++;
+            }
+            else
+            {
+                if (p[0] == q[0]) break;
+            }
         }
         if (!*q) break;
-        if (pc > 255 && p[1]) p++;
     }
     return p - string;
 }
@@ -2050,32 +2057,8 @@ MSVCRT_size_t CDECL _mbsspn(const unsigned char* string, const unsigned char* se
  */
 unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned char* set)
 {
-    const unsigned char *p, *q;
-
-    for (p = string; *p; p++)
-    {
-        if (_ismbblead(*p))
-        {
-            for (q = set; *q; q += 2)
-            {
-                if (!q[1])
-                    break;
-                if ((*p == *q) &&  (p[1] == q[1]))
-                    break;
-            }
-            if (!q[0] || !q[1]) break;
-        }
-        else
-        {
-            for (q = set; *q; q++)
-                if (*p == *q)
-                    break;
-            if (!*q) break;
-        }
-    }
-    if (*p == '\0')
-        return NULL;
-    return (unsigned char *)p;
+    string += _mbsspn( string, set );
+    return *string ? (unsigned char*)string : NULL;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index ed459bc..b937f17 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -565,13 +565,13 @@ static void test_mbsspnp( void)
 
     _setmbcp( 932);
     ret=_mbsspnp( mbstr, mbset1);
-    todo_wine ok( ret==mbstr+8, "_mbsspnp returns %p should be %p\n", ret, mbstr+8);
+    ok( ret==mbstr+8, "_mbsspnp returns %p should be %p\n", ret, mbstr+8);
     ret=_mbsspnp( mbstr, mbset2);
     ok( ret==mbstr+1, "_mbsspnp returns %p should be %p\n", ret, mbstr+1);
     ret=_mbsspnp( mbstr+8, mbset1);
     ok( ret==mbstr+8, "_mbsspnp returns %p should be %p\n", ret, mbstr+8);
     ret=_mbsspnp( mbstr+8, mbset2);
-    todo_wine ok( ret==mbstr+10, "_mbsspnp returns %p should be %p\n", ret, mbstr+10);
+    ok( ret==mbstr+10, "_mbsspnp returns %p should be %p\n", ret, mbstr+10);
 
     _setmbcp( cp);
 }




More information about the wine-cvs mailing list