Module: wine Branch: master Commit: f097c2be1167ead5bd6e317fe56497b207719b83 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f097c2be1167ead5bd6e317fe5...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Oct 5 19:39:25 2017 +0200
msvcrt: Add mbsnlen_l implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
.../api-ms-win-crt-multibyte-l1-1-0.spec | 6 +-- dlls/msvcr100/msvcr100.spec | 6 +-- dlls/msvcr110/msvcr110.spec | 6 +-- dlls/msvcr120/msvcr120.spec | 6 +-- dlls/msvcr80/msvcr80.spec | 6 +-- dlls/msvcr90/msvcr90.spec | 6 +-- dlls/msvcrt/mbcs.c | 61 +++++++++++++++++----- dlls/msvcrt/msvcrt.spec | 6 +-- dlls/ucrtbase/ucrtbase.spec | 6 +-- 9 files changed, 72 insertions(+), 37 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 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 @@ unsigned char* CDECL _mbsninc(const unsigned char* str, MSVCRT_size_t num) }
/********************************************************************* - * _mbslen(MSVCRT.@) + * _mbsnlen_l(MSVCRT.@) */ -MSVCRT_size_t CDECL _mbslen(const unsigned char* str) +MSVCRT_size_t CDECL _mbsnlen_l(const unsigned char *str, + MSVCRT_size_t maxsize, MSVCRT__locale_t locale) { - MSVCRT_size_t len = 0; - while(*str) - { - if (_ismbblead(*str)) + 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]) { - str++; - if (!*str) /* count only full chars */ - break; + if (_ismbblead_l(str[i], locale)) + { + i++; + if (!str[i]) /* count only full chars */ + break; + } + i++; + len++; } - str++; - len++; - } - return len; + return i < maxsize ? len : maxsize; +} + +/********************************************************************* + * _mbslen(MSVCRT.@) + */ +MSVCRT_size_t CDECL _mbslen(const unsigned char* str) +{ + 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