From 225dad5d0d52792841f7220e2129085a7a6dd60b Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Mon, 28 Oct 2019 13:29:09 +0100 Subject: [PATCH] msvcrt: Add _mbscspn_l implementation. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- .../api-ms-win-crt-multibyte-l1-1-0.spec | 2 +- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 39 ++++++++++++++----- dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/tests/string.c | 18 +++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 10 files changed, 56 insertions(+), 17 deletions(-) diff --git a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec index 059e366aea9..f25dfb7d8f5 100644 --- a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec +++ b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec @@ -101,7 +101,7 @@ @ cdecl _mbscpy_s(ptr long str) ucrtbase._mbscpy_s @ cdecl _mbscpy_s_l(ptr long str ptr) ucrtbase._mbscpy_s_l @ cdecl _mbscspn(str str) ucrtbase._mbscspn -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) ucrtbase._mbscspn_l @ cdecl _mbsdec(ptr ptr) ucrtbase._mbsdec @ stub _mbsdec_l @ cdecl _mbsdup(str) ucrtbase._mbsdup diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index b59e8cf5cca..63c3a9d8a06 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1108,7 +1108,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ cdecl _mbsicmp(str str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 06970299628..366c7717463 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1465,7 +1465,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ cdecl _mbsicmp(str str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 07ce01c90e1..07ff5abdff5 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1475,7 +1475,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ cdecl _mbsicmp(str str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 1e03b4d4d90..14ed7f35532 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -780,7 +780,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ cdecl _mbsicmp(str str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index a8369cb6c60..acb976a7b02 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -758,7 +758,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ cdecl _mbsicmp(str str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index ce98749e9fd..6a62909128d 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -156,11 +156,6 @@ static inline unsigned char *u__strnset( unsigned char *s, unsigned char c, MSVC return (unsigned char*) MSVCRT__strnset( (char*)s, c, len ); } -static inline MSVCRT_size_t u_strcspn( const unsigned char *s, const unsigned char *rej ) -{ - return strcspn( (const char *)s, (const char*)rej ); -} - /********************************************************************* * __p__mbctype (MSVCRT.@) */ @@ -2073,13 +2068,39 @@ unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned char* } /********************************************************************* - * _mbscspn(MSVCRT.@) + * _mbscspn_l (MSVCRT.@) + */ +MSVCRT_size_t CDECL _mbscspn_l(const unsigned char* str, + const unsigned char* cmp, MSVCRT__locale_t locale) +{ + const unsigned char *p, *q; + + for (p = str; *p; p++) + { + for (q = cmp; *q; q++) + { + if (_ismbblead_l(*q, locale)) + { + /* duplicate a bug in native implementation */ + if (!q[1]) return 0; + + if (p[0] == q[0] && p[1] == q[1]) + return p - str; + q++; + } + else if (p[0] == q[0]) + return p - str; + } + } + return p - str; +} + +/********************************************************************* + * _mbscspn (MSVCRT.@) */ MSVCRT_size_t CDECL _mbscspn(const unsigned char* str, const unsigned char* cmp) { - if (get_mbcinfo()->ismbcodepage) - FIXME("don't handle double character case\n"); - return u_strcspn(str, cmp); + return _mbscspn_l(str, cmp, NULL); } /********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e4fad75c187..b3b9cca0b97 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -724,7 +724,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -# stub _mbscspn_l(str str ptr) +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) # stub _mbsdec_l(ptr ptr ptr) @ cdecl _mbsdup(str) MSVCRT__strdup diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index 0da7c528096..f83130fc26e 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -553,6 +553,13 @@ static void test_mbsspn( void) ret=_mbsspn( str1, empty); ok( ret==0, "_mbsspn returns %d should be 0\n", ret); + ret=_mbscspn( str1, set); + ok( ret==0, "_mbscspn returns %d should be 0\n", ret); + ret=_mbscspn( str2, set); + ok( ret==4, "_mbscspn returns %d should be 4\n", ret); + ret=_mbscspn( str1, empty); + ok( ret==8, "_mbscspn returns %d should be 8\n", ret); + _setmbcp( 932); ret=_mbsspn( mbstr, mbset1); ok( ret==8, "_mbsspn returns %d should be 8\n", ret); @@ -565,6 +572,17 @@ static void test_mbsspn( void) ret=_mbsspn( mbstr, mbset3); ok( ret==14, "_mbsspn returns %d should be 14\n", ret); + ret=_mbscspn( mbstr, mbset1); + ok( ret==0, "_mbscspn returns %d should be 0\n", ret); + ret=_mbscspn( mbstr, mbset2); + ok( ret==0, "_mbscspn returns %d should be 0\n", ret); + ret=_mbscspn( mbstr+8, mbset1); + ok( ret==2, "_mbscspn returns %d should be 2\n", ret); + ret=_mbscspn( mbstr+8, mbset2); + ok( ret==0, "_mbscspn returns %d should be 0\n", ret); + ret=_mbscspn( mbstr, mbset3); + ok( ret==0, "_mbscspn returns %d should be 0\n", ret); + _setmbcp( cp); } diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7dfa9147d74..a262cc63459 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -620,7 +620,7 @@ @ cdecl _mbscpy_s(ptr long str) @ cdecl _mbscpy_s_l(ptr long str ptr) @ cdecl _mbscspn(str str) -@ stub _mbscspn_l +@ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) @ stub _mbsdec_l @ stub _mbsdup(str)