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

Reply via email to