This patch series adds some missing stuff from mbctype.h and mbstring.h, as
well as adding guards for functions which are not available in specific CRTs.
About patch 3: I was relying on information in crtdll.def.in. Pali, feel free
to double check it.
About patch 4: while _mbsnlen and _mbstrnlen were added in msvcr80.dll, they
are available in some OS versions of msvcrt.dll. I'm not sure if we should
expose them for msvcrt.dll. They are very Microsoft-specific and I don't think
that not exposing them is an issue.
(At first, I got a little confused thinking that _mbstr[n]len are declared in
mbstring.h and take `unsigned char *` arguments. I thought they were missing
from mingw-w64 headers until I saw CI failure on my fork).
About patch 7: In theory, we could provide replacements, but I see very little
if no value in doing so.
I'm a little confused about _mbsdup[1] function. It seems like this function
was available in older CRTs, but removed in msvcr80.dll. I have list of symbols
exported from various CRTs obtained from calling `dumpbin -exports`, and
msvcr{80-120}.dll do not export it, our *.def.in files also agree with that.
However, this function is available in UCRT.
Even more, I see that our msvcr80d.def.in exports _mbsdup_dbg and I'm confused.
Pali, do you have a way to check whether _mbsdup_dbg is really present in
msvcr80d.dll? I don't think it really matters, since I doubt anyone would
really need to use debug versions of old CRTs (well, except crazy people like
us), but I'm curious.
I pushed this series to my GitHub fork to run CI tests[2].
- Kirill Makurin
[1]
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strdup-wcsdup-mbsdup
[2] https://github.com/maiddaisuki/mingw-w64/actions/runs/19163768760
From c564af097d1e3cdb065146ed6f7b0f1f51b25447 Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 16:45:24 +0900
Subject: [PATCH 1/7] crt: remove declaration of non-existing functions from
mbstring.h
Functions _mbscpy_l and _mbscat_l never existed in CRT.
Functions _mbscpy and _mbscat were available in all CRTs prior to
msvcr80.dll (except for msvcrt10.dll, which does not have multibyte
support).
In msvcr80.dll, _mbscpy and _mbscat were removed and replaced with
_mbscpy_s and _mbscat_s. Since msvcr80.dll had also introduced
_locale_t, locale-specific _mbscpy_s_l and _mbscat_s_l were also
added.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbstring.h | 2 --
1 file changed, 2 deletions(-)
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index 8b78e8b7d..b976b8d19 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -52,7 +52,6 @@ extern "C" {
_CRTIMP int __cdecl _mbsbtype(const unsigned char *_Str,size_t _Pos);
_CRTIMP int __cdecl _mbsbtype_l(const unsigned char *_Str,size_t
_Pos,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbscat(unsigned char *_Dest,const unsigned
char *_Source);
- _CRTIMP unsigned char *_mbscat_l(unsigned char *_Dest,const unsigned char
*_Source,_locale_t _Locale);
_CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr(const unsigned char
*_Str,unsigned int _Ch);
_CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr_l(const unsigned char
*_Str,unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _mbscmp(const unsigned char *_Str1,const unsigned char
*_Str2);
@@ -60,7 +59,6 @@ extern "C" {
_CRTIMP int __cdecl _mbscoll(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbscoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbscpy(unsigned char *_Dest,const unsigned
char *_Source);
- _CRTIMP unsigned char *_mbscpy_l(unsigned char *_Dest,const unsigned char
*_Source,_locale_t _Locale);
_CRTIMP size_t __cdecl _mbscspn(const unsigned char *_Str,const unsigned
char *_Control);
_CRTIMP size_t __cdecl _mbscspn_l(const unsigned char *_Str,const unsigned
char *_Control,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbsdec(const unsigned char *_Start,const
unsigned char *_Pos);
--
2.51.0.windows.1
From c075b3fb260d4b6fc42cec3028e46f1f3ca07238 Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 16:53:25 +0900
Subject: [PATCH 2/7] crt: add missing __cdecl for _mbslwr_l and _mbsupr_l
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbstring.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index b976b8d19..1aab3f10f 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -74,7 +74,7 @@ extern "C" {
_CRTIMP size_t __cdecl _mbsnlen(const unsigned char *_Str,size_t _MaxCount);
_CRTIMP size_t __cdecl _mbsnlen_l(const unsigned char *_Str,size_t
_MaxCount,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbslwr(unsigned char *_String);
- _CRTIMP unsigned char *_mbslwr_l(unsigned char *_String,_locale_t _Locale);
+ _CRTIMP unsigned char *__cdecl _mbslwr_l(unsigned char *_String,_locale_t
_Locale);
_CRTIMP unsigned char *__cdecl _mbsnbcat(unsigned char *_Dest,const unsigned
char *_Source,size_t _Count) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsnbcat_l(unsigned char *_Dest,const
unsigned char *_Source,size_t _Count,_locale_t _Locale)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP int __cdecl _mbsnbcmp(const unsigned char *_Str1,const unsigned char
*_Str2,size_t _MaxCount);
@@ -128,7 +128,7 @@ extern "C" {
_CRTIMP unsigned char *__cdecl _mbstok(unsigned char *_Str,const unsigned
char *_Delim) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbstok_l(unsigned char *_Str,const unsigned
char *_Delim,_locale_t _Locale) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsupr(unsigned char *_String)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
- _CRTIMP unsigned char *_mbsupr_l(unsigned char *_String,_locale_t _Locale)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
+ _CRTIMP unsigned char *__cdecl _mbsupr_l(unsigned char *_String,_locale_t
_Locale) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP size_t __cdecl _mbclen(const unsigned char *_Str);
_CRTIMP size_t __cdecl _mbclen_l(const unsigned char *_Str,_locale_t
_Locale);
_CRTIMP void __cdecl _mbccpy(unsigned char *_Dst,const unsigned char *_Src)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
--
2.51.0.windows.1
From c9f4779b5f403dea39a13aca7525eb957e954286 Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 17:04:37 +0900
Subject: [PATCH 3/7] crt: mbctype.h and mbstring.h: guard functions which are
not available in crtdll.dll
Functions declared in mbctype.h and mbstring.h are availabe
in all CRTs except for msvcrt10.dll, which does not have multibyte support.
While set of available functions has not changed much over time,
crtdll.dll is missing some of them.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbctype.h | 5 ++++-
mingw-w64-headers/crt/mbstring.h | 18 ++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/mingw-w64-headers/crt/mbctype.h b/mingw-w64-headers/crt/mbctype.h
index b85720c97..49a55a3af 100644
--- a/mingw-w64-headers/crt/mbctype.h
+++ b/mingw-w64-headers/crt/mbctype.h
@@ -51,17 +51,20 @@ extern "C" {
#ifndef _MBCTYPE_DEFINED
#define _MBCTYPE_DEFINED
-
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _setmbcp(int _CodePage);
_CRTIMP int __cdecl _getmbcp(void);
+#endif
_CRTIMP int __cdecl _ismbbkalnum(unsigned int _C);
_CRTIMP int __cdecl _ismbbkalnum_l(unsigned int _C,_locale_t _Locale);
_CRTIMP int __cdecl _ismbbkana(unsigned int _C);
_CRTIMP int __cdecl _ismbbkana_l(unsigned int _C,_locale_t _Locale);
_CRTIMP int __cdecl _ismbbkpunct(unsigned int _C);
_CRTIMP int __cdecl _ismbbkpunct_l(unsigned int _C,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _ismbbkprint(unsigned int _C);
_CRTIMP int __cdecl _ismbbkprint_l(unsigned int _C,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbbalpha(unsigned int _C);
_CRTIMP int __cdecl _ismbbalpha_l(unsigned int _C,_locale_t _Locale);
_CRTIMP int __cdecl _ismbbpunct(unsigned int _C);
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index 1aab3f10f..044881de2 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -56,8 +56,10 @@ extern "C" {
_CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr_l(const unsigned char
*_Str,unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _mbscmp(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbscmp_l(const unsigned char *_Str1,const unsigned char
*_Str2,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbscoll(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbscoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbscpy(unsigned char *_Dest,const unsigned
char *_Source);
_CRTIMP size_t __cdecl _mbscspn(const unsigned char *_Str,const unsigned
char *_Control);
_CRTIMP size_t __cdecl _mbscspn_l(const unsigned char *_Str,const unsigned
char *_Control,_locale_t _Locale);
@@ -65,8 +67,10 @@ extern "C" {
_CRTIMP unsigned char *__cdecl _mbsdec_l(const unsigned char *_Start,const
unsigned char *_Pos,_locale_t _Locale);
_CRTIMP int __cdecl _mbsicmp(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbsicmp_l(const unsigned char *_Str1,const unsigned
char *_Str2,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbsicoll(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbsicoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbsinc(const unsigned char *_Ptr);
_CRTIMP unsigned char *__cdecl _mbsinc_l(const unsigned char *_Ptr,_locale_t
_Locale);
_CRTIMP size_t __cdecl _mbslen(const unsigned char *_Str);
@@ -79,16 +83,20 @@ extern "C" {
_CRTIMP unsigned char *__cdecl _mbsnbcat_l(unsigned char *_Dest,const
unsigned char *_Source,size_t _Count,_locale_t _Locale)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP int __cdecl _mbsnbcmp(const unsigned char *_Str1,const unsigned char
*_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnbcmp_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbsnbcoll(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnbcoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#endif
_CRTIMP size_t __cdecl _mbsnbcnt(const unsigned char *_Str,size_t _MaxCount);
_CRTIMP size_t __cdecl _mbsnbcnt_l(const unsigned char *_Str,size_t
_MaxCount,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbsnbcpy(unsigned char *_Dest,const unsigned
char *_Source,size_t _Count) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsnbcpy_l(unsigned char *_Dest,const
unsigned char *_Source,size_t _Count,_locale_t _Locale)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP int __cdecl _mbsnbicmp(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnbicmp_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbsnbicoll(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnbicoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbsnbset(unsigned char *_Str,unsigned int
_Ch,size_t _MaxCount) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsnbset_l(unsigned char *_Str,unsigned int
_Ch,size_t _MaxCount,_locale_t _Locale) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsncat(unsigned char *_Dest,const unsigned
char *_Source,size_t _Count) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
@@ -97,16 +105,20 @@ extern "C" {
_CRTIMP size_t __cdecl _mbsnccnt_l(const unsigned char *_Str,size_t
_MaxCount,_locale_t _Locale);
_CRTIMP int __cdecl _mbsncmp(const unsigned char *_Str1,const unsigned char
*_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsncmp_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbsncoll(const unsigned char *_Str1,const unsigned char
*_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsncoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbsncpy(unsigned char *_Dest,const unsigned
char *_Source,size_t _Count) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned char *__cdecl _mbsncpy_l(unsigned char *_Dest,const
unsigned char *_Source,size_t _Count,_locale_t _Locale)
__MINGW_ATTRIB_DEPRECATED_SEC_WARN;
_CRTIMP unsigned int __cdecl _mbsnextc (const unsigned char *_Str);
_CRTIMP unsigned int __cdecl _mbsnextc_l(const unsigned char *_Str,_locale_t
_Locale);
_CRTIMP int __cdecl _mbsnicmp(const unsigned char *_Str1,const unsigned char
*_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnicmp_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _mbsnicoll(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount);
_CRTIMP int __cdecl _mbsnicoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,size_t _MaxCount,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbsninc(const unsigned char *_Str,size_t
_Count);
_CRTIMP unsigned char *__cdecl _mbsninc_l(const unsigned char *_Str,size_t
_Count,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbsnset(unsigned char *_Dst,unsigned int
_Val,size_t _MaxCount) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
@@ -151,22 +163,28 @@ extern "C" {
#endif
#endif
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _ismbcalnum(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcalnum_l(unsigned int _Ch,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbcalpha(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcalpha_l(unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _ismbcdigit(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcdigit_l(unsigned int _Ch,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _ismbcgraph(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcgraph_l(unsigned int _Ch,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbclegal(unsigned int _Ch);
_CRTIMP int __cdecl _ismbclegal_l(unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _ismbclower(unsigned int _Ch);
_CRTIMP int __cdecl _ismbclower_l(unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _ismbcprint(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcprint_l(unsigned int _Ch,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0200
_CRTIMP int __cdecl _ismbcpunct(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcpunct_l(unsigned int _Ch,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbcspace(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcspace_l(unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _ismbcupper(unsigned int _Ch);
--
2.51.0.windows.1
From 81d941a778c0dabb22669d4bad2bed2af02ffdf4 Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 18:03:26 +0900
Subject: [PATCH 4/7] crt: mbstring.h and stdlib.h: guard functions which are
available since msvcr80.dll
Functions _mbsnlen, _mbstrnlen and their locale-specific variants
are availabe starting with msvcr80.dll.
Do not expose them when compiling for older CRTs.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbstring.h | 2 ++
mingw-w64-headers/crt/stdlib.h | 2 ++
2 files changed, 4 insertions(+)
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index 044881de2..e5c8d2050 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -75,8 +75,10 @@ extern "C" {
_CRTIMP unsigned char *__cdecl _mbsinc_l(const unsigned char *_Ptr,_locale_t
_Locale);
_CRTIMP size_t __cdecl _mbslen(const unsigned char *_Str);
_CRTIMP size_t __cdecl _mbslen_l(const unsigned char *_Str,_locale_t
_Locale);
+#if __MSVCRT_VERSION__ >= 0x0800
_CRTIMP size_t __cdecl _mbsnlen(const unsigned char *_Str,size_t _MaxCount);
_CRTIMP size_t __cdecl _mbsnlen_l(const unsigned char *_Str,size_t
_MaxCount,_locale_t _Locale);
+#endif
_CRTIMP unsigned char *__cdecl _mbslwr(unsigned char *_String);
_CRTIMP unsigned char *__cdecl _mbslwr_l(unsigned char *_String,_locale_t
_Locale);
_CRTIMP unsigned char *__cdecl _mbsnbcat(unsigned char *_Dest,const unsigned
char *_Source,size_t _Count) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h
index 217c53571..a53c2ecb1 100644
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -346,8 +346,10 @@ _CRTIMP int __cdecl ___mb_cur_max_func(void);
_CRTIMP int __cdecl _mblen_l(const char *_Ch,size_t _MaxCount,_locale_t
_Locale);
_CRTIMP size_t __cdecl _mbstrlen(const char *_Str);
_CRTIMP size_t __cdecl _mbstrlen_l(const char *_Str,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0800
_CRTIMP size_t __cdecl _mbstrnlen(const char *_Str,size_t _MaxCount);
_CRTIMP size_t __cdecl _mbstrnlen_l(const char *_Str,size_t
_MaxCount,_locale_t _Locale);
+#endif
int __cdecl mbtowc(wchar_t * __restrict__ _DstCh,const char * __restrict__
_SrcCh,size_t _SrcSizeInBytes);
_CRTIMP int __cdecl _mbtowc_l(wchar_t * __restrict__ _DstCh,const char *
__restrict__ _SrcCh,size_t _SrcSizeInBytes,_locale_t _Locale);
size_t __cdecl mbstowcs(wchar_t * __restrict__ _Dest,const char *
__restrict__ _Source,size_t _MaxCount);
--
2.51.0.windows.1
From 525f493f763980ba3c36cf757e07ab5c662296fe Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 18:05:46 +0900
Subject: [PATCH 5/7] crt: mbctype.h and mbstring.h: add functions added in
msvcr120.dll
Functions _ismbbblank, _ismbcblank and their locale-specific variants
are available since msvcr120.dll.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbctype.h | 4 ++++
mingw-w64-headers/crt/mbstring.h | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/mingw-w64-headers/crt/mbctype.h b/mingw-w64-headers/crt/mbctype.h
index 49a55a3af..a0a378fe3 100644
--- a/mingw-w64-headers/crt/mbctype.h
+++ b/mingw-w64-headers/crt/mbctype.h
@@ -67,6 +67,10 @@ extern "C" {
#endif
_CRTIMP int __cdecl _ismbbalpha(unsigned int _C);
_CRTIMP int __cdecl _ismbbalpha_l(unsigned int _C,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0C00
+ _CRTIMP int __cdecl _ismbbblank(unsigned int _C);
+ _CRTIMP int __cdecl _ismbbblank_l(unsigned int _C,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbbpunct(unsigned int _C);
_CRTIMP int __cdecl _ismbbpunct_l(unsigned int _C,_locale_t _Locale);
_CRTIMP int __cdecl _ismbbalnum(unsigned int _C);
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index e5c8d2050..7d0e3d80d 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -171,6 +171,10 @@ extern "C" {
#endif
_CRTIMP int __cdecl _ismbcalpha(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcalpha_l(unsigned int _Ch,_locale_t _Locale);
+#if __MSVCRT_VERSION__ >= 0x0C00
+ _CRTIMP int __cdecl _ismbcblank(unsigned int _Ch);
+ _CRTIMP int __cdecl _ismbcblank_l(unsigned int _Ch,_locale_t _Locale);
+#endif
_CRTIMP int __cdecl _ismbcdigit(unsigned int _Ch);
_CRTIMP int __cdecl _ismbcdigit_l(unsigned int _Ch,_locale_t _Locale);
#if __MSVCRT_VERSION__ >= 0x0200
--
2.51.0.windows.1
From f108abec87e481d0a287bd9f5afb59be4ed7443c Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 18:06:17 +0900
Subject: [PATCH 6/7] crt: mbctype.h: add missing _MB_CP_UTF8
This constant is used with _setmbcp to set multibyte code page
to UTF-8. Note, however, that multibyte functions declared in
mbctype.h and mbstring.h cannot operate on UTF-8 strings.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbctype.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mingw-w64-headers/crt/mbctype.h b/mingw-w64-headers/crt/mbctype.h
index a0a378fe3..e39d2a102 100644
--- a/mingw-w64-headers/crt/mbctype.h
+++ b/mingw-w64-headers/crt/mbctype.h
@@ -48,6 +48,9 @@ extern "C" {
#define _MB_CP_OEM -2
#define _MB_CP_ANSI -3
#define _MB_CP_LOCALE -4
+#ifdef _UCRT
+#define _MB_CP_UTF8 65001
+#endif
#ifndef _MBCTYPE_DEFINED
#define _MBCTYPE_DEFINED
--
2.51.0.windows.1
From 7e3ad870789b0f52fb916c844b79a94b15f9d787 Mon Sep 17 00:00:00 2001
From: Kirill Makurin <[email protected]>
Date: Fri, 7 Nov 2025 18:06:39 +0900
Subject: [PATCH 7/7] crt: mbstring.h: guard functions removed in msvcr80.dll
Functions _mbscpy and _mbscat were removed in msvcr80.dll.
Do not expose them when compiling for msvcr80.dll or later.
Signed-off-by: Kirill Makurin <[email protected]>
---
mingw-w64-headers/crt/mbstring.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h
index 7d0e3d80d..93451b7cd 100644
--- a/mingw-w64-headers/crt/mbstring.h
+++ b/mingw-w64-headers/crt/mbstring.h
@@ -51,7 +51,9 @@ extern "C" {
_CRTIMP unsigned int __cdecl _mbctombb_l(unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _mbsbtype(const unsigned char *_Str,size_t _Pos);
_CRTIMP int __cdecl _mbsbtype_l(const unsigned char *_Str,size_t
_Pos,_locale_t _Locale);
+#if __MSVCRT_VERSION__ < 0x0800
_CRTIMP unsigned char *__cdecl _mbscat(unsigned char *_Dest,const unsigned
char *_Source);
+#endif
_CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr(const unsigned char
*_Str,unsigned int _Ch);
_CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr_l(const unsigned char
*_Str,unsigned int _Ch,_locale_t _Locale);
_CRTIMP int __cdecl _mbscmp(const unsigned char *_Str1,const unsigned char
*_Str2);
@@ -60,7 +62,9 @@ extern "C" {
_CRTIMP int __cdecl _mbscoll(const unsigned char *_Str1,const unsigned char
*_Str2);
_CRTIMP int __cdecl _mbscoll_l(const unsigned char *_Str1,const unsigned
char *_Str2,_locale_t _Locale);
#endif
+#if __MSVCRT_VERSION__ < 0x0800
_CRTIMP unsigned char *__cdecl _mbscpy(unsigned char *_Dest,const unsigned
char *_Source);
+#endif
_CRTIMP size_t __cdecl _mbscspn(const unsigned char *_Str,const unsigned
char *_Control);
_CRTIMP size_t __cdecl _mbscspn_l(const unsigned char *_Str,const unsigned
char *_Control,_locale_t _Locale);
_CRTIMP unsigned char *__cdecl _mbsdec(const unsigned char *_Start,const
unsigned char *_Pos);
--
2.51.0.windows.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public