Module: wine Branch: master Commit: 31c57484ab5927fa61489fb607aeb023e9fb1b1b URL: https://source.winehq.org/git/wine.git/?a=commit;h=31c57484ab5927fa61489fb60...
Author: Daniel Lehman dlehman25@gmail.com Date: Thu Jan 23 21:51:22 2020 -0800
ucrtbase: Use given context in wcstok.
Signed-off-by: Daniel Lehman dlehman25@gmail.com Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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