From 2ec3b961355108176cb806797dc4836068d44c63 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sat, 14 Jan 2006 17:24:49 +0100 Subject: [PATCH] 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 badea9ed346..9923deff459 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 6d496fdb4ef..4620dff955c 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 8797ce40080..057dbf80c1d 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -96,6 +96,27 @@ char* _strset(char* str, int value) return str; } +/********************************************************************* + * 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.@) */ diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c index db864378fc4..2a480038797 100644 --- a/dlls/msvcrt/wcs.c +++ b/dlls/msvcrt/wcs.c @@ -824,6 +824,27 @@ MSVCRT_wchar_t* MSVCRT_wcspbrk( const MSVCRT_wchar_t* str, const MSVCRT_wchar_t* return NULL; } +/********************************************************************* + * 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.@) */