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