msvcrt: Add mbsnlen_l implementation. Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
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 d0adc14..9db4f53 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
@@ -112,7 +112,7 @@ @ cdecl _mbsinc(str) ucrtbase._mbsinc @ stub _mbsinc_l @ cdecl _mbslen(str) ucrtbase._mbslen -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) ucrtbase._mbslen_l @ cdecl _mbslwr(str) ucrtbase._mbslwr @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) ucrtbase._mbslwr_s @@ -161,8 +161,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) ucrtbase._mbsninc @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) ucrtbase._mbsnlen +@ cdecl _mbsnlen_l(str long ptr) ucrtbase._mbsnlen_l @ cdecl _mbsnset(ptr long long) ucrtbase._mbsnset @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 340a41a..5c8158a 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec
@@ -1118,7 +1118,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -1167,8 +1167,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index cc90e0c..2a7b777 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec
@@ -1475,7 +1475,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -1524,8 +1524,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index fabe0f8..725ecb2 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec
@@ -1485,7 +1485,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -1534,8 +1534,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index d0e9be0..d8290dd 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec
@@ -790,7 +790,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -839,8 +839,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index c3a6d2e..bfaf6f6 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec
@@ -768,7 +768,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -817,8 +817,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 63be805..12a7f5d 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c
@@ -569,23 +569,58 @@ } /********************************************************************* + * _mbsnlen_l(MSVCRT.@) + */ +MSVCRT_size_t CDECL _mbsnlen_l(const unsigned char *str, + MSVCRT_size_t maxsize, MSVCRT__locale_t locale) +{ + MSVCRT_pthreadmbcinfo mbcinfo; + MSVCRT_size_t i = 0, len = 0; + + if(!locale) + mbcinfo = get_mbcinfo(); + else + mbcinfo = locale->mbcinfo; + + if(!mbcinfo->ismbcodepage) + return MSVCRT_strnlen((const char*)str, maxsize); + + while(i<maxsize && str[i]) + { + if (_ismbblead_l(str[i], locale)) + { + i++; + if (!str[i]) /* count only full chars */ + break; + } + i++; + len++; + } + return i < maxsize ? len : maxsize; +} + +/********************************************************************* * _mbslen(MSVCRT.@) */ MSVCRT_size_t CDECL _mbslen(const unsigned char* str) { - MSVCRT_size_t len = 0; - while(*str) - { - if (_ismbblead(*str)) - { - str++; - if (!*str) /* count only full chars */ - break; - } - str++; - len++; - } - return len; + return _mbsnlen_l(str, -1, NULL); +} + +/********************************************************************* + * _mbslen_l(MSVCRT.@) + */ +MSVCRT_size_t CDECL _mbslen_l(const unsigned char* str, MSVCRT__locale_t locale) +{ + return _mbsnlen_l(str, -1, locale); +} + +/********************************************************************* + * _mbsnlen(MSVCRT.@) + */ +MSVCRT_size_t CDECL _mbsnlen(const unsigned char* str, MSVCRT_size_t maxsize) +{ + return _mbsnlen_l(str, maxsize, NULL); } /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e72fd7d..3c73ae2 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec
@@ -737,7 +737,7 @@ @ cdecl _mbsinc(str) # stub _mbsinc_l(str ptr) @ cdecl _mbslen(str) -# stub _mbslen_l(str ptr) +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) # stub _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @@ -786,8 +786,8 @@ # stub _mbsnicoll_l(str str long ptr) @ cdecl _mbsninc(str long) # stub _mbsninc_l(str long ptr) -# stub _mbsnlen(str long) -# stub _mbsnlen_l(str long ptr) +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) # stub _mbsnset_l(ptr long long ptr) # stub _mbsnset_s(ptr long long long)
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 26b773c..6fc805d 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec
@@ -631,7 +631,7 @@ @ cdecl _mbsinc(str) @ stub _mbsinc_l @ cdecl _mbslen(str) -@ stub _mbslen_l +@ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) @@ -680,8 +680,8 @@ @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @ stub _mbsninc_l -@ stub _mbsnlen -@ stub _mbsnlen_l +@ cdecl _mbsnlen(str long) +@ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) @ stub _mbsnset_l @ stub _mbsnset_s