Module: wine Branch: master Commit: ff7388ca3fe27d5910c161e7074ca89dbdeff54a URL: http://source.winehq.org/git/wine.git/?a=commit;h=ff7388ca3fe27d5910c161e707...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Apr 30 14:29:11 2013 +0200
msvcrt: Added _mbstok_s_l implementation.
---
dlls/msvcr100/msvcr100.spec | 6 +- dlls/msvcr110/msvcr110.spec | 6 +- dlls/msvcr80/msvcr80.spec | 6 +- dlls/msvcr90/msvcr90.spec | 6 +- dlls/msvcrt/mbcs.c | 94 ++++++++++++++++++++++++++++--------------- dlls/msvcrt/msvcrt.h | 1 + dlls/msvcrt/msvcrt.spec | 6 +- 7 files changed, 77 insertions(+), 48 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 52835cb..e60e0fb 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1183,9 +1183,9 @@ @ cdecl _mbsstr(str str) msvcrt._mbsstr @ stub _mbsstr_l @ cdecl _mbstok(str str) msvcrt._mbstok -@ stub _mbstok_l -@ stub _mbstok_s -@ stub _mbstok_s_l +@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l +@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s +@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 171bf37..9f36dad 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1545,9 +1545,9 @@ @ cdecl _mbsstr(str str) msvcrt._mbsstr @ stub _mbsstr_l @ cdecl _mbstok(str str) msvcrt._mbstok -@ stub _mbstok_l -@ stub _mbstok_s -@ stub _mbstok_s_l +@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l +@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s +@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index f45095e..a8490e1 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -854,9 +854,9 @@ @ cdecl _mbsstr(str str) msvcrt._mbsstr @ stub _mbsstr_l @ cdecl _mbstok(str str) msvcrt._mbstok -@ stub _mbstok_l -@ stub _mbstok_s -@ stub _mbstok_s_l +@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l +@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s +@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 140797d..9783c2f 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -832,9 +832,9 @@ @ cdecl _mbsstr(str str) msvcrt._mbsstr @ stub _mbsstr_l @ cdecl _mbstok(str str) msvcrt._mbstok -@ stub _mbstok_l -@ stub _mbstok_s -@ stub _mbstok_s_l +@ cdecl _mbstok_l(str str ptr) msvcrt._mbstok_l +@ cdecl _mbstok_s(str str ptr) msvcrt._mbstok_s +@ cdecl _mbstok_s_l(str str ptr ptr) msvcrt._mbstok_s_l @ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 3d50d6c..b70ffa0 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -145,11 +145,6 @@ static inline unsigned char *u_strrchr( const unsigned char *s, unsigned char x return (unsigned char*) strrchr( (const char*)s, x ); }
-static inline unsigned char *u_strtok( unsigned char *s, const unsigned char *delim ) -{ - return (unsigned char*) strtok( (char*)s, (const char*)delim ); -} - static inline unsigned char *u__strset( unsigned char *s, unsigned char c ) { return (unsigned char*) _strset( (char*)s, c); @@ -1090,38 +1085,71 @@ unsigned char* CDECL _mbsrchr(const unsigned char* s, unsigned int x) }
/********************************************************************* - * _mbstok(MSVCRT.@) - * - * Find and extract tokens from strings + * _mbstok_s_l(MSVCRT.@) */ -unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim) +unsigned char* CDECL _mbstok_s_l(unsigned char *str, const unsigned char *delim, + unsigned char **ctx, MSVCRT__locale_t locale) { - thread_data_t *data = msvcrt_get_thread_data(); - unsigned char *ret; + MSVCRT_pthreadmbcinfo mbcinfo; + unsigned int c;
- if(get_mbcinfo()->ismbcodepage) - { - unsigned int c; + if(!MSVCRT_CHECK_PMT(delim != NULL)) return NULL; + if(!MSVCRT_CHECK_PMT(ctx != NULL)) return NULL; + if(!MSVCRT_CHECK_PMT(str || *ctx)) return NULL; + + if(locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo();
- if (!str) - if (!(str = data->mbstok_next)) return NULL; + if(!mbcinfo->ismbcodepage) + return (unsigned char*)MSVCRT_strtok_s((char*)str, (const char*)delim, (char**)ctx);
- while ((c = _mbsnextc(str)) && _mbschr(delim, c)) { - str += c > 255 ? 2 : 1; - } - if (!*str) return NULL; - ret = str++; - while ((c = _mbsnextc(str)) && !_mbschr(delim, c)) { - str += c > 255 ? 2 : 1; - } - if (*str) { - *str++ = 0; - if (c > 255) *str++ = 0; - } - data->mbstok_next = str; - return ret; + if(!str) + str = *ctx; + + while((c=_mbsnextc(str)) && _mbschr(delim, c)) + str += c>255 ? 2 : 1; + if(!*str) + return NULL; + + *ctx = str + (c>255 ? 2 : 1); + while((c=_mbsnextc(*ctx)) && !_mbschr(delim, c)) + *ctx += c>255 ? 2 : 1; + if (**ctx) { + *(*ctx)++ = 0; + if(c > 255) + *(*ctx)++ = 0; } - return u_strtok(str, delim); /* ASCII CP */ + + return str; +} + + +/********************************************************************* + * _mbstok_s(MSVCRT.@) + */ +unsigned char* CDECL _mbstok_s(unsigned char *str, + const unsigned char *delim, unsigned char **ctx) +{ + return _mbstok_s_l(str, delim, ctx, NULL); +} + +/********************************************************************* + * _mbstok_l(MSVCRT.@) + */ +unsigned char* CDECL _mbstok_l(unsigned char *str, + const unsigned char *delim, MSVCRT__locale_t locale) +{ + return _mbstok_s_l(str, delim, &msvcrt_get_thread_data()->mbstok_next, locale); +} + +/********************************************************************* + * _mbstok(MSVCRT.@) + */ +unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim) +{ + return _mbstok_s_l(str, delim, &msvcrt_get_thread_data()->mbstok_next, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index b51ff81..35e9c7d 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -989,6 +989,7 @@ int __cdecl MSVCRT__tolower_l(int,MSVCRT__locale_t); int __cdecl MSVCRT__strnicoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t); int __cdecl MSVCRT__strncoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t); unsigned int __cdecl _get_output_format(void); +char* __cdecl MSVCRT_strtok_s(char*, const char*, char**);
/* Maybe one day we'll enable the invalid parameter handlers with the full set of information (msvcrXXd) * #define MSVCRT_INVALID_PMT(x) MSVCRT_call_invalid_parameter_handler(x, __FUNCTION__, __FILE__, __LINE__, 0) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 0af2423..43d3c45 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -808,9 +808,9 @@ @ cdecl _mbsstr(str str) # stub _mbsstr_l(str str ptr) @ cdecl _mbstok(str str) -# stub _mbstok_l(str str ptr) -# stub _mbstok_s(str str ptr) -# stub _mbstok_s_l(str str ptr ptr) +@ cdecl _mbstok_l(str str ptr) +@ cdecl _mbstok_s(str str ptr) +@ cdecl _mbstok_s_l(str str ptr ptr) @ cdecl _mbstowcs_l(ptr str long ptr) MSVCRT__mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) MSVCRT__mbstowcs_s_l @ cdecl _mbstrlen(str)