Simplify print

This commit is contained in:
Victor Zverovich 2023-04-22 13:22:38 -07:00
parent 0de789cf29
commit 18154cc903
2 changed files with 28 additions and 42 deletions

View File

@ -144,10 +144,10 @@ FMT_API FMT_FUNC auto format_facet<std::locale>::do_put(
} }
#endif #endif
FMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str, FMT_FUNC std::system_error vsystem_error(int error_code, string_view fmt,
format_args args) { format_args args) {
auto ec = std::error_code(error_code, std::generic_category()); auto ec = std::error_code(error_code, std::generic_category());
return std::system_error(ec, vformat(format_str, args)); return std::system_error(ec, vformat(fmt, args));
} }
namespace detail { namespace detail {
@ -1445,57 +1445,44 @@ FMT_FUNC std::string vformat(string_view fmt, format_args args) {
} }
namespace detail { namespace detail {
#ifdef _WIN32 #ifndef _WIN32
FMT_FUNC bool write_console(std::FILE*, string_view) { return false; }
#else
using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>; using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( // extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( //
void*, const void*, dword, dword*, void*); void*, const void*, dword, dword*, void*);
FMT_FUNC bool write_console(std::FILE* f, string_view text) { FMT_FUNC bool write_console(std::FILE* f, string_view text) {
auto fd = _fileno(f); auto fd = _fileno(f);
if (_isatty(fd)) { if (!_isatty(fd)) return false;
detail::utf8_to_utf16 u16(string_view(text.data(), text.size())); auto u16 = utf8_to_utf16(text);
auto written = detail::dword(); auto written = dword();
if (detail::WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)), return WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)), u16.c_str(),
u16.c_str(), static_cast<uint32_t>(u16.size()), static_cast<uint32_t>(u16.size()), &written, nullptr);
&written, nullptr)) {
return true;
}
}
// We return false if the file descriptor was not TTY, or it was but
// SetConsoleW failed which can happen if the output has been redirected to
// NUL. In both cases when we return false, we should attempt to do regular
// write via fwrite or std::ostream::write.
return false;
}
#endif
FMT_FUNC void print(std::FILE* f, string_view text) {
#ifdef _WIN32
if (write_console(f, text)) return;
#endif
detail::fwrite_fully(text.data(), 1, text.size(), f);
}
} // namespace detail
FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
memory_buffer buffer;
detail::vformat_to(buffer, format_str, args);
detail::print(f, {buffer.data(), buffer.size()});
} }
#ifdef _WIN32
// Print assuming legacy (non-Unicode) encoding. // Print assuming legacy (non-Unicode) encoding.
FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str, FMT_FUNC void vprint_mojibake(std::FILE* f, string_view fmt, format_args args) {
format_args args) { auto buffer = memory_buffer();
memory_buffer buffer; detail::vformat_to(buffer, fmt,
detail::vformat_to(buffer, format_str,
basic_format_args<buffer_context<char>>(args)); basic_format_args<buffer_context<char>>(args));
fwrite_fully(buffer.data(), 1, buffer.size(), f); fwrite_fully(buffer.data(), 1, buffer.size(), f);
} }
#endif #endif
FMT_FUNC void vprint(string_view format_str, format_args args) { FMT_FUNC void print(std::FILE* f, string_view text) {
vprint(stdout, format_str, args); if (!write_console(f, text)) fwrite_fully(text.data(), 1, text.size(), f);
}
} // namespace detail
FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
auto buffer = memory_buffer();
detail::vformat_to(buffer, fmt, args);
detail::print(f, {buffer.data(), buffer.size()});
}
FMT_FUNC void vprint(string_view fmt, format_args args) {
vprint(stdout, fmt, args);
} }
namespace detail { namespace detail {

View File

@ -225,7 +225,8 @@ inline auto clzll(uint64_t x) -> int {
_BitScanReverse64(&r, x); _BitScanReverse64(&r, x);
# else # else
// Scan the high 32 bits. // Scan the high 32 bits.
if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32))) return 63 ^ static_cast<int>(r + 32); if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32)))
return 63 ^ static_cast<int>(r + 32);
// Scan the low 32 bits. // Scan the low 32 bits.
_BitScanReverse(&r, static_cast<uint32_t>(x)); _BitScanReverse(&r, static_cast<uint32_t>(x));
# endif # endif
@ -1039,9 +1040,7 @@ struct is_contiguous<basic_memory_buffer<T, SIZE, Allocator>> : std::true_type {
}; };
namespace detail { namespace detail {
#ifdef _WIN32
FMT_API bool write_console(std::FILE* f, string_view text); FMT_API bool write_console(std::FILE* f, string_view text);
#endif
FMT_API void print(std::FILE*, string_view); FMT_API void print(std::FILE*, string_view);
} // namespace detail } // namespace detail