Piotr Caban : msvcrt: Add _ismbcalnum_l implementation.

Alexandre Julliard julliard at winehq.org
Thu Jul 16 19:01:22 CDT 2020


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Jul 16 15:32:53 2020 +0200

msvcrt: Add _ismbcalnum_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           |  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                                 | 58 ++++++++++++++--------
 dlls/msvcrt/msvcrt.h                               |  1 +
 dlls/msvcrt/msvcrt.spec                            |  2 +-
 dlls/ucrtbase/ucrtbase.spec                        |  4 +-
 11 files changed, 49 insertions(+), 30 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 2e20080ea3..991ad90a92 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
@@ -25,7 +25,7 @@
 @ cdecl _ismbbtrail(long) ucrtbase._ismbbtrail
 @ cdecl _ismbbtrail_l(long ptr) ucrtbase._ismbbtrail_l
 @ cdecl _ismbcalnum(long) ucrtbase._ismbcalnum
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr) ucrtbase._ismbcalnum_l
 @ cdecl _ismbcalpha(long) ucrtbase._ismbcalpha
 @ stub _ismbcalpha_l
 @ stub _ismbcblank
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 b428f26edb..afcac3bacb 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
@@ -398,7 +398,7 @@
 @ cdecl _o__ismbbtrail(long) ucrtbase._o__ismbbtrail
 @ cdecl _o__ismbbtrail_l(long ptr) ucrtbase._o__ismbbtrail_l
 @ cdecl _o__ismbcalnum(long) ucrtbase._o__ismbcalnum
-@ stub _o__ismbcalnum_l
+@ cdecl _o__ismbcalnum_l(long ptr) ucrtbase._o__ismbcalnum_l
 @ cdecl _o__ismbcalpha(long) ucrtbase._o__ismbcalpha
 @ stub _o__ismbcalpha_l
 @ stub _o__ismbcblank
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 5f38a7a3fb..acf8601def 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -975,7 +975,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ cdecl _ismbcdigit(long)
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 9589d62c71..477b5a4a00 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1321,7 +1321,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ cdecl _ismbcdigit(long)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 2ca13a6cdc..b3207ad086 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1324,7 +1324,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ stub _ismbcblank
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 17376db528..fa6c7186f7 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -647,7 +647,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ cdecl _ismbcdigit(long)
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 602f1449ac..566e9431be 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -625,7 +625,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ cdecl _ismbcdigit(long)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 8376fe2098..5b07e13bba 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -84,26 +84,37 @@ static const unsigned char mbctombb_932_kana[] = {
   0xd2,0xd3,0xac,0xd4,0xad,0xd5,0xae,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xb2,
   0xb4,0xa6,0xdd,0xb3,0xb6,0xb9};
 
-static MSVCRT_wchar_t msvcrt_mbc_to_wc(unsigned int ch)
+static MSVCRT_wchar_t msvcrt_mbc_to_wc_l(unsigned int ch, MSVCRT__locale_t locale)
 {
-  MSVCRT_wchar_t chW;
-  char mbch[2];
-  int n_chars;
+    MSVCRT_pthreadmbcinfo mbcinfo;
+    MSVCRT_wchar_t chW;
+    char mbch[2];
+    int n_chars;
 
-  if (ch <= 0xff) {
-    mbch[0] = ch;
-    n_chars = 1;
-  } else {
-    mbch[0] = (ch >> 8) & 0xff;
-    mbch[1] = ch & 0xff;
-    n_chars = 2;
-  }
-  if (!MultiByteToWideChar(get_mbcinfo()->mbcodepage, 0, mbch, n_chars, &chW, 1))
-  {
-    WARN("MultiByteToWideChar failed on %x\n", ch);
-    return 0;
-  }
-  return chW;
+    if(locale)
+        mbcinfo = locale->mbcinfo;
+    else
+        mbcinfo = get_mbcinfo();
+
+    if (ch <= 0xff) {
+        mbch[0] = ch;
+        n_chars = 1;
+    } else {
+        mbch[0] = (ch >> 8) & 0xff;
+        mbch[1] = ch & 0xff;
+        n_chars = 2;
+    }
+    if (!MultiByteToWideChar(mbcinfo->mbcodepage, 0, mbch, n_chars, &chW, 1))
+    {
+        WARN("MultiByteToWideChar failed on %x\n", ch);
+        return 0;
+    }
+    return chW;
+}
+
+static MSVCRT_wchar_t msvcrt_mbc_to_wc(unsigned int ch)
+{
+    return msvcrt_mbc_to_wc_l(ch, NULL);
 }
 
 static inline MSVCRT_size_t u_strlen( const unsigned char *str )
@@ -1476,13 +1487,20 @@ int CDECL _ismbcsymbol(unsigned int ch)
     return ((ctype & C3_SYMBOL) != 0);
 }
 
+/*********************************************************************
+ *              _ismbcalnum_l (MSVCRT.@)
+ */
+int CDECL _ismbcalnum_l(unsigned int ch, MSVCRT__locale_t locale)
+{
+    return MSVCRT__iswalnum_l( msvcrt_mbc_to_wc_l(ch, locale), locale );
+}
+
 /*********************************************************************
  *              _ismbcalnum (MSVCRT.@)
  */
 int CDECL _ismbcalnum(unsigned int ch)
 {
-    MSVCRT_wchar_t wch = msvcrt_mbc_to_wc( ch );
-    return (get_char_typeW( wch ) & (C1_ALPHA | C1_DIGIT));
+    return _ismbcalnum_l( ch, NULL );
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 4a13501993..a0fbeb7ebe 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -1201,6 +1201,7 @@ int __cdecl MSVCRT_wcsncmp(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, MSVCRT_
 int __cdecl MSVCRT__wcsnicmp(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, MSVCRT_size_t);
 int __cdecl MSVCRT_towlower(MSVCRT_wint_t);
 int __cdecl MSVCRT_towupper(MSVCRT_wint_t);
+int __cdecl MSVCRT__iswalnum_l(MSVCRT_wchar_t, MSVCRT__locale_t);
 
 /* Maybe one day we'll enable the invalid parameter handlers with the full set of information (msvcrXXd)
  *      #define MSVCRT_INVALID_PMT(x) MSVCRT_call_invalid_parameter_handler(x, __FUNCTION__, __FILE__, __LINE__, 0)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 0d0221461a..dc3048469d 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -593,7 +593,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-# stub _ismbcalnum_l(long ptr)
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 # stub _ismbcalpha_l(long ptr)
 @ cdecl _ismbcdigit(long)
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 5436d4cac2..b6d3a033e5 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -463,7 +463,7 @@
 @ cdecl _ismbbtrail(long)
 @ cdecl _ismbbtrail_l(long ptr)
 @ cdecl _ismbcalnum(long)
-@ stub _ismbcalnum_l
+@ cdecl _ismbcalnum_l(long ptr)
 @ cdecl _ismbcalpha(long)
 @ stub _ismbcalpha_l
 @ stub _ismbcblank
@@ -1062,7 +1062,7 @@
 @ cdecl _o__ismbbtrail(long) _ismbbtrail
 @ cdecl _o__ismbbtrail_l(long ptr) _ismbbtrail_l
 @ cdecl _o__ismbcalnum(long) _ismbcalnum
-@ stub _o__ismbcalnum_l
+@ cdecl _o__ismbcalnum_l(long ptr) _ismbcalnum_l
 @ cdecl _o__ismbcalpha(long) _ismbcalpha
 @ stub _o__ismbcalpha_l
 @ stub _o__ismbcblank




More information about the wine-cvs mailing list