Hi, This is a series of patches, which essentially does three different things.
The ultimate target of the series is to fix a regression; in 581532b8e49a0e10cbdfe2332a8c1d61ff3d6820, tchar.h started referencing __ms_ prefixed symbols for many functions, even if UCRT didn't actually provide those symbols. This issue was quickly noticed at https://github.com/msys2/MINGW-packages/pull/22697#issuecomment-2541206219. We did a quick fix for this in c9eca28decb3aa5213fe22ab1f9883df91d79806, by providing a separate __ms_fprintf function. However, doing the same, providing separate __ms_ prefixed concrete functions for UCRT, for all the relevant functions, felt like overkill. (The __ms_ prefixed functions are really only meant to be set up via aliases in .def files, or similar.) Meanwhile, another case of a regression from 581532b8e49a0e10cbdfe2332a8c1d61ff3d6820 was uncovered in https://github.com/git-for-windows/build-extra/commit/b1b6eb5c5d78c4d8da53c4daa6aa6cf7dae7f8fb; they also use _tprintf and _stscanf, which end up as undefined references to __ms_printf and __ms_sscanf, so a full solution is needed (or 581532b8e49a0e10cbdfe2332a8c1d61ff3d6820 would need to be reverted). This patchset fixes the __ms_ prefixed functions for UCRT, by redirecting them to the regular implementations, using __MINGW_ASM_CALL(). In order to do that, we need to provide all the relevant *wprintf and *wscanf functions as non-inline functions. Before converting the wide char UCRT stdio functions to non-inline, I wanted a better solution to setting the UCRT stdio options, in order to be able to switch between the C99 and legacy wide specifiers for format strings. Therefore, this patch series does these three major steps: - Allows changing _CRT_INTERNAL_LOCAL_PRINTF_OPTIONS and _CRT_INTERNAL_LOCAL_SCANF_OPTIONS at runtime by assigning to it, similar to how it works in MSVC - Converts most *wprintf and *wscanf functions to non-inline - Redirects __ms_ functions to the right ones using __MINGW_ASM_CALL() in headers // Martin Martin Storsjö (10): crt: Remove workarounds for defining non-inline versions of inline functions crt: Make ucrt_fwprintf consistent with the other ucrt_* files headers, crt: Convert the UCRT stdio options to a mutable state crt: Use _CRT_INTERNAL_LOCAL_SCANF_OPTIONS in non-inline scanf functions crt: Use the default _CRT_INTERNAL_LOCAL_PRINTF_OPTIONS in __ms_fwprintf crt: Sort the stdio filenames in src_ucrtbase in alphabetical order crt, headers: Convert the UCRT *wprintf functions to non-inline crt, headers: Convert the UCRT *wscanf functions to non-inline headers: Redirect __ms_<func> back to plain <func> for UCRT crt: Remove the separate UCRT __ms_fprintf function Pali Rohár (1): headers: Declare __ms_vsscanf, __ms_vscanf, __ms_vfscanf, __ms_vswscanf, __ms_vwscanf, __ms_vfwscanf, __ms_snprintf, __ms_vsnprintf, __ms_snwprintf and __ms_vsnwprintf also for UCRT builds mingw-w64-crt/Makefile.am | 32 ++- .../stdio/ucrt___local_stdio_printf_options.c | 15 ++ .../stdio/ucrt___local_stdio_scanf_options.c | 15 ++ mingw-w64-crt/stdio/ucrt__snscanf.c | 2 +- mingw-w64-crt/stdio/ucrt__snwprintf.c | 16 -- mingw-w64-crt/stdio/ucrt_fscanf.c | 2 +- mingw-w64-crt/stdio/ucrt_fwprintf.c | 18 +- mingw-w64-crt/stdio/ucrt_fwscanf.c | 19 ++ mingw-w64-crt/stdio/ucrt_ms_fwprintf.c | 2 +- mingw-w64-crt/stdio/ucrt_scanf.c | 2 +- mingw-w64-crt/stdio/ucrt_snwprintf.c | 21 ++ mingw-w64-crt/stdio/ucrt_sscanf.c | 2 +- mingw-w64-crt/stdio/ucrt_swprintf.c | 31 +++ mingw-w64-crt/stdio/ucrt_swscanf.c | 20 ++ mingw-w64-crt/stdio/ucrt_vfscanf.c | 2 +- mingw-w64-crt/stdio/ucrt_vfwprintf.c | 15 ++ mingw-w64-crt/stdio/ucrt_vfwscanf.c | 14 + mingw-w64-crt/stdio/ucrt_vscanf.c | 2 +- mingw-w64-crt/stdio/ucrt_vsnwprintf.c | 16 ++ mingw-w64-crt/stdio/ucrt_vsscanf.c | 2 +- mingw-w64-crt/stdio/ucrt_vswprintf.c | 28 ++ mingw-w64-crt/stdio/ucrt_vswscanf.c | 14 + mingw-w64-crt/stdio/ucrt_vwprintf.c | 15 ++ mingw-w64-crt/stdio/ucrt_vwscanf.c | 14 + .../{ucrt_ms_fprintf.c => ucrt_wprintf.c} | 13 +- mingw-w64-crt/stdio/ucrt_wscanf.c | 19 ++ mingw-w64-headers/crt/_mingw.h.in | 6 + mingw-w64-headers/crt/corecrt_stdio_config.h | 14 +- mingw-w64-headers/crt/stdio.h | 242 +++++++----------- mingw-w64-headers/crt/wchar.h | 181 ++++--------- 30 files changed, 451 insertions(+), 343 deletions(-) create mode 100644 mingw-w64-crt/stdio/ucrt___local_stdio_printf_options.c create mode 100644 mingw-w64-crt/stdio/ucrt___local_stdio_scanf_options.c create mode 100644 mingw-w64-crt/stdio/ucrt_fwscanf.c create mode 100644 mingw-w64-crt/stdio/ucrt_snwprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_swprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_swscanf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vfwprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vfwscanf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vsnwprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vswprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vswscanf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vwprintf.c create mode 100644 mingw-w64-crt/stdio/ucrt_vwscanf.c rename mingw-w64-crt/stdio/{ucrt_ms_fprintf.c => ucrt_wprintf.c} (53%) create mode 100644 mingw-w64-crt/stdio/ucrt_wscanf.c -- 2.43.0 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public