ISO C99 allows to pass NULL path to freopen() function, in which case
freopen() just modifies mode on existing open FILE* stream. CRT
libraries crtdll, msvcrt and UCRT do not accept NULL path in freopen()
and returns error.

These changes implements missing functionality.

The primary use case of this functionality is ability to switch stdout
to binary mode by:

  freopen(NULL, "ab", stdout);

or

  freopen(NULL, "wb", stdout);

Useful together with stdout redirection to file done by caller.
E.g. usage of "cat" utility.

Pali Rohár (5):
  headers: Update struct _iobuf for UCRT
  headers: Define missing _IOCOMMIT FILE* stream flag
  headers: Enable _IO* flags also for UCRT builds
  crt: Declare _commode and __p__commode() in internal.h
  crt: Add support to call freopen() with NULL path

 mingw-w64-crt/Makefile.am                     |   2 +
 mingw-w64-crt/crt/crtexe.c                    |   2 -
 mingw-w64-crt/def-include/crt-aliases.def.in  |   2 +-
 mingw-w64-crt/include/internal.h              |   5 +
 .../api-ms-win-crt-stdio-l1-1-0.def           |   4 +-
 mingw-w64-crt/lib-common/msvcr120_app.def.in  |   2 +-
 mingw-w64-crt/lib-common/msvcrt.def.in        |   2 +-
 .../lib-common/ucrtbase-common.def.in         |   2 +-
 mingw-w64-crt/lib32/crtdll.def.in             |   2 +-
 mingw-w64-crt/lib32/msvcr100.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr100d.def.in          |   2 +-
 mingw-w64-crt/lib32/msvcr110.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr110d.def.in          |   2 +-
 mingw-w64-crt/lib32/msvcr120.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr120d.def.in          |   2 +-
 mingw-w64-crt/lib32/msvcr40d.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr70.def.in            |   2 +-
 mingw-w64-crt/lib32/msvcr70d.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr71.def.in            |   2 +-
 mingw-w64-crt/lib32/msvcr71d.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr80.def.in            |   2 +-
 mingw-w64-crt/lib32/msvcr80d.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcr90.def.in            |   2 +-
 mingw-w64-crt/lib32/msvcr90d.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcrt10.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcrt20.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcrt40.def.in           |   2 +-
 mingw-w64-crt/lib32/msvcrtd.def.in            |   2 +-
 mingw-w64-crt/lib64/msvcr100.def.in           |   2 +-
 mingw-w64-crt/lib64/msvcr100d.def.in          |   2 +-
 mingw-w64-crt/lib64/msvcr110.def.in           |   2 +-
 mingw-w64-crt/lib64/msvcr110d.def.in          |   2 +-
 mingw-w64-crt/lib64/msvcr120.def.in           |   2 +-
 mingw-w64-crt/lib64/msvcr120d.def.in          |   2 +-
 mingw-w64-crt/lib64/msvcr80.def.in            |   2 +-
 mingw-w64-crt/lib64/msvcr80d.def.in           |   2 +-
 mingw-w64-crt/lib64/msvcr90.def.in            |   2 +-
 mingw-w64-crt/lib64/msvcr90d.def.in           |   2 +-
 mingw-w64-crt/libarm32/msvcr110.def.in        |   2 +-
 mingw-w64-crt/libarm32/msvcr110d.def.in       |   2 +-
 mingw-w64-crt/libarm32/msvcr120.def.in        |   2 +-
 mingw-w64-crt/libarm32/msvcr120d.def.in       |   2 +-
 mingw-w64-crt/stdio/freopen.c                 | 315 ++++++++++++++++++
 mingw-w64-crt/stdio/ucrt_freopen.c            |   3 +
 mingw-w64-crt/testcases/Makefile.am           |   1 +
 mingw-w64-crt/testcases/t_freopen.c           |   9 +
 mingw-w64-headers/crt/mbstring.h              |  26 +-
 mingw-w64-headers/crt/stdio.h                 |  27 +-
 mingw-w64-headers/crt/wchar.h                 |  26 +-
 49 files changed, 445 insertions(+), 51 deletions(-)
 create mode 100644 mingw-w64-crt/stdio/freopen.c
 create mode 100644 mingw-w64-crt/stdio/ucrt_freopen.c
 create mode 100644 mingw-w64-crt/testcases/t_freopen.c

-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to