crt: always use replacements for btowc and wctob
CRT's wctob sign-extends its return value if value of converted
single-byte character is outside of range [0,127].
This behavior makes it impossible to distinguish failure from success if
value of converted character is 255 (when sign-extended, same as EOF).
Signed-off-by: Kirill Makurin <maiddaisuki@outlook.com>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 30b1374..021b92c 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -167,9 +167,11 @@
# Files included in all libmsvcr*.a
src_msvcrt_common=\
misc/_onexit.c \
+ misc/btowc.c \
misc/mbsinit.c \
misc/onexit_table.c \
misc/register_tls_atexit.c \
+ misc/wctob.c \
stdio/_getc_nolock.c \
stdio/_getwc_nolock.c \
stdio/_putc_nolock.c \
@@ -415,6 +417,8 @@
misc/_onexit.c \
misc/output_format.c \
misc/ucrt-access.c \
+ misc/ucrt_btowc.c \
+ misc/ucrt_wctob.c \
stdio/ucrt___local_stdio_printf_options.c \
stdio/ucrt___local_stdio_scanf_options.c \
stdio/ucrt__scprintf.c \
@@ -553,7 +557,6 @@
misc/_get_current_locale.c \
misc/_initterm_e.c \
misc/_time64.c \
- misc/btowc.c \
misc/imaxabs.c \
misc/lc_locale_func.c \
misc/output_format.c \
@@ -566,7 +569,6 @@
misc/wcsnlen.c \
misc/wcstoimax.c \
misc/wcstoumax.c \
- misc/wctob.c \
stdio/_fseeki64.c \
stdio/_fstat64.c \
stdio/_fstat64i32.c \
@@ -615,14 +617,12 @@
misc/_free_locale.c \
misc/_get_current_locale.c \
misc/_initterm_e.c \
- misc/btowc.c \
misc/output_format.c \
misc/_get_errno.c \
misc/_set_errno.c \
misc/strnlen.c \
misc/wassert.c \
misc/wcsnlen.c \
- misc/wctob.c \
stdio/_fseeki64.c \
stdio/_fstat32.c \
stdio/_fstat32i64.c \
@@ -881,7 +881,6 @@
misc/_initterm_e.c \
misc/_recalloc.c \
misc/_set_errno.c \
- misc/btowc.c \
misc/imaxabs.c \
misc/invalid_parameter_handler.c \
misc/mbrtowc.c \
@@ -890,7 +889,6 @@
misc/wassert.c \
misc/wcrtomb.c \
misc/wcsnlen.c \
- misc/wctob.c \
secapi/getenv_s.c \
stdio/_fseeki64.c \
stdio/_fstat64i32.c \
diff --git a/mingw-w64-crt/lib-common/api-ms-win-crt-convert-l1-1-0.def.in b/mingw-w64-crt/lib-common/api-ms-win-crt-convert-l1-1-0.def.in
index d5e4f25..fd49dc0 100644
--- a/mingw-w64-crt/lib-common/api-ms-win-crt-convert-l1-1-0.def.in
+++ b/mingw-w64-crt/lib-common/api-ms-win-crt-convert-l1-1-0.def.in
@@ -93,7 +93,7 @@
atoi
atol
atoll
-btowc
+; btowc ; use replacement
c16rtomb
c32rtomb
mbrtoc16
@@ -128,7 +128,7 @@
wcstoul
wcstoull
wcstoumax
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib-common/msvcr120_app.def.in b/mingw-w64-crt/lib-common/msvcr120_app.def.in
index 42c6424..55d9127 100644
--- a/mingw-w64-crt/lib-common/msvcr120_app.def.in
+++ b/mingw-w64-crt/lib-common/msvcr120_app.def.in
@@ -1877,7 +1877,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
F_ARM32(cabsl) ; Can't use long double functions from the CRT on x86
@@ -2321,7 +2321,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in
index 47582c1..3f1b1a8 100644
--- a/mingw-w64-crt/lib-common/msvcrt.def.in
+++ b/mingw-w64-crt/lib-common/msvcrt.def.in
@@ -1795,7 +1795,7 @@
_wutime32 F_I386(== _wutime) ; i386 _wutime32 replaced by alias
F_ARM_ANY(asctime_s) ; i386 and x64 asctime_s replaced by emu
bsearch_s
-F_ARM_ANY(btowc) ; i386 and x64 btowc replaced by emu
+; F_ARM_ANY(btowc) ; always use replacement
clearerr_s
fopen_s
fprintf_s
@@ -1849,7 +1849,7 @@
wcsrtombs_s
F_ARM_ANY(wcstok_s) ; i386 and x64 wcstok_s replaced by emu
wcstombs_s
-F_ARM_ANY(wctob) ; i386 and x64 wctob replaced by emu
+; F_ARM_ANY(wctob) ; always use replacement
wctomb_s
wprintf_s
wscanf_s
diff --git a/mingw-w64-crt/lib-common/ucrtbase-common.def.in b/mingw-w64-crt/lib-common/ucrtbase-common.def.in
index 90a0993..e121ced 100644
--- a/mingw-w64-crt/lib-common/ucrtbase-common.def.in
+++ b/mingw-w64-crt/lib-common/ucrtbase-common.def.in
@@ -2233,7 +2233,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
c16rtomb
c32rtomb
cabs
@@ -2656,7 +2656,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib32/msvcr100.def.in b/mingw-w64-crt/lib32/msvcr100.def.in
index b1d73df..038b6b7 100644
--- a/mingw-w64-crt/lib32/msvcr100.def.in
+++ b/mingw-w64-crt/lib32/msvcr100.def.in
@@ -1662,7 +1662,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
clearerr
@@ -1892,7 +1892,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib32/msvcr100d.def.in b/mingw-w64-crt/lib32/msvcr100d.def.in
index 0ec2317..df0e0f6 100644
--- a/mingw-w64-crt/lib32/msvcr100d.def.in
+++ b/mingw-w64-crt/lib32/msvcr100d.def.in
@@ -1729,7 +1729,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA ; overwritten
clearerr
@@ -1955,7 +1955,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib32/msvcr110.def.in b/mingw-w64-crt/lib32/msvcr110.def.in
index dee3662..ce8c936 100644
--- a/mingw-w64-crt/lib32/msvcr110.def.in
+++ b/mingw-w64-crt/lib32/msvcr110.def.in
@@ -1795,7 +1795,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
clearerr
@@ -2021,7 +2021,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib32/msvcr110d.def.in b/mingw-w64-crt/lib32/msvcr110d.def.in
index 7719fbd..89d6ef5 100644
--- a/mingw-w64-crt/lib32/msvcr110d.def.in
+++ b/mingw-w64-crt/lib32/msvcr110d.def.in
@@ -1862,7 +1862,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA ; overwritten
clearerr
@@ -2088,7 +2088,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib32/msvcr120.def.in b/mingw-w64-crt/lib32/msvcr120.def.in
index 2432346..49723bb 100644
--- a/mingw-w64-crt/lib32/msvcr120.def.in
+++ b/mingw-w64-crt/lib32/msvcr120.def.in
@@ -1853,7 +1853,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
; cabsl ; Can't use long double functions from the CRT on x86
@@ -2284,7 +2284,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib32/msvcr120d.def.in b/mingw-w64-crt/lib32/msvcr120d.def.in
index a5db516..ed503ba 100644
--- a/mingw-w64-crt/lib32/msvcr120d.def.in
+++ b/mingw-w64-crt/lib32/msvcr120d.def.in
@@ -1920,7 +1920,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
; cabsl ; Can't use long double functions from the CRT on x86
@@ -2351,7 +2351,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib32/msvcr80.def.in b/mingw-w64-crt/lib32/msvcr80.def.in
index 9b1b5d1..0f3b0f5 100644
--- a/mingw-w64-crt/lib32/msvcr80.def.in
+++ b/mingw-w64-crt/lib32/msvcr80.def.in
@@ -1303,7 +1303,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
clearerr
@@ -1526,7 +1526,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib32/msvcr80d.def.in b/mingw-w64-crt/lib32/msvcr80d.def.in
index 1931dc3..153dfc4 100644
--- a/mingw-w64-crt/lib32/msvcr80d.def.in
+++ b/mingw-w64-crt/lib32/msvcr80d.def.in
@@ -1386,7 +1386,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA ; overwritten
clearerr
@@ -1609,7 +1609,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib32/msvcr90.def.in b/mingw-w64-crt/lib32/msvcr90.def.in
index 697b928..6df2f0f 100644
--- a/mingw-w64-crt/lib32/msvcr90.def.in
+++ b/mingw-w64-crt/lib32/msvcr90.def.in
@@ -1296,7 +1296,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
clearerr
@@ -1524,7 +1524,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib32/msvcr90d.def.in b/mingw-w64-crt/lib32/msvcr90d.def.in
index f1da7b6..a311af1 100644
--- a/mingw-w64-crt/lib32/msvcr90d.def.in
+++ b/mingw-w64-crt/lib32/msvcr90d.def.in
@@ -1368,7 +1368,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
clearerr
@@ -1596,7 +1596,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib64/msvcr100.def.in b/mingw-w64-crt/lib64/msvcr100.def.in
index 9b6bc48..24698cc 100644
--- a/mingw-w64-crt/lib64/msvcr100.def.in
+++ b/mingw-w64-crt/lib64/msvcr100.def.in
@@ -1612,7 +1612,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
ceilf DATA
@@ -1854,7 +1854,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib64/msvcr100d.def.in b/mingw-w64-crt/lib64/msvcr100d.def.in
index 70793d2..e3c7e1b 100644
--- a/mingw-w64-crt/lib64/msvcr100d.def.in
+++ b/mingw-w64-crt/lib64/msvcr100d.def.in
@@ -1677,7 +1677,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA ; overwritten
ceilf DATA ; overwritten
@@ -1919,7 +1919,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib64/msvcr110.def.in b/mingw-w64-crt/lib64/msvcr110.def.in
index 7779436..8ef9f86 100644
--- a/mingw-w64-crt/lib64/msvcr110.def.in
+++ b/mingw-w64-crt/lib64/msvcr110.def.in
@@ -1736,7 +1736,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil
ceilf
@@ -1978,7 +1978,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib64/msvcr110d.def.in b/mingw-w64-crt/lib64/msvcr110d.def.in
index b86002e..ad13f3a 100644
--- a/mingw-w64-crt/lib64/msvcr110d.def.in
+++ b/mingw-w64-crt/lib64/msvcr110d.def.in
@@ -1801,7 +1801,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil
ceilf
@@ -2043,7 +2043,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/lib64/msvcr120.def.in b/mingw-w64-crt/lib64/msvcr120.def.in
index 3a6bc1a..0401dbf 100644
--- a/mingw-w64-crt/lib64/msvcr120.def.in
+++ b/mingw-w64-crt/lib64/msvcr120.def.in
@@ -1793,7 +1793,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
; cabsl ; Can't use long double functions from the CRT on x86
@@ -2240,7 +2240,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib64/msvcr120d.def.in b/mingw-w64-crt/lib64/msvcr120d.def.in
index f0d8996..bf914c7 100644
--- a/mingw-w64-crt/lib64/msvcr120d.def.in
+++ b/mingw-w64-crt/lib64/msvcr120d.def.in
@@ -1858,7 +1858,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
; cabsl ; Can't use long double functions from the CRT on x86
@@ -2305,7 +2305,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/lib64/msvcr80.def.in b/mingw-w64-crt/lib64/msvcr80.def.in
index 08d9723..aaefaa6 100644
--- a/mingw-w64-crt/lib64/msvcr80.def.in
+++ b/mingw-w64-crt/lib64/msvcr80.def.in
@@ -1235,7 +1235,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
ceilf DATA
@@ -1474,7 +1474,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib64/msvcr80d.def.in b/mingw-w64-crt/lib64/msvcr80d.def.in
index caeb5ce..5888e92 100644
--- a/mingw-w64-crt/lib64/msvcr80d.def.in
+++ b/mingw-w64-crt/lib64/msvcr80d.def.in
@@ -1312,7 +1312,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA ; overwritten
ceilf DATA ; overwritten
@@ -1551,7 +1551,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib64/msvcr90.def.in b/mingw-w64-crt/lib64/msvcr90.def.in
index ddf7bfb..c3524ff 100644
--- a/mingw-w64-crt/lib64/msvcr90.def.in
+++ b/mingw-w64-crt/lib64/msvcr90.def.in
@@ -1232,7 +1232,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
ceilf DATA
@@ -1472,7 +1472,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/lib64/msvcr90d.def.in b/mingw-w64-crt/lib64/msvcr90d.def.in
index c26790c..e88cffa 100644
--- a/mingw-w64-crt/lib64/msvcr90d.def.in
+++ b/mingw-w64-crt/lib64/msvcr90d.def.in
@@ -1298,7 +1298,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil DATA
ceilf DATA
@@ -1538,7 +1538,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wprintf
diff --git a/mingw-w64-crt/libarm32/msvcr110.def.in b/mingw-w64-crt/libarm32/msvcr110.def.in
index f736370..bba35f0 100644
--- a/mingw-w64-crt/libarm32/msvcr110.def.in
+++ b/mingw-w64-crt/libarm32/msvcr110.def.in
@@ -1722,7 +1722,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil
ceilf
@@ -1965,7 +1965,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/libarm32/msvcr110d.def.in b/mingw-w64-crt/libarm32/msvcr110d.def.in
index 66a344c..4ef8581 100644
--- a/mingw-w64-crt/libarm32/msvcr110d.def.in
+++ b/mingw-w64-crt/libarm32/msvcr110d.def.in
@@ -1787,7 +1787,7 @@
atol
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
calloc
ceil
ceilf
@@ -2030,7 +2030,7 @@
wcstombs_s
wcstoul
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wmemcpy_s
diff --git a/mingw-w64-crt/libarm32/msvcr120.def.in b/mingw-w64-crt/libarm32/msvcr120.def.in
index e43e29d..32c423f 100644
--- a/mingw-w64-crt/libarm32/msvcr120.def.in
+++ b/mingw-w64-crt/libarm32/msvcr120.def.in
@@ -1760,7 +1760,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
cabsl
@@ -2208,7 +2208,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/libarm32/msvcr120d.def.in b/mingw-w64-crt/libarm32/msvcr120d.def.in
index 7241a9e..84faada 100644
--- a/mingw-w64-crt/libarm32/msvcr120d.def.in
+++ b/mingw-w64-crt/libarm32/msvcr120d.def.in
@@ -1825,7 +1825,7 @@
atoll
bsearch
bsearch_s
-btowc
+; btowc ; use replacement
cabs
cabsf
cabsl
@@ -2273,7 +2273,7 @@
wcstoull
wcstoumax
wcsxfrm
-wctob
+; wctob ; use replacement
wctomb
wctomb_s
wctrans
diff --git a/mingw-w64-crt/misc/ucrt_btowc.c b/mingw-w64-crt/misc/ucrt_btowc.c
new file mode 100644
index 0000000..2424f6e
--- /dev/null
+++ b/mingw-w64-crt/misc/ucrt_btowc.c
@@ -0,0 +1,9 @@
+/**
+ * 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.
+ */
+
+#undef __MSVCRT_VERSION__
+#define _UCRT
+#include "btowc.c"
diff --git a/mingw-w64-crt/misc/ucrt_wctob.c b/mingw-w64-crt/misc/ucrt_wctob.c
new file mode 100644
index 0000000..4e7a1ac
--- /dev/null
+++ b/mingw-w64-crt/misc/ucrt_wctob.c
@@ -0,0 +1,9 @@
+/**
+ * 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.
+ */
+
+#undef __MSVCRT_VERSION__
+#define _UCRT
+#include "wctob.c"