crt: replace is[w]print functions for crtdll.dll...msvcr110.dll CRT's iw[w]print functions return inconsistent results for TAB character. See comments in isprint.c and iswprint.c for behavior summary. Signed-off-by: Kirill Makurin <maiddaisuki@outlook.com> Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index a6c593a..978294e 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am
@@ -358,7 +358,9 @@ misc/imaxdiv.c \ misc/invalid_parameter_handler.c \ misc/isblank.c \ + misc/isprint.c \ misc/iswblank.c \ + misc/iswprint.c \ misc/_isblank_l.c \ misc/_iswblank_l.c \ misc/wctrans.c \ @@ -1035,7 +1037,9 @@ $(src_msvcrt_add_vscanf) \ math/i386__copysignf.c \ misc/isblank.c \ + misc/isprint.c \ misc/iswblank.c \ + misc/iswprint.c \ misc/wctrans.c \ misc/wctype.c \ stdio/scanf.S
diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in index 2cd26c9..500d076 100644 --- a/mingw-w64-crt/lib-common/msvcrt.def.in +++ b/mingw-w64-crt/lib-common/msvcrt.def.in
@@ -999,7 +999,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1011,7 +1011,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/crtdll.def.in b/mingw-w64-crt/lib32/crtdll.def.in index b76b7c7..0062013 100644 --- a/mingw-w64-crt/lib32/crtdll.def.in +++ b/mingw-w64-crt/lib32/crtdll.def.in
@@ -392,7 +392,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -404,7 +404,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr100.def.in b/mingw-w64-crt/lib32/msvcr100.def.in index a5c1d9d..50d3169 100644 --- a/mingw-w64-crt/lib32/msvcr100.def.in +++ b/mingw-w64-crt/lib32/msvcr100.def.in
@@ -1726,7 +1726,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1738,7 +1738,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr100d.def.in b/mingw-w64-crt/lib32/msvcr100d.def.in index 5881ef8..ee5717d 100644 --- a/mingw-w64-crt/lib32/msvcr100d.def.in +++ b/mingw-w64-crt/lib32/msvcr100d.def.in
@@ -1792,7 +1792,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1804,7 +1804,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr110.def.in b/mingw-w64-crt/lib32/msvcr110.def.in index 2dd9e2c..09a7e68 100644 --- a/mingw-w64-crt/lib32/msvcr110.def.in +++ b/mingw-w64-crt/lib32/msvcr110.def.in
@@ -1858,7 +1858,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1870,7 +1870,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr110d.def.in b/mingw-w64-crt/lib32/msvcr110d.def.in index 58aace1..3448d40 100644 --- a/mingw-w64-crt/lib32/msvcr110d.def.in +++ b/mingw-w64-crt/lib32/msvcr110d.def.in
@@ -1925,7 +1925,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1937,7 +1937,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr40d.def.in b/mingw-w64-crt/lib32/msvcr40d.def.in index 88309a7..73598f8 100644 --- a/mingw-w64-crt/lib32/msvcr40d.def.in +++ b/mingw-w64-crt/lib32/msvcr40d.def.in
@@ -1521,7 +1521,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1533,7 +1533,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr70.def.in b/mingw-w64-crt/lib32/msvcr70.def.in index af020cb..b05ed5a 100644 --- a/mingw-w64-crt/lib32/msvcr70.def.in +++ b/mingw-w64-crt/lib32/msvcr70.def.in
@@ -771,7 +771,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -783,7 +783,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr70d.def.in b/mingw-w64-crt/lib32/msvcr70d.def.in index 19610ee..727c056 100644 --- a/mingw-w64-crt/lib32/msvcr70d.def.in +++ b/mingw-w64-crt/lib32/msvcr70d.def.in
@@ -815,7 +815,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -827,7 +827,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr71.def.in b/mingw-w64-crt/lib32/msvcr71.def.in index 63d0594..1175bed 100644 --- a/mingw-w64-crt/lib32/msvcr71.def.in +++ b/mingw-w64-crt/lib32/msvcr71.def.in
@@ -765,7 +765,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -777,7 +777,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr71d.def.in b/mingw-w64-crt/lib32/msvcr71d.def.in index 5beec6e..27da9e0 100644 --- a/mingw-w64-crt/lib32/msvcr71d.def.in +++ b/mingw-w64-crt/lib32/msvcr71d.def.in
@@ -809,7 +809,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -821,7 +821,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr80.def.in b/mingw-w64-crt/lib32/msvcr80.def.in index c622479..96db56f 100644 --- a/mingw-w64-crt/lib32/msvcr80.def.in +++ b/mingw-w64-crt/lib32/msvcr80.def.in
@@ -1365,7 +1365,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1377,7 +1377,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr80d.def.in b/mingw-w64-crt/lib32/msvcr80d.def.in index 65959c4..d39efa4 100644 --- a/mingw-w64-crt/lib32/msvcr80d.def.in +++ b/mingw-w64-crt/lib32/msvcr80d.def.in
@@ -1448,7 +1448,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1460,7 +1460,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr90.def.in b/mingw-w64-crt/lib32/msvcr90.def.in index 94d877a..4e445a6 100644 --- a/mingw-w64-crt/lib32/msvcr90.def.in +++ b/mingw-w64-crt/lib32/msvcr90.def.in
@@ -1360,7 +1360,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1372,7 +1372,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcr90d.def.in b/mingw-w64-crt/lib32/msvcr90d.def.in index 1d5354d..e5f3430 100644 --- a/mingw-w64-crt/lib32/msvcr90d.def.in +++ b/mingw-w64-crt/lib32/msvcr90d.def.in
@@ -1432,7 +1432,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1444,7 +1444,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcrt10.def.in b/mingw-w64-crt/lib32/msvcrt10.def.in index 3129298..768120a 100644 --- a/mingw-w64-crt/lib32/msvcrt10.def.in +++ b/mingw-w64-crt/lib32/msvcrt10.def.in
@@ -1167,7 +1167,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1179,7 +1179,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcrt20.def.in b/mingw-w64-crt/lib32/msvcrt20.def.in index a61c945..e62d673 100644 --- a/mingw-w64-crt/lib32/msvcrt20.def.in +++ b/mingw-w64-crt/lib32/msvcrt20.def.in
@@ -1389,7 +1389,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1401,7 +1401,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcrt40.def.in b/mingw-w64-crt/lib32/msvcrt40.def.in index 83798ed..5c533e0 100644 --- a/mingw-w64-crt/lib32/msvcrt40.def.in +++ b/mingw-w64-crt/lib32/msvcrt40.def.in
@@ -1489,7 +1489,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1501,7 +1501,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib32/msvcrtd.def.in b/mingw-w64-crt/lib32/msvcrtd.def.in index 80189d2..34b1fcb 100644 --- a/mingw-w64-crt/lib32/msvcrtd.def.in +++ b/mingw-w64-crt/lib32/msvcrtd.def.in
@@ -715,7 +715,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -727,7 +727,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr100.def.in b/mingw-w64-crt/lib64/msvcr100.def.in index 8db1ba9..7e70caa 100644 --- a/mingw-w64-crt/lib64/msvcr100.def.in +++ b/mingw-w64-crt/lib64/msvcr100.def.in
@@ -1681,7 +1681,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1693,7 +1693,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr100d.def.in b/mingw-w64-crt/lib64/msvcr100d.def.in index fcb7c7c..65ed8c2 100644 --- a/mingw-w64-crt/lib64/msvcr100d.def.in +++ b/mingw-w64-crt/lib64/msvcr100d.def.in
@@ -1746,7 +1746,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1758,7 +1758,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr110.def.in b/mingw-w64-crt/lib64/msvcr110.def.in index f0b338e..aea6fab 100644 --- a/mingw-w64-crt/lib64/msvcr110.def.in +++ b/mingw-w64-crt/lib64/msvcr110.def.in
@@ -1805,7 +1805,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1817,7 +1817,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr110d.def.in b/mingw-w64-crt/lib64/msvcr110d.def.in index 4b65455..ee51330 100644 --- a/mingw-w64-crt/lib64/msvcr110d.def.in +++ b/mingw-w64-crt/lib64/msvcr110d.def.in
@@ -1870,7 +1870,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1882,7 +1882,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr80.def.in b/mingw-w64-crt/lib64/msvcr80.def.in index 1c3ef7e..db1710d 100644 --- a/mingw-w64-crt/lib64/msvcr80.def.in +++ b/mingw-w64-crt/lib64/msvcr80.def.in
@@ -1303,7 +1303,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1315,7 +1315,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr80d.def.in b/mingw-w64-crt/lib64/msvcr80d.def.in index db27778..a28217c 100644 --- a/mingw-w64-crt/lib64/msvcr80d.def.in +++ b/mingw-w64-crt/lib64/msvcr80d.def.in
@@ -1380,7 +1380,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1392,7 +1392,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr90.def.in b/mingw-w64-crt/lib64/msvcr90.def.in index ae71689..1bc3045 100644 --- a/mingw-w64-crt/lib64/msvcr90.def.in +++ b/mingw-w64-crt/lib64/msvcr90.def.in
@@ -1301,7 +1301,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1313,7 +1313,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/lib64/msvcr90d.def.in b/mingw-w64-crt/lib64/msvcr90d.def.in index 0982871..864e0e1 100644 --- a/mingw-w64-crt/lib64/msvcr90d.def.in +++ b/mingw-w64-crt/lib64/msvcr90d.def.in
@@ -1367,7 +1367,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1379,7 +1379,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/libarm32/msvcr110.def.in b/mingw-w64-crt/libarm32/msvcr110.def.in index b2d9486..d708540 100644 --- a/mingw-w64-crt/libarm32/msvcr110.def.in +++ b/mingw-w64-crt/libarm32/msvcr110.def.in
@@ -1792,7 +1792,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1804,7 +1804,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/libarm32/msvcr110d.def.in b/mingw-w64-crt/libarm32/msvcr110d.def.in index 7c30d86..80a3e30 100644 --- a/mingw-w64-crt/libarm32/msvcr110d.def.in +++ b/mingw-w64-crt/libarm32/msvcr110d.def.in
@@ -1857,7 +1857,7 @@ isgraph isleadbyte islower -isprint +; isprint ; replaced by emu, CRT version mishandles TAB character ispunct isspace isupper @@ -1869,7 +1869,7 @@ iswdigit iswgraph iswlower -iswprint +; iswprint ; replaced by emu, CRT version mishandles TAB character iswpunct iswspace iswupper
diff --git a/mingw-w64-crt/misc/isprint.c b/mingw-w64-crt/misc/isprint.c new file mode 100644 index 0000000..0b9dfe4 --- /dev/null +++ b/mingw-w64-crt/misc/isprint.c
@@ -0,0 +1,28 @@ +/** + * 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. + */ + +#define _CTYPE_DISABLE_MACROS +#include <ctype.h> + +/** + * Calls to `isprint ('\t')` return inconsistent results depending on CRT + * and active locale. + * + * In all CRTs up to msvcr110.dll, it returns zero in "C" locale + * and non-zero otherwise. + * + * In msvcr120.dll and UCRT, it always returns zero. + */ + +int __cdecl isprint (int _C) { + if (_C == '\t') { + return 0; + } + + return _isctype (_C, _ALPHA | _BLANK | _DIGIT | _PUNCT); +} + +int (__cdecl *__MINGW_IMP_SYMBOL(isprint))(int) = isprint;
diff --git a/mingw-w64-crt/misc/iswprint.c b/mingw-w64-crt/misc/iswprint.c new file mode 100644 index 0000000..698b766 --- /dev/null +++ b/mingw-w64-crt/misc/iswprint.c
@@ -0,0 +1,31 @@ +/** + * 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. + */ + +#define _CTYPE_DISABLE_MACROS +#include <wctype.h> + +/** + * Calls to `iswprint (L'\t')` return inconsistent results depending on CRT + * and active locale. + * + * In all CRTs up to msvcrt.dll version 6.1, it returns zero in "C" locale + * and non-zero otherwise. + * + * Since msvcr70.dll up to msvcr110.dll, it always returns non-zero; + * OS-specific versions of msvcrt.dll follow this behavior. + * + * In msvcr120.dll and UCRT, it always returns zero. + */ + +int __cdecl iswprint (wint_t _C) { + /** + * mingw-w64's `iswctype` is a wrapper around CRT's `iswctype` which + * properly handles TAB character. + */ + return iswctype (_C, _ALPHA | _BLANK | _DIGIT | _PUNCT); +} + +int (__cdecl *__MINGW_IMP_SYMBOL(iswprint))(wint_t) = iswprint;