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

Reply via email to