Alexandre Julliard : msvcrt: Make strtok and wcstok thread-safe by using the per-thread data.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Jan 14 10:56:38 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 2ec3b961355108176cb806797dc4836068d44c63
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=2ec3b961355108176cb806797dc4836068d44c63

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Jan 14 17:24:49 2006 +0100

msvcrt: Make strtok and wcstok thread-safe by using the per-thread data.

---

 dlls/msvcrt/msvcrt.h    |    2 ++
 dlls/msvcrt/msvcrt.spec |    4 ++--
 dlls/msvcrt/string.c    |   21 +++++++++++++++++++++
 dlls/msvcrt/wcs.c       |   21 +++++++++++++++++++++
 4 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index badea9e..9923def 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -93,7 +93,9 @@ extern DWORD msvcrt_tls_index;
 struct __thread_data {
     int                             thread_errno;
     unsigned long                   thread_doserrno;
+    char                           *strtok_next;        /* next ptr for strtok() */
     unsigned char                  *mbstok_next;        /* next ptr for mbstok() */
+    MSVCRT_wchar_t                 *wcstok_next;        /* next ptr for wcstok() */
     char                           *efcvt_buffer;       /* buffer for ecvt/fcvt */
     char                           *asctime_buffer;     /* buffer for asctime */
     MSVCRT_wchar_t                 *wasctime_buffer;    /* buffer for wasctime */
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 6d496fd..4620dff 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -714,7 +714,7 @@
 @ cdecl strspn(str str)
 @ cdecl strstr(str str)
 @ cdecl strtod(str ptr)
-@ cdecl strtok(str str)
+@ cdecl strtok(str str) MSVCRT_strtok
 @ cdecl strtol(str ptr long)
 @ cdecl strtoul(str ptr long)
 @ cdecl strxfrm(ptr str long)
@@ -754,7 +754,7 @@
 @ cdecl wcsspn(wstr wstr) ntdll.wcsspn
 @ cdecl wcsstr(wstr wstr) ntdll.wcsstr
 @ cdecl wcstod(wstr ptr) MSVCRT_wcstod
-@ cdecl wcstok(wstr wstr) ntdll.wcstok
+@ cdecl wcstok(wstr wstr) MSVCRT_wcstok
 @ cdecl wcstol(wstr ptr long) ntdll.wcstol
 @ cdecl wcstombs(ptr ptr long) ntdll.wcstombs
 @ cdecl wcstoul(wstr ptr long) ntdll.wcstoul
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 8797ce4..057dbf8 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -97,6 +97,27 @@ char* _strset(char* str, int value)
 }
 
 /*********************************************************************
+ *		strtok  (MSVCRT.@)
+ */
+char *MSVCRT_strtok( char *str, const char *delim )
+{
+    thread_data_t *data = msvcrt_get_thread_data();
+    char *ret;
+
+    if (!str)
+        if (!(str = data->strtok_next)) return NULL;
+
+    while (*str && strchr( delim, *str )) str++;
+    if (!*str) return NULL;
+    ret = str++;
+    while (*str && !strchr( delim, *str )) str++;
+    if (*str) *str++ = 0;
+    data->strtok_next = str;
+    return ret;
+}
+
+
+/*********************************************************************
  *		_swab (MSVCRT.@)
  */
 void MSVCRT__swab(char* src, char* dst, int len)
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index db86437..2a48003 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -825,6 +825,27 @@ MSVCRT_wchar_t* MSVCRT_wcspbrk( const MS
 }
 
 /*********************************************************************
+ *		wcstok  (MSVCRT.@)
+ */
+MSVCRT_wchar_t *MSVCRT_wcstok( MSVCRT_wchar_t *str, const MSVCRT_wchar_t *delim )
+{
+    thread_data_t *data = msvcrt_get_thread_data();
+    MSVCRT_wchar_t *ret;
+
+    if (!str)
+        if (!(str = data->wcstok_next)) return NULL;
+
+    while (*str && strchrW( delim, *str )) str++;
+    if (!*str) return NULL;
+    ret = str++;
+    while (*str && !strchrW( delim, *str )) str++;
+    if (*str) *str++ = 0;
+    data->wcstok_next = str;
+    return ret;
+}
+
+
+/*********************************************************************
  *		wctomb (MSVCRT.@)
  */
 INT MSVCRT_wctomb( char *dst, MSVCRT_wchar_t ch )




More information about the wine-cvs mailing list