MinGW-w64 still does not provide full ISO C95 or C99 compatibility for applications. I was looking what is missing to get runtime library compatibility for ISO C95. And I identified that missing parts for C95 are wcstok() and (v)swprintf() functions, which signatures in header files and msvcrt.dll symbols are incompatible.
This patch series implements wcstok() and (v)swprintf() functions compatible with C95 and C99 (and should be compatible also with later ISO C versions). And brings C95 compatibility for all CRT import libraries. In __USE_MINGW_ANSI_STDIO=0 mode (v)swprintf() has one deviation from ISO C95, its %s takes wchar_t* instead of char*. This is because of msvcrt behavior. For C99 there are more deviations: missing C99 formats which are unsupported by msvcr* DLL. In __USE_MINGW_ANSI_STDIO=1 mode (v)swprintf() should be fully compatible with ISO C95 and C99. This patch series also aligns API/ABI of (v)sw(n)printf() functions between different __USE_MINGW_ANSI_STDIO modes, to make it sane and consistent. There are also new automated tests for some printf functions, so I would be happy if somebody check that they are passing also on other machine than mine. I do not know of any other missing C95 functionality in MinGW-w64 but it does not mean that there cannot be something still hidden. Note that MinGW-w64 currently has swprintf() and wcstok() incompatible with ISO C95+ and these changes will break compilation of applications which depends on the current behavior. But this behavior is incompatible with MSVC and also with Linux glibc headers, so I'm not sure how big problem it is. I think that having swprintf() and wcstok() function signatures different from what is in ISO C is bigger problem. Previous API could be achieved by -D_CRT_NON_CONFORMING_SWPRINTFS and -D_CRT_NON_CONFORMING_WCSTOK options (same as with msvc). Also note that fix for wcstok() for clang builds would require Martin's changes to llvm dlltool and linker. Pali Rohár (15): crt: Add support for C95 wcstok() function for non-UCRT import libraries headers: Fix _tcstok and _wcstok_l macros in _UNICODE mode crt: Add support for C95 (v)swprintf() functions when __USE_MINGW_ANSI_STDIO=0 crt: Add support for C95 (v)swprintf() functions when __USE_MINGW_ANSI_STDIO=1 crt: Fix non-ISO (v)snwprintf() functions when __USE_MINGW_ANSI_STDIO=0 crt: Add _(v)scwprintf emulation for msvcrt.dll headers: Fix _stprintf and _vstprintf macros in _UNICODE mode headers: Fix _*tscanf and _*tprintf macros which expands to ISO C functions crt: Add snprintf test crt: Add swprintf test crt: Add snwprintf test crt: Add _stprintf test crt: crtdll and msvcrt10: Add support for C95 getwc(), getwchar(), putwc(), putwchar() functions crt: crtdll and msvcrt10: Add support for C95 fputws() function crt: crtdll and msvcrt10: Add support for C95 fgetws() function mingw-w64-crt/Makefile.am | 60 ++++++++++++-- mingw-w64-crt/def-include/crt-aliases.def.in | 21 ++--- mingw-w64-crt/lib-common/msvcr120_app.def.in | 3 +- mingw-w64-crt/lib-common/msvcrt.def.in | 25 +++--- mingw-w64-crt/lib32/crtdll.def.in | 8 +- mingw-w64-crt/lib32/msvcr100.def.in | 3 +- mingw-w64-crt/lib32/msvcr100d.def.in | 3 +- mingw-w64-crt/lib32/msvcr110.def.in | 3 +- mingw-w64-crt/lib32/msvcr110d.def.in | 3 +- mingw-w64-crt/lib32/msvcr120.def.in | 5 +- mingw-w64-crt/lib32/msvcr120d.def.in | 5 +- mingw-w64-crt/lib32/msvcr40d.def.in | 7 +- mingw-w64-crt/lib32/msvcr70.def.in | 7 +- mingw-w64-crt/lib32/msvcr70d.def.in | 7 +- mingw-w64-crt/lib32/msvcr71.def.in | 7 +- mingw-w64-crt/lib32/msvcr71d.def.in | 7 +- mingw-w64-crt/lib32/msvcr80.def.in | 3 +- mingw-w64-crt/lib32/msvcr80d.def.in | 3 +- mingw-w64-crt/lib32/msvcr90.def.in | 3 +- mingw-w64-crt/lib32/msvcr90d.def.in | 3 +- mingw-w64-crt/lib32/msvcrt10.def.in | 8 +- mingw-w64-crt/lib32/msvcrt20.def.in | 7 +- mingw-w64-crt/lib32/msvcrt40.def.in | 7 +- mingw-w64-crt/lib32/msvcrtd.def.in | 7 +- mingw-w64-crt/lib64/msvcr100.def.in | 3 +- mingw-w64-crt/lib64/msvcr100d.def.in | 3 +- mingw-w64-crt/lib64/msvcr110.def.in | 3 +- mingw-w64-crt/lib64/msvcr110d.def.in | 3 +- mingw-w64-crt/lib64/msvcr120.def.in | 5 +- mingw-w64-crt/lib64/msvcr120d.def.in | 5 +- mingw-w64-crt/lib64/msvcr80.def.in | 3 +- mingw-w64-crt/lib64/msvcr80d.def.in | 3 +- mingw-w64-crt/lib64/msvcr90.def.in | 3 +- mingw-w64-crt/lib64/msvcr90d.def.in | 3 +- mingw-w64-crt/libarm32/msvcr110.def.in | 3 +- mingw-w64-crt/libarm32/msvcr110d.def.in | 3 +- mingw-w64-crt/libarm32/msvcr120.def.in | 3 +- mingw-w64-crt/libarm32/msvcr120d.def.in | 3 +- mingw-w64-crt/stdio/_scwprintf.c | 67 +++++++++++++++ mingw-w64-crt/stdio/_vscwprintf.c | 87 ++++++++++++++++++++ mingw-w64-crt/stdio/fgetws.c | 59 +++++++++++++ mingw-w64-crt/stdio/fputws.c | 12 +++ mingw-w64-crt/stdio/mingw_pformat.h | 11 ++- mingw-w64-crt/stdio/mingw_sprintfw.c | 4 +- mingw-w64-crt/stdio/mingw_vsnprintf.c | 18 ++++ mingw-w64-crt/stdio/mingw_vsprintfw.c | 4 +- mingw-w64-crt/stdio/snwprintf.c | 2 +- mingw-w64-crt/stdio/swprintf.c | 18 ++++ mingw-w64-crt/stdio/swprintf_alias.c | 26 ++++++ mingw-w64-crt/stdio/vsnwprintf.c | 20 ++++- mingw-w64-crt/stdio/vswprintf.c | 21 +++++ mingw-w64-crt/stdio/vswprintf_alias.c | 20 +++++ mingw-w64-crt/string/ucrt__wcstok.c | 14 ++++ mingw-w64-crt/string/wcstok.c | 41 +++++++++ mingw-w64-crt/testcases/t_snprintf.c | 1 + mingw-w64-crt/testcases/t_snprintf0.c | 2 + mingw-w64-crt/testcases/t_snprintf1.c | 2 + mingw-w64-crt/testcases/t_snprintf_tmpl.h | 18 ++++ mingw-w64-crt/testcases/t_snwprintf.c | 1 + mingw-w64-crt/testcases/t_snwprintf0.c | 2 + mingw-w64-crt/testcases/t_snwprintf1.c | 2 + mingw-w64-crt/testcases/t_snwprintf_tmpl.h | 18 ++++ mingw-w64-crt/testcases/t_stprintf0_a.c | 3 + mingw-w64-crt/testcases/t_stprintf0_u.c | 3 + mingw-w64-crt/testcases/t_stprintf1_a.c | 3 + mingw-w64-crt/testcases/t_stprintf1_u.c | 3 + mingw-w64-crt/testcases/t_stprintf_a.c | 2 + mingw-w64-crt/testcases/t_stprintf_tmpl.h | 34 ++++++++ mingw-w64-crt/testcases/t_stprintf_u.c | 2 + mingw-w64-crt/testcases/t_swprintf.c | 1 + mingw-w64-crt/testcases/t_swprintf0.c | 2 + mingw-w64-crt/testcases/t_swprintf1.c | 2 + mingw-w64-crt/testcases/t_swprintf_tmpl.h | 18 ++++ mingw-w64-headers/crt/stdio.h | 85 +++++++++++++------ mingw-w64-headers/crt/string.h | 11 ++- mingw-w64-headers/crt/swprintf.inl | 37 +-------- mingw-w64-headers/crt/tchar.h | 40 ++++----- mingw-w64-headers/crt/wchar.h | 83 ++++++++++++------- 78 files changed, 829 insertions(+), 231 deletions(-) create mode 100644 mingw-w64-crt/stdio/_scwprintf.c create mode 100644 mingw-w64-crt/stdio/_vscwprintf.c create mode 100644 mingw-w64-crt/stdio/fgetws.c create mode 100644 mingw-w64-crt/stdio/fputws.c create mode 100644 mingw-w64-crt/stdio/swprintf.c create mode 100644 mingw-w64-crt/stdio/swprintf_alias.c create mode 100644 mingw-w64-crt/stdio/vswprintf.c create mode 100644 mingw-w64-crt/stdio/vswprintf_alias.c create mode 100644 mingw-w64-crt/string/ucrt__wcstok.c create mode 100644 mingw-w64-crt/string/wcstok.c create mode 100644 mingw-w64-crt/testcases/t_snprintf.c create mode 100644 mingw-w64-crt/testcases/t_snprintf0.c create mode 100644 mingw-w64-crt/testcases/t_snprintf1.c create mode 100644 mingw-w64-crt/testcases/t_snprintf_tmpl.h create mode 100644 mingw-w64-crt/testcases/t_snwprintf.c create mode 100644 mingw-w64-crt/testcases/t_snwprintf0.c create mode 100644 mingw-w64-crt/testcases/t_snwprintf1.c create mode 100644 mingw-w64-crt/testcases/t_snwprintf_tmpl.h create mode 100644 mingw-w64-crt/testcases/t_stprintf0_a.c create mode 100644 mingw-w64-crt/testcases/t_stprintf0_u.c create mode 100644 mingw-w64-crt/testcases/t_stprintf1_a.c create mode 100644 mingw-w64-crt/testcases/t_stprintf1_u.c create mode 100644 mingw-w64-crt/testcases/t_stprintf_a.c create mode 100644 mingw-w64-crt/testcases/t_stprintf_tmpl.h create mode 100644 mingw-w64-crt/testcases/t_stprintf_u.c create mode 100644 mingw-w64-crt/testcases/t_swprintf.c create mode 100644 mingw-w64-crt/testcases/t_swprintf0.c create mode 100644 mingw-w64-crt/testcases/t_swprintf1.c create mode 100644 mingw-w64-crt/testcases/t_swprintf_tmpl.h -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public