Daniel Lehman : ucrtbase: Use given context in wcstok.

Alexandre Julliard julliard at winehq.org
Fri Jan 24 16:14:12 CST 2020


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

Author: Daniel Lehman <dlehman25 at gmail.com>
Date:   Thu Jan 23 21:51:22 2020 -0800

ucrtbase: Use given context in wcstok.

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

---

 .../api-ms-win-crt-string-l1-1-0.spec              |  2 +-
 dlls/msvcrt/wcs.c                                  |  9 +++++++
 dlls/ucrtbase/tests/string.c                       | 30 ++++++++++++++++++++++
 dlls/ucrtbase/ucrtbase.spec                        |  2 +-
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
index ead56fbcb5..0dae2a8233 100644
--- a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec
@@ -170,7 +170,7 @@
 @ cdecl wcsnlen(wstr long) ucrtbase.wcsnlen
 @ cdecl wcspbrk(wstr wstr) ucrtbase.wcspbrk
 @ cdecl wcsspn(wstr wstr) ucrtbase.wcsspn
-@ cdecl wcstok(wstr wstr) ucrtbase.wcstok
+@ cdecl wcstok(wstr wstr ptr) ucrtbase.wcstok
 @ cdecl wcstok_s(ptr wstr ptr) ucrtbase.wcstok_s
 @ cdecl wcsxfrm(ptr wstr long) ucrtbase.wcsxfrm
 @ cdecl wctype(str) ucrtbase.wctype
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 1abe28b7d9..8411048204 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1630,10 +1630,19 @@ MSVCRT_wchar_t * CDECL MSVCRT_wcstok_s( MSVCRT_wchar_t *str, const MSVCRT_wchar_
 /*********************************************************************
  *		wcstok  (MSVCRT.@)
  */
+#if _MSVCR_VER>=140
+MSVCRT_wchar_t * CDECL MSVCRT_wcstok( MSVCRT_wchar_t *str, const MSVCRT_wchar_t *delim, MSVCRT_wchar_t **ctx )
+{
+    if (!ctx)
+        ctx = &msvcrt_get_thread_data()->wcstok_next;
+    return MSVCRT_wcstok_s(str, delim, ctx);
+}
+#else
 MSVCRT_wchar_t * CDECL MSVCRT_wcstok( MSVCRT_wchar_t *str, const MSVCRT_wchar_t *delim )
 {
     return MSVCRT_wcstok_s(str, delim, &msvcrt_get_thread_data()->wcstok_next);
 }
+#endif
 
 /*********************************************************************
  *		_wctomb_s_l (MSVCRT.@)
diff --git a/dlls/ucrtbase/tests/string.c b/dlls/ucrtbase/tests/string.c
index 7a2cf06a90..c0b2336322 100644
--- a/dlls/ucrtbase/tests/string.c
+++ b/dlls/ucrtbase/tests/string.c
@@ -89,6 +89,7 @@ static void (__cdecl *p__free_locale)(_locale_t);
 static int (__cdecl *p__getmbcp)(void);
 static int (__cdecl *p__setmbcp)(int);
 static size_t (__cdecl *p__mbsspn)(const unsigned char*, const unsigned char*);
+static wchar_t* (__cdecl *p_wcstok)(wchar_t*, const wchar_t*, wchar_t**);
 
 static BOOL init(void)
 {
@@ -122,6 +123,7 @@ static BOOL init(void)
     p__getmbcp = (void*)GetProcAddress(module, "_getmbcp");
     p__setmbcp = (void*)GetProcAddress(module, "_setmbcp");
     p__mbsspn = (void*)GetProcAddress(module, "_mbsspn");
+    p_wcstok = (void*)GetProcAddress(module, "wcstok");
     return TRUE;
 }
 
@@ -456,6 +458,33 @@ static void test_mbsspn( void)
     p__setmbcp(cp);
 }
 
+static void test_wcstok(void)
+{
+    static const wchar_t *input = L"two words";
+    wchar_t buffer[16];
+    wchar_t *token;
+    wchar_t *next;
+
+    next = NULL;
+    wcscpy(buffer, input);
+    token = p_wcstok(buffer, L" ", &next);
+    ok(!wcscmp(L"two", token), "expected \"two\", got \"%ls\"\n", token);
+    ok(next == token + 4, "expected %p, got %p\n", token + 4, next);
+    token = p_wcstok(NULL, L" ", &next);
+    ok(!wcscmp(L"words", token), "expected \"words\", got \"%ls\"\n", token);
+    ok(next == token + 5, "expected %p, got %p\n", token + 5, next);
+    token = p_wcstok(NULL, L" ", &next);
+    ok(!token, "expected NULL, got %p\n", token);
+
+    wcscpy(buffer, input);
+    token = p_wcstok(buffer, L" ", NULL);
+    ok(!wcscmp(L"two", token), "expected \"two\", got \"%ls\"\n", token);
+    token = p_wcstok(NULL, L" ", NULL);
+    ok(!wcscmp(L"words", token), "expected \"words\", got \"%ls\"\n", token);
+    token = p_wcstok(NULL, L" ", NULL);
+    ok(!token, "expected NULL, got %p\n", token);
+}
+
 START_TEST(string)
 {
     if (!init()) return;
@@ -465,4 +494,5 @@ START_TEST(string)
     test___strncnt();
     test_C_locale();
     test_mbsspn();
+    test_wcstok();
 }
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index dc95824a1f..93a75248bf 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2579,7 +2579,7 @@
 @ cdecl wcstod(wstr ptr) MSVCRT_wcstod
 @ cdecl wcstof(ptr ptr) MSVCRT_wcstof
 @ stub wcstoimax
-@ cdecl wcstok(wstr wstr) MSVCRT_wcstok
+@ cdecl wcstok(wstr wstr ptr) MSVCRT_wcstok
 @ cdecl wcstok_s(ptr wstr ptr) MSVCRT_wcstok_s
 @ cdecl wcstol(wstr ptr long) MSVCRT_wcstol
 @ stub wcstold




More information about the wine-cvs mailing list