[PATCH 2/3] libwine: Create strtok_sW()

Aaro Altonen a.altonen at hotmail.com
Sun Mar 15 08:00:41 CDT 2020


Implement strtok() utility function for wide char strings
that is globally available like strlenW() and lstrcpyW()

Signed-off-by: Aaro Altonen <a.altonen at hotmail.com>
---
 dlls/msvcrt/wcs.c      | 16 +---------------
 include/wine/unicode.h |  1 +
 libs/port/string.c     | 19 +++++++++++++++++++
 3 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 17d06eed3c..2ad6ed92bf 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1616,21 +1616,7 @@ MSVCRT_wchar_t* CDECL MSVCRT_wcspbrk( const MSVCRT_wchar_t* str, const MSVCRT_wc
 MSVCRT_wchar_t * CDECL MSVCRT_wcstok_s( MSVCRT_wchar_t *str, const MSVCRT_wchar_t *delim,
                                  MSVCRT_wchar_t **next_token )
 {
-    MSVCRT_wchar_t *ret;
-
-    if (!MSVCRT_CHECK_PMT(delim != NULL)) return NULL;
-    if (!MSVCRT_CHECK_PMT(next_token != NULL)) return NULL;
-    if (!MSVCRT_CHECK_PMT(str != NULL || *next_token != NULL)) return NULL;
-
-    if (!str) str = *next_token;
-
-    while (*str && strchrW( delim, *str )) str++;
-    if (!*str) return NULL;
-    ret = str++;
-    while (*str && !strchrW( delim, *str )) str++;
-    if (*str) *str++ = 0;
-    *next_token = str;
-    return ret;
+    return strtok_sW(str, delim, next_token);
 }
 
 /*********************************************************************
diff --git a/include/wine/unicode.h b/include/wine/unicode.h
index 8d30e9f447..3ee98c611d 100644
--- a/include/wine/unicode.h
+++ b/include/wine/unicode.h
@@ -89,6 +89,7 @@ extern int sprintfW( WCHAR *str, const WCHAR *format, ... );
 extern int snprintfW( WCHAR *str, size_t len, const WCHAR *format, ... );
 extern int vsprintfW( WCHAR *str, const WCHAR *format, va_list valist );
 extern int vsnprintfW( WCHAR *str, size_t len, const WCHAR *format, va_list valist );
+extern WCHAR *strtok_sW( WCHAR *str, const WCHAR *delim, WCHAR **saveptr );
 
 WINE_UNICODE_INLINE WCHAR tolowerW( WCHAR ch )
 {
diff --git a/libs/port/string.c b/libs/port/string.c
index c3388bcc7d..ceb5ab67cf 100644
--- a/libs/port/string.c
+++ b/libs/port/string.c
@@ -528,3 +528,22 @@ int sprintfW( WCHAR *str, const WCHAR *format, ...)
     va_end(valist);
     return retval;
 }
+
+WCHAR *strtok_sW(WCHAR *str, const WCHAR *delim, WCHAR **saveptr)
+{
+    WCHAR *ret;
+
+    if (delim == NULL) return NULL;
+    if (saveptr == NULL) return NULL;
+    if (str == NULL && *saveptr == NULL) return NULL;
+
+    if (!str) str = *saveptr;
+
+    while (*str && strchrW( delim, *str )) str++;
+    if (!*str) return NULL;
+    ret = str++;
+    while (*str && !strchrW( delim, *str )) str++;
+    if (*str) *str++ = 0;
+    *saveptr = str;
+    return ret;
+}
-- 
2.25.1




More information about the wine-devel mailing list