-- v5: msvcrt: Add _mblen_l implementation. msvcrt: Add _mbsset_l implementation. msvcrt: Add _mbsrev_l implementation. msvcrt: Add _mbsncmp_l implementation. msvcrt: Add __iswcsymf implementation. msvcrt: Add __iswcsym implementation. msvcrt: Add _mbspbrk_l implementation.
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- 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 | 35 ++++++++++++++++++++++++++++------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 36 insertions(+), 15 deletions(-)
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..03537a0ebe3 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,41 @@ 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
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/ctype.c | 8 ++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 8 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 5796f353d9c..6e0148d1b6b 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -598,7 +598,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf # extern __lconv @ cdecl __lconv_init() diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index cd54513a59e..c92c984748f 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -946,7 +946,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind # extern __lconv diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 1bb81f3f257..5c525f8d1af 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -937,7 +937,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind # extern __lconv diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 591a25f3cce..1b11b90da92 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -914,7 +914,7 @@ @ cdecl __isascii(long) msvcr120.__isascii @ cdecl __iscsym(long) msvcr120.__iscsym @ cdecl __iscsymf(long) msvcr120.__iscsymf -@ stub __iswcsym +@ cdecl __iswcsym(long) msvcr120.__iswcsym @ stub __iswcsymf @ stdcall -arch=arm __jump_unwind(ptr ptr) msvcr120.__jump_unwind # extern __lconv diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 9dbe665cd02..22fdab9bacd 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -237,7 +237,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf # extern __lc_clike @ extern __lc_codepage MSVCRT___lc_codepage diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 391be34a624..67f6cc77c46 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -226,7 +226,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf # extern __lc_clike @ extern __lc_codepage MSVCRT___lc_codepage diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c index 5a7d3450eda..7e12841c91f 100644 --- a/dlls/msvcrt/ctype.c +++ b/dlls/msvcrt/ctype.c @@ -452,6 +452,14 @@ int CDECL __iscsymf(int c) return (c < 127 && (isalpha(c) || c == '_')); }
+/********************************************************************* + * __iswcsym (MSVCRT.@) + */ +int CDECL __iswcsym(wint_t c) +{ + return (iswalnum(c) || c == '_'); +} + /********************************************************************* * _toupper_l (MSVCRT.@) */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 8b0420987de..f010f3eee37 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -99,7 +99,7 @@ @ cdecl __isascii(long) @ cdecl __iscsym(long) @ cdecl __iscsymf(long) -@ stub __iswcsym +@ cdecl __iswcsym(long) @ stub __iswcsymf @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind @ cdecl -arch=i386 -norelay __libm_sse2_acos()
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/ctype.c | 8 ++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 8 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 6e0148d1b6b..de6265dbeff 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -599,7 +599,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) # extern __lconv @ cdecl __lconv_init() @ cdecl -arch=i386 -norelay __libm_sse2_acos() diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index c92c984748f..8db709f894f 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -947,7 +947,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind # extern __lconv @ cdecl __lconv_init() diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 5c525f8d1af..6aae69fdea4 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -938,7 +938,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind # extern __lconv @ cdecl __lconv_init() diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 1b11b90da92..2b2949cdc66 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -915,7 +915,7 @@ @ cdecl __iscsym(long) msvcr120.__iscsym @ cdecl __iscsymf(long) msvcr120.__iscsymf @ cdecl __iswcsym(long) msvcr120.__iswcsym -@ stub __iswcsymf +@ cdecl __iswcsymf(long) msvcr120.__iswcsymf @ stdcall -arch=arm __jump_unwind(ptr ptr) msvcr120.__jump_unwind # extern __lconv @ cdecl __lconv_init() msvcr120.__lconv_init diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 22fdab9bacd..509343870a4 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -238,7 +238,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) # extern __lc_clike @ extern __lc_codepage MSVCRT___lc_codepage @ extern __lc_collate_cp MSVCRT___lc_collate_cp diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 67f6cc77c46..119aa34c55f 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -227,7 +227,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) # extern __lc_clike @ extern __lc_codepage MSVCRT___lc_codepage @ extern __lc_collate_cp MSVCRT___lc_collate_cp diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c index 7e12841c91f..a1805324c1f 100644 --- a/dlls/msvcrt/ctype.c +++ b/dlls/msvcrt/ctype.c @@ -460,6 +460,14 @@ int CDECL __iswcsym(wint_t c) return (iswalnum(c) || c == '_'); }
+/********************************************************************* + * __iswcsymf (MSVCRT.@) + */ +int CDECL __iswcsymf(wint_t c) +{ + return (iswalpha(c) || c == '_'); +} + /********************************************************************* * _toupper_l (MSVCRT.@) */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index f010f3eee37..7e02dd203c6 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -100,7 +100,7 @@ @ cdecl __iscsym(long) @ cdecl __iscsymf(long) @ cdecl __iswcsym(long) -@ stub __iswcsymf +@ cdecl __iswcsymf(long) @ stdcall -arch=arm __jump_unwind(ptr ptr) ntdll.__jump_unwind @ cdecl -arch=i386 -norelay __libm_sse2_acos() @ cdecl -arch=i386 -norelay __libm_sse2_acosf()
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- 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 | 59 +++++++++++++++++++++++-------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 45 insertions(+), 30 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index de6265dbeff..3c901f0345b 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1152,7 +1152,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 8db709f894f..b633d20e713 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1509,7 +1509,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 6aae69fdea4..a5fdb346323 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1520,7 +1520,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 509343870a4..d842d4362f1 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -824,7 +824,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 119aa34c55f..2334b07957a 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -802,7 +802,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 03537a0ebe3..65a2e6727a3 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1225,34 +1225,49 @@ int CDECL _mbsicmp(const unsigned char* str, const unsigned char* cmp) }
/********************************************************************* - * _mbsncmp(MSVCRT.@) + * _mbsncmp_l(MSVCRT.@) */ -int CDECL _mbsncmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsncmp_l(const unsigned char* str, const unsigned char* cmp, size_t len, _locale_t locale) { - if(!len) - return 0; - - if(get_mbcinfo()->ismbcodepage) - { + pthreadmbcinfo mbcinfo; unsigned int strc, cmpc; - while(len--) + + if (!len) + return 0; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (!mbcinfo->ismbcodepage) + return u_strncmp(str, cmp, len); /* ASCII CP */ + + if (!MSVCRT_CHECK_PMT(str && cmp)) + return _NLSCMPERROR; + while (len--) { - int inc; - if(!*str) - return *cmp ? -1 : 0; - if(!*cmp) - return 1; - strc = _mbsnextc(str); - cmpc = _mbsnextc(cmp); - if(strc != cmpc) - return strc < cmpc ? -1 : 1; - inc=(strc > 255) ? 2 : 1; /* Equal, use same increment */ - str += inc; - cmp += inc; + int inc; + if (!*str) + return *cmp ? -1 : 0; + if (!*cmp) + return 1; + strc = _mbsnextc_l(str, locale); + cmpc = _mbsnextc_l(cmp, locale); + if (strc != cmpc) + return strc < cmpc ? -1 : 1; + inc = (strc > 255) ? 2 : 1; /* Equal, use same increment */ + str += inc; + cmp += inc; } return 0; /* Matched len chars */ - } - return u_strncmp(str, cmp, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsncmp(MSVCRT.@) + */ +int CDECL _mbsncmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsncmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a40321b747a..b9947d4e885 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -773,7 +773,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -# stub _mbsncmp_l(str str long ptr) +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) # stub _mbsncoll_l(str str long ptr) @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7e02dd203c6..e0174dd897c 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -668,7 +668,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) @@ -1237,7 +1237,7 @@ @ cdecl _o__mbsnccnt(str long) _mbsnccnt @ cdecl _o__mbsnccnt_l(str long ptr) _mbsnccnt_l @ cdecl _o__mbsncmp(str str long) _mbsncmp -@ stub _o__mbsncmp_l +@ cdecl _o__mbsncmp_l(str str long ptr) _mbsncmp_l @ stub _o__mbsncoll @ stub _o__mbsncoll_l @ cdecl _o__mbsncpy(ptr str long) _mbsncpy
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- 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 | 64 ++++++++++++++++++++++++++----------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 53 insertions(+), 27 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 3c901f0345b..30fbd397131 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1178,7 +1178,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b633d20e713..aaff43ea736 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1535,7 +1535,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index a5fdb346323..df0ea4c24da 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1546,7 +1546,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index d842d4362f1..687a73b5d8a 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -850,7 +850,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 2334b07957a..38ffcc7ca22 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -828,7 +828,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 65a2e6727a3..02337c46ef5 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -160,6 +160,11 @@ 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__strrev(unsigned char *str) +{ + return (unsigned char*)_strrev((char *)str); +} + static inline unsigned char *u__strset( unsigned char *s, unsigned char c ) { return (unsigned char*) _strset( (char*)s, c); @@ -2844,52 +2849,73 @@ size_t CDECL _mbscspn(const unsigned char* str, const unsigned char* cmp) }
/********************************************************************* - * _mbsrev (MSVCRT.@) + * _mbsrev_l (MSVCRT.@) */ -unsigned char* CDECL _mbsrev(unsigned char* str) +unsigned char* CDECL _mbsrev_l(unsigned char* str, _locale_t locale) { - int i, len = _mbslen(str); - unsigned char *p, *temp=malloc(len*2); + int i, len; + unsigned char *p, *temp; + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(str)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (!mbcinfo->ismbcodepage) + return u__strrev(str);
- if(!temp) + len = _mbslen_l(str, locale); + temp = malloc(len * 2); + if (!temp) return str;
/* unpack multibyte string to temp buffer */ - p=str; - for(i=0; i<len; i++) + p = str; + for (i = 0; i < len; i++) { - if (_ismbblead(*p)) + if (_ismbblead_l(*p, locale)) { - temp[i*2]=*p++; - temp[i*2+1]=*p++; + temp[i * 2] = *p++; + temp[i * 2 + 1] = *p++; } else { - temp[i*2]=*p++; - temp[i*2+1]=0; + temp[i * 2] = *p++; + temp[i * 2 + 1] = 0; } }
/* repack it in the reverse order */ - p=str; - for(i=len-1; i>=0; i--) + p = str; + for (i = len - 1; i >= 0; i--) { - if(_ismbblead(temp[i*2])) + if (_ismbblead_l(temp[i * 2], locale)) { - *p++=temp[i*2]; - *p++=temp[i*2+1]; + *p++ = temp[i * 2]; + *p++ = temp[i * 2 + 1]; } else { - *p++=temp[i*2]; + *p++ = temp[i * 2]; } }
free(temp); - return str; }
+/********************************************************************* + * _mbsrev (MSVCRT.@) + */ +unsigned char* CDECL _mbsrev(unsigned char* str) +{ + return _mbsrev_l(str, NULL); +} + /********************************************************************* * _mbspbrk_l (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index b9947d4e885..a52016e6298 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -799,7 +799,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -# stub _mbsrev_l(str ptr) +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) # stub _mbsset_l(ptr long ptr) # stub _mbsset_s(ptr long long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index e0174dd897c..1f99c65ef05 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -694,7 +694,7 @@ @ cdecl _mbsrchr(str long) @ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) -@ stub _mbsrev_l +@ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) @ stub _mbsset_l @ stub _mbsset_s @@ -1263,7 +1263,7 @@ @ cdecl _o__mbsrchr(str long) _mbsrchr @ cdecl _o__mbsrchr_l(str long ptr) _mbsrchr_l @ cdecl _o__mbsrev(str) _mbsrev -@ stub _o__mbsrev_l +@ cdecl _o__mbsrev_l(str ptr) _mbsrev_l @ cdecl _o__mbsset(ptr long) _mbsset @ stub _o__mbsset_l @ stub _o__mbsset_s
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- 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 | 46 ++++++++++++++++++++++++++----------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 30fbd397131..307d00e11e5 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1180,7 +1180,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index aaff43ea736..baf10ae48a4 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1537,7 +1537,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index df0ea4c24da..8fa160170d5 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1548,7 +1548,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 687a73b5d8a..9f92ba36a9f 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -852,7 +852,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 38ffcc7ca22..8d647d6e907 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -830,7 +830,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 02337c46ef5..ae30663d97b 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2201,27 +2201,45 @@ int CDECL _mbsbtype(const unsigned char *str, size_t count) return _mbsbtype_l(str, count, NULL); }
+ /********************************************************************* - * _mbsset(MSVCRT.@) + * _mbsset_l(MSVCRT.@) */ -unsigned char* CDECL _mbsset(unsigned char* str, unsigned int c) +unsigned char* CDECL _mbsset_l(unsigned char* str, unsigned int c, _locale_t locale) { - unsigned char* ret = str; + unsigned char* ret = str; + pthreadmbcinfo mbcinfo;
- if(!get_mbcinfo()->ismbcodepage || c < 256) - return u__strset(str, c); /* ASCII CP or SB char */ + if (!MSVCRT_CHECK_PMT(str)) + return NULL;
- c &= 0xffff; /* Strip high bits */ + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo();
- while(str[0] && str[1]) - { - *str++ = c >> 8; - *str++ = c & 0xff; - } - if(str[0]) - str[0] = '\0'; /* FIXME: OK to shorten? */ + if (!mbcinfo->ismbcodepage || c < 256) + return u__strset(str, c); /* ASCII CP or SB char */ + + c &= 0xffff; /* Strip high bits */
- return ret; + while (str[0] && str[1]) + { + *str++ = c >> 8; + *str++ = c & 0xff; + } + if (str[0]) + str[0] = '\0'; /* FIXME: OK to shorten? */ + + return ret; +} + +/********************************************************************* + * _mbsset(MSVCRT.@) + */ +unsigned char* CDECL _mbsset(unsigned char* str, unsigned int c) +{ + return _mbsset_l(str, c, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a52016e6298..11b65d869dc 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -801,7 +801,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -# stub _mbsset_l(ptr long ptr) +@ cdecl _mbsset_l(ptr long ptr) # stub _mbsset_s(ptr long long) # stub _mbsset_s_l(ptr long long ptr) @ cdecl _mbsspn(str str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 1f99c65ef05..4bb7f4148c7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -696,7 +696,7 @@ @ cdecl _mbsrev(str) @ cdecl _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) -@ stub _mbsset_l +@ cdecl _mbsset_l(ptr long ptr) @ stub _mbsset_s @ stub _mbsset_s_l @ cdecl _mbsspn(str str) @@ -1265,7 +1265,7 @@ @ cdecl _o__mbsrev(str) _mbsrev @ cdecl _o__mbsrev_l(str ptr) _mbsrev_l @ cdecl _o__mbsset(ptr long) _mbsset -@ stub _o__mbsset_l +@ cdecl _o__mbsset_l(ptr long ptr) _mbsset_l @ stub _o__mbsset_s @ stub _o__mbsset_s_l @ cdecl _o__mbsspn(str str) _mbsspn
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 31 ++++++++++++++++++++--------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 9 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 307d00e11e5..f4baf442b53 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1094,7 +1094,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index baf10ae48a4..e9bdf422024 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1451,7 +1451,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 8fa160170d5..13dacc15744 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1462,7 +1462,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 2b2949cdc66..561c3774260 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1302,7 +1302,7 @@ @ cdecl _malloc_crt(long) msvcr120._malloc_crt # extern _mbcasemap @ extern _mbctype msvcr120._mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) msvcr120._mblen_l @ cdecl _mbstowcs_l(ptr str long ptr) msvcr120._mbstowcs_l @ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcr120._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcr120._mbstrlen diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 9f92ba36a9f..91781c9c9e4 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -766,7 +766,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 8d647d6e907..2af41f8aea2 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -744,7 +744,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index ae30663d97b..5e5f76d5591 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2976,21 +2976,34 @@ unsigned char* CDECL _mbspbrk(const unsigned char *str, const unsigned char *acc */
/********************************************************************* - * mblen(MSVCRT.@) + * _mblen_l(MSVCRT.@) * REMARKS * Unlike most of the multibyte string functions this function uses * the locale codepage, not the codepage set by _setmbcp */ -int CDECL mblen(const char* str, size_t size) +int CDECL _mblen_l(const char* str, size_t size, _locale_t locale) { - if (str && *str && size) - { - if(get_locinfo()->mb_cur_max == 1) - return 1; /* ASCII CP */ + pthreadlocinfo locinfo; + if (str && *str && size) + { + if (locale) + locinfo = locale->locinfo; + else + locinfo = get_locinfo(); + if (locinfo->mb_cur_max == 1) + return 1; /* ASCII CP */
- return !isleadbyte((unsigned char)*str) ? 1 : (size>1 ? 2 : -1); - } - return 0; + return !_isleadbyte_l((unsigned char)*str, locale) ? 1 : (size > 1 ? 2 : -1); + } + return 0; +} + +/********************************************************************* + * mblen(MSVCRT.@) + */ +int CDECL mblen(const char* str, size_t size) +{ + return _mblen_l(str, size, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 11b65d869dc..f54a437692f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -711,7 +711,7 @@ @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype -# stub _mblen_l(str long ptr) +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat(str str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 4bb7f4148c7..7cf9b01aa4f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -609,7 +609,7 @@ @ cdecl _mbctombb_l(long ptr) @ cdecl _mbctoupper(long) @ cdecl _mbctoupper_l(long ptr) -@ stub _mblen_l +@ cdecl _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @@ -1179,7 +1179,7 @@ @ cdecl _o__mbctombb_l(long ptr) _mbctombb_l @ cdecl _o__mbctoupper(long) _mbctoupper @ cdecl _o__mbctoupper_l(long ptr) _mbctoupper_l -@ stub _o__mblen_l +@ cdecl _o__mblen_l(str long ptr) _mblen_l @ cdecl _o__mbsbtype(str long) _mbsbtype @ cdecl _o__mbsbtype_l(str long ptr) _mbsbtype_l @ cdecl _o__mbscat_s(ptr long str) _mbscat_s