I guess I confused glibc with some other implementation I was testing long time
ago...
You're right, we can't just `freopen ("/dev/stdin", ..., stdin)` with binary
mode on Windows, I didn't think of it. However, I still find it unlikely that
they will ever use _setmode to enable Unicode translation mode.
Now that I think of it, _setmode may not be the best way to implement fwide.
My thoughts about implementing fwide with _setmode were that if you're using
wide I/O functions there must be a reason for it, such as need to handle
characters which may not be supported by single-byte or double-byte code pages.
Using Unicode translation mode would ensure that they are written and read back
properly.
________________________________
From: Pali Rohár <[email protected]>
Sent: Wednesday, September 10, 2025 2:55 AM
To: Kirill Makurin <[email protected]>
Cc: mingw-w64-public <[email protected]>
Subject: Re: _getmode
Ou... This character-orientation feature is something I know that exist
but I totally forgot about it.
On Tuesday 09 September 2025 11:38:54 Kirill Makurin wrote:
> One more thing about _setmode. You may know that CRT's fwide[1] is just a
> stub and it is even documented to do nothing. If there would be a reliable
> and consistent way to obtain translation mode, it would be possible to
> implement working replacement for it.
Hm... That is an interesting idea. But I doubt that there is some better
way how to get current mode than accessing the CRT internals.
Anyway, I'm not sure if the _setmode is a good for implementing fwide.
Normally fwprintf uses the encoding from setlocale to convert wide
buffer to byte buffer (before writing data to file).
But _setmode when operating in wide-mode allows to choose just UTF-8 or
UTF-16 encoding for converting wide buffer to byte buffer, completely
ignoring the encoding set by setlocale.
So for me, this _setmode looks like an another feature independent of
fwide and not compatible for it.
> _setmode is CRT stuff, so I think it is safe enough to assume that POSIX
> applications will not call it. ISO C way to achieve similar thing is fwide.
> In theory, implementation could track which FILEs were put to "wide" mode and
> implementation of printf/scanf could make use of this information.
_setmode is the only way how to change stdin or stdout to binary mode.
So POSIX application which works in a way argv[1] is input file and when
is not specified then stdin is used, in more cases contains #ifdef for
windows to change stdin / stdout to binary mode via _setmode to make
this working.
> Also, if I remember correctly, ISO C says that once stream mode was set with
> either fwide or explicit I/O operation it cannot be changed and corresponding
> (narrow or wide) versions of stdio functions must be used to perform I/O on
> that stream.
Yes, it is supposed to work in this way.
> In practice, it seems that some implementation (CRT and glibc for example)
> are ok with mixing them.
glibc does not allow to mix printf and wprintf. I have tried it now.
But I'm not sure if it allows to call fwide to change existing mode if
is already set.
> [1] https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fwide
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public