diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 88558752607..5796f353d9c 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1174,7 +1174,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 1937ffc9efb..cd54513a59e 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1531,7 +1531,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 462a42b719b..1bb81f3f257 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1542,7 +1542,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 822a43d5765..9dbe665cd02 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -846,7 +846,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 32075829392..391be34a624 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -824,7 +824,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 52b882a2fba..ba9e034cd0d 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -150,6 +150,11 @@ static inline unsigned char *u_strchr( const unsigned char *s, unsigned char x ) return (unsigned char*) strchr( (const char*)s, x ); } +static inline unsigned char* u_strpbrk(const unsigned char *str, const unsigned char *accept) +{ + return (unsigned char*)strpbrk((const char*)str, (const char*)accept); +} + static inline unsigned char *u_strrchr( const unsigned char *s, unsigned char x ) { return (unsigned char*) strrchr( (const char*)s, x ); @@ -2871,25 +2876,45 @@ unsigned char* CDECL _mbsrev(unsigned char* str) } /********************************************************************* - * _mbspbrk (MSVCRT.@) + * _mbspbrk_l (MSVCRT.@) */ -unsigned char* CDECL _mbspbrk(const unsigned char* str, const unsigned char* accept) +unsigned char* CDECL _mbspbrk_l(const unsigned char *str, + const unsigned char *accept, _locale_t locale) { const unsigned char* p; + pthreadmbcinfo mbcinfo; - while(*str) + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (!mbcinfo->ismbcodepage) + return u_strpbrk(str, accept); + + if (!MSVCRT_CHECK_PMT(str && accept)) + return NULL; + + while (*str) { - for(p = accept; *p; p += (_ismbblead(*p)?2:1) ) + for (p = accept; *p; p += (_ismbblead_l(*p, locale) ? 2 : 1)) { if (*p == *str) - if( !_ismbblead(*p) || ( *(p+1) == *(str+1) ) ) - return (unsigned char*)str; + if (!_ismbblead_l(*p, locale) || p[1] == str[1]) + return (unsigned char*)str; } - str += (_ismbblead(*str)?2:1); + str += (_ismbblead_l(*str, locale) ? 2 : 1); } return NULL; } +/********************************************************************* + * _mbspbrk (MSVCRT.@) + */ +unsigned char* CDECL _mbspbrk(const unsigned char *str, const unsigned char *accept) +{ + return _mbspbrk_l(str, accept, NULL); +} /* * Functions depending on locale codepage diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 430e0f9d5af..a40321b747a 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -795,7 +795,7 @@ # stub _mbsnset_s(ptr long long long) # stub _mbsnset_s_l(ptr long long long ptr) @ cdecl _mbspbrk(str str) -# stub _mbspbrk_l(str str ptr) +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 75f21a447c7..8b0420987de 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -690,7 +690,7 @@ @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) -@ stub _mbspbrk_l +@ cdecl _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @@ -1259,7 +1259,7 @@ @ stub _o__mbsnset_s @ stub _o__mbsnset_s_l @ cdecl _o__mbspbrk(str str) _mbspbrk -@ stub _o__mbspbrk_l +@ cdecl _o__mbspbrk_l(str str ptr) _mbspbrk_l @ cdecl _o__mbsrchr(str long) _mbsrchr @ cdecl _o__mbsrchr_l(str long ptr) _mbsrchr_l @ cdecl _o__mbsrev(str) _mbsrev