Module: wine Branch: refs/heads/master Commit: 2ec3b961355108176cb806797dc4836068d44c63 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=2ec3b961355108176cb80679...
Author: Alexandre Julliard julliard@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 )