|
21 | 21 | # include <locale> |
22 | 22 | #endif |
23 | 23 |
|
| 24 | +#if FMT_UNICODE |
| 25 | +#include <windows.h> |
| 26 | +#include <io.h> |
| 27 | +#endif |
| 28 | + |
24 | 29 | #ifdef _MSC_VER |
25 | 30 | # pragma warning(push) |
26 | 31 | # pragma warning(disable : 4702) // unreachable code |
@@ -1336,20 +1341,24 @@ FMT_FUNC void report_system_error(int error_code, |
1336 | 1341 | report_error(format_system_error, error_code, message); |
1337 | 1342 | } |
1338 | 1343 |
|
1339 | | -#ifndef FMT_UNICODE |
1340 | | -# define FMT_UNICODE 0 |
1341 | | -#endif |
1342 | | - |
1343 | 1344 | FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { |
1344 | 1345 | memory_buffer buffer; |
1345 | 1346 | internal::vformat_to(buffer, format_str, |
1346 | 1347 | basic_format_args<buffer_context<char>>(args)); |
1347 | | -#if FMT_UNICODE |
1348 | | - internal::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size())); |
1349 | | - std::fputws(u16.c_str(), f); |
1350 | | -#else |
1351 | | - internal::fwrite_fully(buffer.data(), 1, buffer.size(), f); |
| 1348 | +#if defined(_WIN32) && FMT_UNICODE |
| 1349 | + auto fd = _fileno(f); |
| 1350 | + if (_isatty(fd)) { |
| 1351 | + internal::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size())); |
| 1352 | + auto written = DWORD(); |
| 1353 | + if (!WriteConsoleW( |
| 1354 | + reinterpret_cast<HANDLE>(_get_osfhandle(fd)), |
| 1355 | + u16.c_str(), u16.size(), &written, nullptr)) { |
| 1356 | + throw format_error("failed to write to console"); |
| 1357 | + } |
| 1358 | + return; |
| 1359 | + } |
1352 | 1360 | #endif |
| 1361 | + internal::fwrite_fully(buffer.data(), 1, buffer.size(), f); |
1353 | 1362 | } |
1354 | 1363 |
|
1355 | 1364 | FMT_FUNC void vprint(string_view format_str, format_args args) { |
|
0 commit comments