From 519e74ed867484cb683a72c66a984d3c9f129944 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 15:21:24 -0800 Subject: [PATCH 01/11] User override vs. virtual where appropriate. --- .../unicode/utf8_everywhere/console_streambuf.hpp | 6 +++--- .../unicode/utf8_everywhere/unicode_streambuf.hpp | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp index 7232c8d8e7..c79036a621 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp @@ -47,11 +47,11 @@ class BC_API console_streambuf virtual ~console_streambuf() NOEXCEPT; /// Alternate console read. - virtual std::streamsize xsgetn(wchar_t* buffer, - std::streamsize size) THROWS; + std::streamsize xsgetn(wchar_t* buffer, + std::streamsize size) THROWS override; /// Alternate console read. - virtual std::wstreambuf::int_type underflow() THROWS; + std::wstreambuf::int_type underflow() THROWS override; #ifdef HAVE_MSC private: diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp index 4e468945f8..8b2c8c382f 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp @@ -44,14 +44,14 @@ class BC_API unicode_streambuf protected: /// Underflow for support of input streams. - virtual std::streambuf::int_type underflow() THROWS; + std::streambuf::int_type underflow() THROWS override; /// Overflow for support of output streams. - virtual std::streambuf::int_type overflow( - std::streambuf::int_type character) THROWS; + std::streambuf::int_type overflow( + std::streambuf::int_type character) THROWS override; - //// Sync for support of output streams. - virtual int sync() THROWS; + /// Sync for support of output streams. + int sync() THROWS override; private: // These are not thread safe. From d7e19f37788bdb9698e04b46db2b4fd23ce36baa Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 15:21:34 -0800 Subject: [PATCH 02/11] Remove dead comment. --- src/unicode/utf8_everywhere/unicode_streambuf.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/unicode/utf8_everywhere/unicode_streambuf.cpp b/src/unicode/utf8_everywhere/unicode_streambuf.cpp index 20140d3706..e8105b1b58 100644 --- a/src/unicode/utf8_everywhere/unicode_streambuf.cpp +++ b/src/unicode/utf8_everywhere/unicode_streambuf.cpp @@ -134,7 +134,6 @@ std::streambuf::int_type unicode_streambuf::overflow( return traits_type::eof(); } - // C++17: parallel policy for copy_n. // write is necessarily no greater than unwritten. // Copy the fractional character to the beginning of the buffer. std::copy_n(&narrow_[write - unwritten], unwritten, narrow_); From 5f84cbc6f8cc49536d93178989e602b40291a9fd Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 15:21:44 -0800 Subject: [PATCH 03/11] Style. --- src/unicode/utf8_everywhere/unicode_istream.cpp | 11 ++++------- src/unicode/utf8_everywhere/unicode_ostream.cpp | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/unicode/utf8_everywhere/unicode_istream.cpp b/src/unicode/utf8_everywhere/unicode_istream.cpp index fd01bfca2a..a2e7c4b749 100644 --- a/src/unicode/utf8_everywhere/unicode_istream.cpp +++ b/src/unicode/utf8_everywhere/unicode_istream.cpp @@ -24,16 +24,13 @@ namespace libbitcoin { namespace system { -unicode_istream::unicode_istream( -#ifdef HAVE_MSC - std::istream&, std::wistream& wide_stream, - size_t wide_buffer_size) THROWS -#else - std::istream& narrow_stream, std::wistream&, size_t) -#endif #ifdef HAVE_MSC +unicode_istream::unicode_istream( + std::istream&, std::wistream& wide_stream, size_t wide_buffer_size) THROWS : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size)) #else +unicode_istream::unicode_istream( + std::istream& narrow_stream, std::wistream&, size_t) : std::istream(narrow_stream.rdbuf()) #endif { diff --git a/src/unicode/utf8_everywhere/unicode_ostream.cpp b/src/unicode/utf8_everywhere/unicode_ostream.cpp index 83a806bddd..2ced1ee5ee 100644 --- a/src/unicode/utf8_everywhere/unicode_ostream.cpp +++ b/src/unicode/utf8_everywhere/unicode_ostream.cpp @@ -24,16 +24,13 @@ namespace libbitcoin { namespace system { -unicode_ostream::unicode_ostream( -#ifdef HAVE_MSC - std::ostream&, std::wostream& wide_stream, - size_t wide_buffer_size) THROWS -#else - std::ostream& narrow_stream, std::wostream&, size_t) -#endif #ifdef HAVE_MSC +unicode_ostream::unicode_ostream( + std::ostream&, std::wostream& wide_stream, size_t wide_buffer_size) THROWS : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size)) #else +unicode_ostream::unicode_ostream( + std::ostream& narrow_stream, std::wostream&, size_t) : std::ostream(narrow_stream.rdbuf()) #endif { From 7845ecabe76b847155a94918999bf82177954417 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 15:42:28 -0800 Subject: [PATCH 04/11] Set win32 counsole out translate to utf8 (was always only setting input). --- .../utf8_everywhere/console_streambuf.hpp | 5 +++-- .../utf8_everywhere/console_streambuf.cpp | 19 ++++++++++++++----- src/unicode/utf8_everywhere/environment.cpp | 6 +++--- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp index c79036a621..7ce3b67213 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp @@ -35,8 +35,9 @@ class BC_API console_streambuf public: DELETE_COPY_MOVE(console_streambuf); - /// Initialize stdio to use utf8 translation on Windows. - static void initialize(size_t stream_buffer_size) THROWS; + /// Initialize console in/out to use utf8 translation on Windows. + static void set_input(size_t stream_buffer_size) THROWS; + static void set_output() THROWS; protected: /// Protected construction, use static initialize method. diff --git a/src/unicode/utf8_everywhere/console_streambuf.cpp b/src/unicode/utf8_everywhere/console_streambuf.cpp index b5532ee0f3..d191cee0f7 100644 --- a/src/unicode/utf8_everywhere/console_streambuf.cpp +++ b/src/unicode/utf8_everywhere/console_streambuf.cpp @@ -38,13 +38,14 @@ static LPVOID get_input_handle() THROWS return handle; } -// Hack for faulty std::wcin translation of non-ASCII keyboard input. -void console_streambuf::initialize(size_t stream_buffer_size) THROWS +void console_streambuf::set_input(size_t stream_buffer_size) THROWS { - // Set the console to operate in UTF-8 for this process. + // Set console input to operate in UTF-8 for this process. + // learn.microsoft.com/en-us/windows/console/setconsolecp if (SetConsoleCP(CP_UTF8) == FALSE) - throw runtime_exception("Failed to set console to utf8."); + throw runtime_exception("Failed to set console input to utf8."); + // Hack for faulty std::wcin translation of non-ASCII keyboard input. DWORD console_mode; if (GetConsoleMode(get_input_handle(), &console_mode) != FALSE) { @@ -53,9 +54,17 @@ void console_streambuf::initialize(size_t stream_buffer_size) THROWS } } +void console_streambuf::set_output() THROWS +{ + // Set console output to operate in UTF-8 for this process. + // learn.microsoft.com/en-us/windows/console/setconsoleoutputcp + if (SetConsoleOutputCP(CP_UTF8) == FALSE) + throw runtime_exception("Failed to set console output to utf8."); +} + console_streambuf::console_streambuf( const std::wstreambuf& stream_buffer, size_t size) THROWS - : buffer_size_(size), buffer_(new wchar_t[buffer_size_]), + : buffer_size_(size), buffer_(new wchar_t[buffer_size_]), std::wstreambuf(stream_buffer) { } diff --git a/src/unicode/utf8_everywhere/environment.cpp b/src/unicode/utf8_everywhere/environment.cpp index c0db6f49f2..12f48f615b 100644 --- a/src/unicode/utf8_everywhere/environment.cpp +++ b/src/unicode/utf8_everywhere/environment.cpp @@ -235,7 +235,7 @@ static std::once_flag io_mutex; // Static initializer for bc::system::cin. std::istream& cin_stream() THROWS { - std::call_once(io_mutex, console_streambuf::initialize, utf16_buffer_size); + std::call_once(io_mutex, console_streambuf::set_input, utf16_buffer_size); static unicode_istream input(std::cin, std::wcin, utf16_buffer_size); return input; } @@ -243,7 +243,7 @@ std::istream& cin_stream() THROWS // Static initializer for bc::system::cout. std::ostream& cout_stream() THROWS { - std::call_once(io_mutex, console_streambuf::initialize, utf16_buffer_size); + std::call_once(io_mutex, console_streambuf::set_output); static unicode_ostream output(std::cout, std::wcout, utf16_buffer_size); return output; } @@ -251,7 +251,7 @@ std::ostream& cout_stream() THROWS // Static initializer for bc::system::cerr. std::ostream& cerr_stream() THROWS { - std::call_once(io_mutex, console_streambuf::initialize, utf16_buffer_size); + std::call_once(io_mutex, console_streambuf::set_output); static unicode_ostream error(std::cerr, std::wcerr, utf16_buffer_size); return error; } From 72967a56cd05d412581411c51879967355bb5e44 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 16:05:39 -0800 Subject: [PATCH 05/11] Use const. --- .../system/unicode/utf8_everywhere/console_streambuf.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp index 7ce3b67213..d72afc022f 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp @@ -59,7 +59,7 @@ class BC_API console_streambuf // These are not thread safe. // The constructed buffer size. - size_t buffer_size_; + const size_t buffer_size_; // The dynamically-allocated buffers. wchar_t* buffer_; From d666b8e2f7f24adeae856c5a86fda1e0604cd59d Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 16:06:04 -0800 Subject: [PATCH 06/11] Exclude streambuf::sync() override for input buffers. --- .../unicode/utf8_everywhere/unicode_streambuf.hpp | 10 +++++++--- src/unicode/utf8_everywhere/unicode_istream.cpp | 3 ++- src/unicode/utf8_everywhere/unicode_ostream.cpp | 3 ++- src/unicode/utf8_everywhere/unicode_streambuf.cpp | 10 +++++++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp index 8b2c8c382f..5efdd6b1a6 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp @@ -37,7 +37,8 @@ class BC_API unicode_streambuf DELETE_COPY_MOVE(unicode_streambuf); /// Construct unicode stream buffer from a weak reference to a wide buffer. - unicode_streambuf(std::wstreambuf* wide_buffer, size_t size) THROWS; + unicode_streambuf(std::wstreambuf* wide_buffer, size_t size, + bool input) THROWS; /// Synchronize stream buffer. virtual ~unicode_streambuf() NOEXCEPT; @@ -56,11 +57,14 @@ class BC_API unicode_streambuf private: // These are not thread safe. + // True for input usage. + const bool input_; + // The constructed wide buffer size in number of characters. - size_t wide_size_; + const size_t wide_size_; // The derived narrow buffer size in utf8 (bytes). - size_t narrow_size_; + const size_t narrow_size_; // The dynamically-allocated buffers. wchar_t* wide_; diff --git a/src/unicode/utf8_everywhere/unicode_istream.cpp b/src/unicode/utf8_everywhere/unicode_istream.cpp index a2e7c4b749..6c72ff43c5 100644 --- a/src/unicode/utf8_everywhere/unicode_istream.cpp +++ b/src/unicode/utf8_everywhere/unicode_istream.cpp @@ -27,7 +27,8 @@ namespace system { #ifdef HAVE_MSC unicode_istream::unicode_istream( std::istream&, std::wistream& wide_stream, size_t wide_buffer_size) THROWS - : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size)) + : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size, + true)) #else unicode_istream::unicode_istream( std::istream& narrow_stream, std::wistream&, size_t) diff --git a/src/unicode/utf8_everywhere/unicode_ostream.cpp b/src/unicode/utf8_everywhere/unicode_ostream.cpp index 2ced1ee5ee..64b5b73f2c 100644 --- a/src/unicode/utf8_everywhere/unicode_ostream.cpp +++ b/src/unicode/utf8_everywhere/unicode_ostream.cpp @@ -27,7 +27,8 @@ namespace system { #ifdef HAVE_MSC unicode_ostream::unicode_ostream( std::ostream&, std::wostream& wide_stream, size_t wide_buffer_size) THROWS - : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size)) + : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size, + false)) #else unicode_ostream::unicode_ostream( std::ostream& narrow_stream, std::wostream&, size_t) diff --git a/src/unicode/utf8_everywhere/unicode_streambuf.cpp b/src/unicode/utf8_everywhere/unicode_streambuf.cpp index e8105b1b58..02b1c86d35 100644 --- a/src/unicode/utf8_everywhere/unicode_streambuf.cpp +++ b/src/unicode/utf8_everywhere/unicode_streambuf.cpp @@ -29,8 +29,9 @@ namespace libbitcoin { namespace system { unicode_streambuf::unicode_streambuf(std::wstreambuf* wide_buffer, - size_t size) THROWS - : wide_size_(size), + size_t size, bool input) THROWS + : input_(input), + wide_size_(size), narrow_size_(wide_size_ * utf8_max_character_size), narrow_(new char[narrow_size_]), wide_(new wchar_t[narrow_size_]), @@ -90,7 +91,7 @@ std::streambuf::int_type unicode_streambuf::underflow() THROWS // MSVC does not support a UTF8 locale and as such streams interpret // narrow characters in the default locale. This implementation // assumes the stream will treat each byte of a multibyte narrow -// chracter as an individual single byte character. +// character as an individual single byte character. std::streambuf::int_type unicode_streambuf::overflow( std::streambuf::int_type character) THROWS { @@ -154,6 +155,9 @@ std::streambuf::int_type unicode_streambuf::overflow( // Flush our output sequence. int unicode_streambuf::sync() THROWS { + if (input_) + return std::streambuf::sync(); + const int success = zero; const int failure = negative_one; From 18950d5c08fef567fd692dc10f8333544e289dd1 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 16:06:12 -0800 Subject: [PATCH 07/11] Whitespace. --- examples/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/main.cpp b/examples/main.cpp index 9ab32f4a97..4789ed7145 100644 --- a/examples/main.cpp +++ b/examples/main.cpp @@ -37,7 +37,7 @@ int bc::system::main(int argc, char* argv[]) system::cout << "Enter text to input..." << std::endl; std::string console; system::cin >> console; - system::cout << "input[0] : " << console << std::endl; + system::cout << "input[0] : " << console << std::endl; if (argc > 1) system::cout << "argv[1] : " << argv[1] << std::endl; From ebc4bad61368b50e39fed4e9dd9a2225124a1f0c Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 16:16:35 -0800 Subject: [PATCH 08/11] Style. --- .../unicode/utf8_everywhere/console_streambuf.hpp | 3 +-- .../unicode/utf8_everywhere/unicode_istream.hpp | 2 +- .../unicode/utf8_everywhere/unicode_ostream.hpp | 2 +- .../unicode/utf8_everywhere/unicode_streambuf.hpp | 3 +-- src/unicode/utf8_everywhere/console_streambuf.cpp | 9 +++++---- src/unicode/utf8_everywhere/unicode_istream.cpp | 11 +++++------ src/unicode/utf8_everywhere/unicode_ostream.cpp | 11 +++++------ src/unicode/utf8_everywhere/unicode_streambuf.cpp | 6 +++--- 8 files changed, 22 insertions(+), 25 deletions(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp index d72afc022f..5e552c9c5e 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/console_streambuf.hpp @@ -41,8 +41,7 @@ class BC_API console_streambuf protected: /// Protected construction, use static initialize method. - console_streambuf(const std::wstreambuf& stream_buffer, - size_t stream_buffer_size) THROWS; + console_streambuf(const std::wstreambuf& buffer, size_t size) THROWS; /// Delete stream buffer. virtual ~console_streambuf() NOEXCEPT; diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_istream.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_istream.hpp index 9bacd76552..e6e7c09816 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_istream.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_istream.hpp @@ -35,7 +35,7 @@ class BC_API unicode_istream /// Construct instance of a conditionally-narrowing input stream. unicode_istream(std::istream& narrow_stream, std::wistream& wide_stream, - size_t wide_buffer_size) THROWS; + size_t wide_size) THROWS; /// Delete the unicode_streambuf that wraps wide_stream. virtual ~unicode_istream() NOEXCEPT; diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_ostream.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_ostream.hpp index af4d5141fa..700ee2705b 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_ostream.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_ostream.hpp @@ -34,7 +34,7 @@ class BC_API unicode_ostream /// Construct instance of a conditionally-widening output stream. unicode_ostream(std::ostream& narrow_stream, std::wostream& wide_stream, - size_t wide_buffer_size) THROWS; + size_t wide_size) THROWS; /// Delete the unicode_streambuf that wraps wide_stream. virtual ~unicode_ostream() NOEXCEPT; diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp index 5efdd6b1a6..939544b257 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp @@ -37,8 +37,7 @@ class BC_API unicode_streambuf DELETE_COPY_MOVE(unicode_streambuf); /// Construct unicode stream buffer from a weak reference to a wide buffer. - unicode_streambuf(std::wstreambuf* wide_buffer, size_t size, - bool input) THROWS; + unicode_streambuf(std::wstreambuf* buffer, size_t size, bool input) THROWS; /// Synchronize stream buffer. virtual ~unicode_streambuf() NOEXCEPT; diff --git a/src/unicode/utf8_everywhere/console_streambuf.cpp b/src/unicode/utf8_everywhere/console_streambuf.cpp index d191cee0f7..0f8d19ba96 100644 --- a/src/unicode/utf8_everywhere/console_streambuf.cpp +++ b/src/unicode/utf8_everywhere/console_streambuf.cpp @@ -62,10 +62,11 @@ void console_streambuf::set_output() THROWS throw runtime_exception("Failed to set console output to utf8."); } -console_streambuf::console_streambuf( - const std::wstreambuf& stream_buffer, size_t size) THROWS - : buffer_size_(size), buffer_(new wchar_t[buffer_size_]), - std::wstreambuf(stream_buffer) +console_streambuf::console_streambuf(const std::wstreambuf& buffer, + size_t size) THROWS + : buffer_size_(size), + buffer_(new wchar_t[size]), + std::wstreambuf(buffer) { } diff --git a/src/unicode/utf8_everywhere/unicode_istream.cpp b/src/unicode/utf8_everywhere/unicode_istream.cpp index 6c72ff43c5..100640e766 100644 --- a/src/unicode/utf8_everywhere/unicode_istream.cpp +++ b/src/unicode/utf8_everywhere/unicode_istream.cpp @@ -25,13 +25,12 @@ namespace libbitcoin { namespace system { #ifdef HAVE_MSC -unicode_istream::unicode_istream( - std::istream&, std::wistream& wide_stream, size_t wide_buffer_size) THROWS - : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size, - true)) +unicode_istream::unicode_istream(std::istream&, std::wistream& wide_stream, + size_t wide_size) THROWS + : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_size, true)) #else -unicode_istream::unicode_istream( - std::istream& narrow_stream, std::wistream&, size_t) +unicode_istream::unicode_istream(std::istream& narrow_stream, + std::wistream&, size_t) THROWS : std::istream(narrow_stream.rdbuf()) #endif { diff --git a/src/unicode/utf8_everywhere/unicode_ostream.cpp b/src/unicode/utf8_everywhere/unicode_ostream.cpp index 64b5b73f2c..f9b375d4cd 100644 --- a/src/unicode/utf8_everywhere/unicode_ostream.cpp +++ b/src/unicode/utf8_everywhere/unicode_ostream.cpp @@ -25,13 +25,12 @@ namespace libbitcoin { namespace system { #ifdef HAVE_MSC -unicode_ostream::unicode_ostream( - std::ostream&, std::wostream& wide_stream, size_t wide_buffer_size) THROWS - : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_buffer_size, - false)) +unicode_ostream::unicode_ostream(std::ostream&, std::wostream& wide_stream, + size_t wide_size) THROWS + : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_size, false)) #else -unicode_ostream::unicode_ostream( - std::ostream& narrow_stream, std::wostream&, size_t) +unicode_ostream::unicode_ostream(std::ostream& narrow_stream, + std::wostream&, size_t) THROWS : std::ostream(narrow_stream.rdbuf()) #endif { diff --git a/src/unicode/utf8_everywhere/unicode_streambuf.cpp b/src/unicode/utf8_everywhere/unicode_streambuf.cpp index 02b1c86d35..be75853627 100644 --- a/src/unicode/utf8_everywhere/unicode_streambuf.cpp +++ b/src/unicode/utf8_everywhere/unicode_streambuf.cpp @@ -28,16 +28,16 @@ namespace libbitcoin { namespace system { -unicode_streambuf::unicode_streambuf(std::wstreambuf* wide_buffer, +unicode_streambuf::unicode_streambuf(std::wstreambuf* buffer, size_t size, bool input) THROWS : input_(input), wide_size_(size), narrow_size_(wide_size_ * utf8_max_character_size), narrow_(new char[narrow_size_]), wide_(new wchar_t[narrow_size_]), - wide_buffer_(wide_buffer) + wide_buffer_(buffer) { - if (is_zero(wide_size_) || wide_buffer == nullptr || + if (is_zero(wide_size_) || is_null(wide_buffer_) || wide_size_ > (bc::max_size_t / utf8_max_character_size)) throw runtime_exception("unicode_streambuf parameters"); From 61422352c7602eb289a660da48f47fa9ea850716 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 16:28:01 -0800 Subject: [PATCH 09/11] Patch conditional compile. --- src/unicode/utf8_everywhere/console_streambuf.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/unicode/utf8_everywhere/console_streambuf.cpp b/src/unicode/utf8_everywhere/console_streambuf.cpp index 0f8d19ba96..9e6263d230 100644 --- a/src/unicode/utf8_everywhere/console_streambuf.cpp +++ b/src/unicode/utf8_everywhere/console_streambuf.cpp @@ -102,7 +102,11 @@ std::wstreambuf::int_type console_streambuf::underflow() THROWS #else -void console_streambuf::initialize(size_t) THROWS +void console_streambuf::set_input(size_t) THROWS +{ +} + +void console_streambuf::set_output() THROWS { } From 729584a8e9aad3e6378a80811fe3b9afdf2cb6cf Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 17:41:00 -0800 Subject: [PATCH 10/11] streambuf can infer input/output context. --- .../system/unicode/utf8_everywhere/unicode_streambuf.hpp | 5 +---- src/unicode/utf8_everywhere/unicode_istream.cpp | 2 +- src/unicode/utf8_everywhere/unicode_ostream.cpp | 2 +- src/unicode/utf8_everywhere/unicode_streambuf.cpp | 8 ++++---- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp index 939544b257..ee36723cde 100644 --- a/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp +++ b/include/bitcoin/system/unicode/utf8_everywhere/unicode_streambuf.hpp @@ -37,7 +37,7 @@ class BC_API unicode_streambuf DELETE_COPY_MOVE(unicode_streambuf); /// Construct unicode stream buffer from a weak reference to a wide buffer. - unicode_streambuf(std::wstreambuf* buffer, size_t size, bool input) THROWS; + unicode_streambuf(std::wstreambuf* buffer, size_t size) THROWS; /// Synchronize stream buffer. virtual ~unicode_streambuf() NOEXCEPT; @@ -56,9 +56,6 @@ class BC_API unicode_streambuf private: // These are not thread safe. - // True for input usage. - const bool input_; - // The constructed wide buffer size in number of characters. const size_t wide_size_; diff --git a/src/unicode/utf8_everywhere/unicode_istream.cpp b/src/unicode/utf8_everywhere/unicode_istream.cpp index 100640e766..41f19c588d 100644 --- a/src/unicode/utf8_everywhere/unicode_istream.cpp +++ b/src/unicode/utf8_everywhere/unicode_istream.cpp @@ -27,7 +27,7 @@ namespace system { #ifdef HAVE_MSC unicode_istream::unicode_istream(std::istream&, std::wistream& wide_stream, size_t wide_size) THROWS - : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_size, true)) + : std::istream(new unicode_streambuf(wide_stream.rdbuf(), wide_size)) #else unicode_istream::unicode_istream(std::istream& narrow_stream, std::wistream&, size_t) THROWS diff --git a/src/unicode/utf8_everywhere/unicode_ostream.cpp b/src/unicode/utf8_everywhere/unicode_ostream.cpp index f9b375d4cd..1a16529b85 100644 --- a/src/unicode/utf8_everywhere/unicode_ostream.cpp +++ b/src/unicode/utf8_everywhere/unicode_ostream.cpp @@ -27,7 +27,7 @@ namespace system { #ifdef HAVE_MSC unicode_ostream::unicode_ostream(std::ostream&, std::wostream& wide_stream, size_t wide_size) THROWS - : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_size, false)) + : std::ostream(new unicode_streambuf(wide_stream.rdbuf(), wide_size)) #else unicode_ostream::unicode_ostream(std::ostream& narrow_stream, std::wostream&, size_t) THROWS diff --git a/src/unicode/utf8_everywhere/unicode_streambuf.cpp b/src/unicode/utf8_everywhere/unicode_streambuf.cpp index be75853627..b913666000 100644 --- a/src/unicode/utf8_everywhere/unicode_streambuf.cpp +++ b/src/unicode/utf8_everywhere/unicode_streambuf.cpp @@ -29,9 +29,8 @@ namespace libbitcoin { namespace system { unicode_streambuf::unicode_streambuf(std::wstreambuf* buffer, - size_t size, bool input) THROWS - : input_(input), - wide_size_(size), + size_t size) THROWS + : wide_size_(size), narrow_size_(wide_size_ * utf8_max_character_size), narrow_(new char[narrow_size_]), wide_(new wchar_t[narrow_size_]), @@ -155,7 +154,8 @@ std::streambuf::int_type unicode_streambuf::overflow( // Flush our output sequence. int unicode_streambuf::sync() THROWS { - if (input_) + // Bypass for input. + if (is_null(std::streambuf::pptr())) return std::streambuf::sync(); const int success = zero; From fa65822ba0a10e13e4a6433399deaf087a2f9b5e Mon Sep 17 00:00:00 2001 From: evoskuil Date: Sat, 25 Feb 2023 18:16:06 -0800 Subject: [PATCH 11/11] Comments. --- src/unicode/utf8_everywhere/unicode_streambuf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unicode/utf8_everywhere/unicode_streambuf.cpp b/src/unicode/utf8_everywhere/unicode_streambuf.cpp index b913666000..7b38afbdb6 100644 --- a/src/unicode/utf8_everywhere/unicode_streambuf.cpp +++ b/src/unicode/utf8_everywhere/unicode_streambuf.cpp @@ -63,7 +63,7 @@ std::streambuf::int_type unicode_streambuf::underflow() THROWS // streamsize is signed. const auto size = static_cast(wide_size_); - // Read from the wide input buffer (non-negative). + // Read from the wide input buffer, blocking (non-negative). const auto read = wide_buffer_->sgetn(wide_, size); // Handle read termination.