Paul Gofman : msvcrt: Implement _mbsnextc_l().

Alexandre Julliard julliard at winehq.org
Thu Sep 24 15:49:06 CDT 2020


Module: wine
Branch: master
Commit: 082de781f016a43f4ab9545adcf4b1e67b8de75f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=082de781f016a43f4ab9545adcf4b1e67b8de75f

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Wed Sep 23 22:54:27 2020 +0300

msvcrt: Implement _mbsnextc_l().

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
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                   |  2 +-
 .../api-ms-win-crt-private-l1-1-0.spec                     |  2 +-
 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                                         | 14 +++++++++++---
 dlls/msvcrt/msvcrt.spec                                    |  2 +-
 dlls/msvcrt/tests/string.c                                 |  7 +++++++
 dlls/ucrtbase/ucrtbase.spec                                |  4 ++--
 include/msvcrt/mbstring.h                                  |  3 ++-
 12 files changed, 30 insertions(+), 14 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 84ae0f449b..f33d8c8f3d 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
@@ -154,7 +154,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str) ucrtbase._mbsnextc
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr) ucrtbase._mbsnextc_l
 @ cdecl _mbsnicmp(str str long) ucrtbase._mbsnicmp
 @ stub _mbsnicmp_l
 @ cdecl _mbsnicoll(str str long) ucrtbase._mbsnicoll
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index f9cfe67c1b..d260ff138e 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -578,7 +578,7 @@
 @ stub _o__mbsncpy_s
 @ stub _o__mbsncpy_s_l
 @ cdecl _o__mbsnextc(str) ucrtbase._o__mbsnextc
-@ stub _o__mbsnextc_l
+@ cdecl _o__mbsnextc_l(str ptr) ucrtbase._o__mbsnextc_l
 @ cdecl _o__mbsnicmp(str str long) ucrtbase._o__mbsnicmp
 @ stub _o__mbsnicmp_l
 @ stub _o__mbsnicoll
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 577fb69b5a..02cba0e3e7 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1160,7 +1160,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 97edbec6a7..b545ffc25c 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1517,7 +1517,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 1aa63de64a..662c097367 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1527,7 +1527,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index a31943e4d7..bc5c6f7bd9 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -832,7 +832,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index ff58757cb8..38b3912b4a 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -810,7 +810,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index dc52cf1b8c..2a42c097b4 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -393,15 +393,23 @@ int CDECL _getmbcp(void)
 }
 
 /*********************************************************************
- *		_mbsnextc(MSVCRT.@)
+ *		_mbsnextc_l(MSVCRT.@)
  */
-unsigned int CDECL _mbsnextc(const unsigned char* str)
+unsigned int CDECL _mbsnextc_l(const unsigned char* str, MSVCRT__locale_t locale)
 {
-  if(_ismbblead(*str))
+  if(_ismbblead_l(*str, locale))
     return *str << 8 | str[1];
   return *str;
 }
 
+/*********************************************************************
+ *		_mbsnextc(MSVCRT.@)
+ */
+unsigned int CDECL _mbsnextc(const unsigned char* str)
+{
+    return _mbsnextc_l(str, NULL);
+}
+
 /*********************************************************************
  *		_mbctolower(MSVCRT.@)
  */
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 6da32d025d..9c049455af 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -778,7 +778,7 @@
 # stub _mbsncpy_s(ptr long str long)
 # stub _mbsncpy_s_l(ptr long str long ptr)
 @ cdecl _mbsnextc(str)
-# stub _mbsnextc_l(str ptr)
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 # stub _mbsnicmp_l(str str long ptr)
 @ stub _mbsnicoll(str str long)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index a08a76fc68..c617518988 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -114,6 +114,7 @@ static int (__cdecl *p__mbccpy_s)(unsigned char*, size_t, int*, const unsigned c
 static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
 static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
 static size_t (__cdecl *p___strncnt)(const char*, size_t);
+static unsigned int (__cdecl *p_mbsnextc_l)(const unsigned char*, _locale_t);
 
 int CDECL __STRINGTOLD(_LDOUBLE*, char**, const char*, int);
 
@@ -351,6 +352,11 @@ static void test_mbcp(void)
     expect_eq(_mbsnextc(&mbstring[2]), 0xb220, int, "%x");  /* lead + invalid tail */
     expect_eq(_mbsnextc(&mbstring[3]), 0x20, int, "%x");    /* single char */
 
+    if (!p_mbsnextc_l)
+        win_skip("_mbsnextc_l tests\n");
+    else
+        expect_eq(p_mbsnextc_l(mbstring, NULL), 0xb0b1, int, "%x");
+
     /* _mbclen/_mbslen */
     expect_eq(_mbclen(mbstring), 2, int, "%d");
     expect_eq(_mbclen(&mbstring[2]), 2, int, "%d");
@@ -4451,6 +4457,7 @@ START_TEST(string)
     p__memicmp = (void*)GetProcAddress(hMsvcrt, "_memicmp");
     p__memicmp_l = (void*)GetProcAddress(hMsvcrt, "_memicmp_l");
     p___strncnt = (void*)GetProcAddress(hMsvcrt, "__strncnt");
+    p_mbsnextc_l = (void*)GetProcAddress(hMsvcrt, "_mbsnextc_l");
 
     /* MSVCRT memcpy behaves like memmove for overlapping moves,
        MFC42 CString::Insert seems to rely on that behaviour */
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 4981d7fbac..ee06053a70 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -673,7 +673,7 @@
 @ stub _mbsncpy_s
 @ stub _mbsncpy_s_l
 @ cdecl _mbsnextc(str)
-@ stub _mbsnextc_l
+@ cdecl _mbsnextc_l(str ptr)
 @ cdecl _mbsnicmp(str str long)
 @ stub _mbsnicmp_l
 @ stub _mbsnicoll(str str long)
@@ -1242,7 +1242,7 @@
 @ stub _o__mbsncpy_s
 @ stub _o__mbsncpy_s_l
 @ cdecl _o__mbsnextc(str) _mbsnextc
-@ stub _o__mbsnextc_l
+@ cdecl _o__mbsnextc_l(str ptr) _mbsnextc_l
 @ cdecl _o__mbsnicmp(str str long) _mbsnicmp
 @ stub _o__mbsnicmp_l
 @ stub _o__mbsnicoll
diff --git a/include/msvcrt/mbstring.h b/include/msvcrt/mbstring.h
index 80be664aaa..82bc6f1aee 100644
--- a/include/msvcrt/mbstring.h
+++ b/include/msvcrt/mbstring.h
@@ -90,7 +90,8 @@ size_t         __cdecl _mbsnccnt(const unsigned char*,size_t);
 int            __cdecl _mbsncmp(const unsigned char*,const unsigned char*,size_t);
 int            __cdecl _mbsncoll(const unsigned char*,const unsigned char*,size_t);
 unsigned char* __cdecl _mbsncpy(unsigned char*,const unsigned char*,size_t);
-unsigned int   __cdecl _mbsnextc (const unsigned char*);
+unsigned int   __cdecl _mbsnextc(const unsigned char*);
+unsigned int   __cdecl _mbsnextc_l(const unsigned char*,_locale_t);
 int            __cdecl _mbsnicmp(const unsigned char*,const unsigned char*,size_t);
 int            __cdecl _mbsnicoll(const unsigned char*,const unsigned char*,size_t);
 unsigned char* __cdecl _mbsninc(const unsigned char*,size_t);




More information about the wine-cvs mailing list