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, 41 insertions(+), 21 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index d7b343ca150..75b782ea8e3 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1130,7 +1130,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 37acb768277..80132da3c6d 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1487,7 +1487,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 2799d6b2130..44baaaedb60 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1498,7 +1498,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 88057cbb4b9..f0e5e709bba 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -802,7 +802,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 02b73e23e7a..cdb867d1234 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -780,7 +780,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index e588c05d18b..c42badd9e8c 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2206,24 +2206,44 @@ size_t CDECL _mbsnccnt(const unsigned char* str, size_t len) }
/********************************************************************* - * _mbsnbcnt(MSVCRT.@) + * _mbsnbcnt_l(MSVCRT.@) * 'b' is for byte count. */ -size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) +size_t CDECL _mbsnbcnt_l(const unsigned char* str, size_t len, _locale_t locale) { - size_t ret; - if(get_mbcinfo()->ismbcodepage) - { - const unsigned char* xstr = str; - while(*xstr && len-- > 0) + size_t ret; + pthreadmbcinfo mbcinfo; + + if (!len) + return 0; + if (!MSVCRT_CHECK_PMT(str)) + return 0; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) { - if (_ismbblead(*xstr++)) - xstr++; + const unsigned char* xstr = str; + while (*xstr && len-- > 0) + { + if (_ismbblead_l(*xstr++, locale)) + xstr++; + } + return xstr - str; } - return xstr-str; - } - ret=u_strlen(str); - return min(ret, len); /* ASCII CP */ + ret = u_strlen(str); + return min(ret, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsnbcnt(MSVCRT.@) + * 'b' is for byte count. + */ +size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) +{ + return _mbsnbcnt_l(str, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index def70e6bd52..9f98662b65a 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -751,7 +751,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -# stub _mbsnbcnt_l(ptr long ptr) +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 60d00a6e438..569a5d42725 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -646,7 +646,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) @@ -1215,7 +1215,7 @@ @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp @ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt -@ stub _o__mbsnbcnt_l +@ cdecl _o__mbsnbcnt_l(ptr long ptr) _mbsnbcnt_l @ cdecl _o__mbsnbcoll(str str long) _mbsnbcoll @ cdecl _o__mbsnbcoll_l(str str long ptr) _mbsnbcoll_l @ cdecl _o__mbsnbcpy(ptr str long) _mbsnbcpy