Piotr Caban : msvcrt: Add mbsnlen_l implementation.
Alexandre Julliard
julliard at winehq.org
Thu Oct 5 14:59:35 CDT 2017
Module: wine
Branch: master
Commit: f097c2be1167ead5bd6e317fe56497b207719b83
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f097c2be1167ead5bd6e317fe56497b207719b83
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Oct 5 19:39:25 2017 +0200
msvcrt: Add mbsnlen_l implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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
More information about the wine-cvs
mailing list