Piotr Caban : msvcrt: Don't use strcspn from C-library.

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


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

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

msvcrt: Don't use strcspn from C-library.

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

---

 dlls/msvcrt/string.c       | 16 +++++++++++++++-
 dlls/msvcrt/tests/string.c | 24 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 92228a0da6..038463c319 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -2047,7 +2047,21 @@ int __cdecl MSVCRT__memicmp(const char *s1, const char *s2, MSVCRT_size_t len)
  */
 MSVCRT_size_t __cdecl MSVCRT_strcspn(const char *str, const char *reject)
 {
-    return strcspn( str, reject );
+    BOOL rejects[256];
+    const char *p;
+
+    memset(rejects, 0, sizeof(rejects));
+
+    p = reject;
+    while(*p)
+    {
+        rejects[(unsigned char)*p] = TRUE;
+        p++;
+    }
+
+    p = str;
+    while(*p && !rejects[(unsigned char)*p]) p++;
+    return p - str;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 573289d77b..0da7c52809 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -159,6 +159,29 @@ static void test_swab( void ) {
     ok(memcmp(to,expected3,testsize) == 0, "Testing small size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
 }
 
+static void test_strcspn(void)
+{
+    static const struct {
+        const char *str;
+        const char *rej;
+        int ret;
+    } tests[] = {
+        { "test", "a", 4 },
+        { "test", "e", 1 },
+        { "test", "", 4 },
+        { "", "a", 0 },
+        { "a\xf1", "\xf1", 1 }
+    };
+    int r, i;
+
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
+    {
+        r = strcspn(tests[i].str, tests[i].rej);
+        ok(r == tests[i].ret, "strcspn(\"%s\", \"%s\") = %d, expected %d\n",
+                tests[i].str, tests[i].rej, r, tests[i].ret);
+    }
+}
+
 #if 0      /* use this to generate more tests */
 
 static void test_codepage(int cp)
@@ -3935,6 +3958,7 @@ START_TEST(string)
     /* run tolower tests first */
     test_tolower();
     test_swab();
+    test_strcspn();
     test_mbcp();
     test_mbsspn();
     test_mbsspnp();




More information about the wine-cvs mailing list