headers: Hide UTF-16 and UTF-32 functions from libmsvcrt
While these are standard C11 functions, Microsoft docs say they operate
on strings in UTF-8, instead of strings in the encoding determined by the
current locale. The MSVCRT `mbstate_t`, being an `int`, is too small for
implementations of these functions.
This commit ensures these functions are only declared for UCRT; when
targeting MSVCRT only the typedefs are available.
Reference: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/c16rtomb-c32rtomb1?view=msvc-170
Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 3cf7203..0454ece 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -174,10 +174,6 @@
misc/mbsinit.c \
misc/onexit_table.c \
misc/register_tls_atexit.c \
- misc/uchar_c16rtomb.c \
- misc/uchar_c32rtomb.c \
- misc/uchar_mbrtoc16.c \
- misc/uchar_mbrtoc32.c \
misc/wcrtomb.c \
stdio/_getc_nolock.c \
stdio/_getwc_nolock.c \
diff --git a/mingw-w64-crt/misc/uchar_c16rtomb.c b/mingw-w64-crt/misc/uchar_c16rtomb.c
deleted file mode 100644
index 94a2aaa..0000000
--- a/mingw-w64-crt/misc/uchar_c16rtomb.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-/* ISO C1x Unicode utilities
- * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Date: 2011-09-27
- */
-
-#include <errno.h>
-#include <uchar.h>
-
-size_t c16rtomb (char *__restrict__ s,
- char16_t c16,
- mbstate_t *__restrict__ state)
-{
-/* wchar_t should compatible to char16_t on Windows */
- return wcrtomb(s, c16, state);
-}
-
diff --git a/mingw-w64-crt/misc/uchar_c32rtomb.c b/mingw-w64-crt/misc/uchar_c32rtomb.c
deleted file mode 100644
index d05e632..0000000
--- a/mingw-w64-crt/misc/uchar_c32rtomb.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-/* ISO C1x Unicode utilities
- * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Date: 2011-09-27
- */
-
-#include <errno.h>
-#include <uchar.h>
-
-size_t c32rtomb (char *__restrict__ s,
- char32_t c32,
- mbstate_t *__restrict__ __UNUSED_PARAM(ps))
-{
- if (c32 <= 0x7F) /* 7 bits needs 1 byte */
- {
- *s = (char)c32 & 0x7F;
- return 1;
- }
- else if (c32 <= 0x7FF) /* 11 bits needs 2 bytes */
- {
- s[1] = 0x80 | (char)(c32 & 0x3F);
- s[0] = 0xC0 | (char)(c32 >> 6);
- return 2;
- }
- else if (c32 <= 0xFFFF) /* 16 bits needs 3 bytes */
- {
- s[2] = 0x80 | (char)(c32 & 0x3F);
- s[1] = 0x80 | (char)((c32 >> 6) & 0x3F);
- s[0] = 0xE0 | (char)(c32 >> 12);
- return 3;
- }
- else if (c32 <= 0x1FFFFF) /* 21 bits needs 4 bytes */
- {
- s[3] = 0x80 | (char)(c32 & 0x3F);
- s[2] = 0x80 | (char)((c32 >> 6) & 0x3F);
- s[1] = 0x80 | (char)((c32 >> 12) & 0x3F);
- s[0] = 0xF0 | (char)(c32 >> 18);
- return 4;
- }
-
- errno = EILSEQ;
- return (size_t)-1;
-}
-
diff --git a/mingw-w64-crt/misc/uchar_mbrtoc16.c b/mingw-w64-crt/misc/uchar_mbrtoc16.c
deleted file mode 100644
index 9de35fe..0000000
--- a/mingw-w64-crt/misc/uchar_mbrtoc16.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-/* ISO C1x Unicode utilities
- * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Date: 2011-09-27
- */
-
-#include <errno.h>
-#include <uchar.h>
-
-size_t mbrtoc16 (char16_t *__restrict__ pc16,
- const char *__restrict__ s,
- size_t n,
- mbstate_t *__restrict__ state)
-{
-/* wchar_t should compatible to char16_t on Windows */
- return mbrtowc((wchar_t *)pc16, s, n, state);
-}
-
diff --git a/mingw-w64-crt/misc/uchar_mbrtoc32.c b/mingw-w64-crt/misc/uchar_mbrtoc32.c
deleted file mode 100644
index 825fc52..0000000
--- a/mingw-w64-crt/misc/uchar_mbrtoc32.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-/* ISO C1x Unicode utilities
- * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Date: 2011-09-27
- */
-
-#include <errno.h>
-#include <uchar.h>
-
-size_t mbrtoc32 (char32_t *__restrict__ pc32,
- const char *__restrict__ s,
- size_t n,
- mbstate_t *__restrict__ __UNUSED_PARAM(ps))
-{
- if (*s == 0)
- {
- *pc32 = 0;
- return 0;
- }
-
- /* ASCII character - high bit unset */
- if ((*s & 0x80) == 0)
- {
- *pc32 = *s;
- return 1;
- }
-
- /* Multibyte chars */
- if ((*s & 0xE0) == 0xC0) /* 110xxxxx needs 2 bytes */
- {
- if (n < 2)
- return (size_t)-2;
-
- *pc32 = ((s[0] & 31) << 6) | (s[1] & 63);
- return 2;
- }
- else if ((*s & 0xf0) == 0xE0) /* 1110xxxx needs 3 bytes */
- {
- if (n < 3)
- return (size_t)-2;
-
- *pc32 = ((s[0] & 15) << 12) | ((s[1] & 63) << 6) | (s[2] & 63);
- return 3;
- }
- else if ((*s & 0xF8) == 0xF0) /* 11110xxx needs 4 bytes */
- {
- if (n < 4)
- return (size_t)-2;
-
- *pc32 = ((s[0] & 7) << 18) | ((s[1] & 63) << 12) | ((s[2] & 63) << 6) | (s[3] & 63);
- return 4;
- }
-
- errno = EILSEQ;
- return (size_t)-1;
-}
-
diff --git a/mingw-w64-headers/crt/uchar.h b/mingw-w64-headers/crt/uchar.h
index 019f269..7c32e70 100644
--- a/mingw-w64-headers/crt/uchar.h
+++ b/mingw-w64-headers/crt/uchar.h
@@ -47,6 +47,8 @@
extern "C" {
#endif
+#ifdef _UCRT
+
size_t mbrtoc16 (char16_t *__restrict__ pc16,
const char *__restrict__ s,
size_t n,
@@ -65,6 +67,8 @@
char32_t c32,
mbstate_t *__restrict__ ps);
+#endif /* _UCRT */
+
#ifdef __cplusplus
}
#endif