UCRT's struct _iobuf is slightly different than the msvcrt struct _iobuf. It swapped order of _base and _cnt members plus has additional _lock member. And member _flag was renamed to _flags. In public header was member _ptr renamed to _Placeholder.
To make the struct _iobuf compatible _at source level_, declare the renamed members in union to allow accessing members under both old and new names. --- mingw-w64-headers/crt/mbstring.h | 26 ++++++++++++++++++++++++-- mingw-w64-headers/crt/stdio.h | 24 +++++++++++++++++++++--- mingw-w64-headers/crt/wchar.h | 26 ++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/mingw-w64-headers/crt/mbstring.h b/mingw-w64-headers/crt/mbstring.h index e9e43a13a1e1..6e393f08c36a 100644 --- a/mingw-w64-headers/crt/mbstring.h +++ b/mingw-w64-headers/crt/mbstring.h @@ -16,14 +16,36 @@ extern "C" { #ifndef _FILE_DEFINED struct _iobuf { - char *_ptr; + union { + void *_Placeholder; /* UCRT name in public header */ + char *_ptr; /* msvcrt name and UCRT name in private header */ + }; +#ifdef _UCRT + char *_base; + int _cnt; +#else int _cnt; char *_base; - int _flag; +#endif + union { + int _flags; /* UCRT name */ + int _flag; /* msvcrt name */ + }; int _file; int _charbuf; int _bufsiz; char *_tmpfname; +#ifdef _UCRT + #ifdef _WINDOWS_ + CRITICAL_SECTION _lock; + #else /* building without windows.h */ + #ifdef _WIN64 + struct { char data[24]; } _lock; /* placeholder with same size as 64-bit CRITICAL_SECTION */ + #else + struct { char data[40]; } _lock; /* placeholder with same size as 32-bit CRITICAL_SECTION */ + #endif + #endif +#endif }; typedef struct _iobuf FILE; #define _FILE_DEFINED diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h index 721b68463351..1d9603b81d48 100644 --- a/mingw-w64-headers/crt/stdio.h +++ b/mingw-w64-headers/crt/stdio.h @@ -31,17 +31,35 @@ extern "C" { #ifndef _FILE_DEFINED struct _iobuf { + union { + void *_Placeholder; /* UCRT name in public header */ + char *_ptr; /* msvcrt name and UCRT name in private header */ + }; #ifdef _UCRT - void *_Placeholder; + char *_base; + int _cnt; #else - char *_ptr; int _cnt; char *_base; - int _flag; +#endif + union { + int _flags; /* UCRT name */ + int _flag; /* msvcrt name */ + }; int _file; int _charbuf; int _bufsiz; char *_tmpfname; +#ifdef _UCRT + #ifdef _WINDOWS_ + CRITICAL_SECTION _lock; + #else /* building without windows.h */ + #ifdef _WIN64 + struct { char data[24]; } _lock; /* placeholder with same size as 64-bit CRITICAL_SECTION */ + #else + struct { char data[40]; } _lock; /* placeholder with same size as 32-bit CRITICAL_SECTION */ + #endif + #endif #endif }; typedef struct _iobuf FILE; diff --git a/mingw-w64-headers/crt/wchar.h b/mingw-w64-headers/crt/wchar.h index 898d0e821b76..4ad17b44cffb 100644 --- a/mingw-w64-headers/crt/wchar.h +++ b/mingw-w64-headers/crt/wchar.h @@ -41,14 +41,36 @@ extern "C" { #ifndef _FILE_DEFINED struct _iobuf { - char *_ptr; + union { + void *_Placeholder; /* UCRT name in public header */ + char *_ptr; /* msvcrt name and UCRT name in private header */ + }; +#ifdef _UCRT + char *_base; + int _cnt; +#else int _cnt; char *_base; - int _flag; +#endif + union { + int _flags; /* UCRT name */ + int _flag; /* msvcrt name */ + }; int _file; int _charbuf; int _bufsiz; char *_tmpfname; +#ifdef _UCRT + #ifdef _WINDOWS_ + CRITICAL_SECTION _lock; + #else /* building without windows.h */ + #ifdef _WIN64 + struct { char data[24]; } _lock; /* placeholder with same size as 64-bit CRITICAL_SECTION */ + #else + struct { char data[40]; } _lock; /* placeholder with same size as 32-bit CRITICAL_SECTION */ + #endif + #endif +#endif }; typedef struct _iobuf FILE; #define _FILE_DEFINED -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public