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