diff --git a/src/util/stream.h b/src/util/stream.h index 620ad74ba..dbbe22592 100644 --- a/src/util/stream.h +++ b/src/util/stream.h @@ -23,48 +23,55 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include -template > +template > class StringStreamBuffer : public std::streambuf { public: StringStreamBuffer(Emitter emitter) : m_emitter(emitter) { buffer_index = 0; } - int overflow(int c) { - push_back(c); - return c; + int overflow(int c) override { + if (c != traits_type::eof()) + push_back(c); + return 0; } void push_back(char c) { - if (c == '\n' || c == '\r') { - if (buffer_index) - m_emitter(std::string_view(buffer, buffer_index)); - buffer_index = 0; + // emit only complete lines, or if the buffer is full + if (c == '\n') { + sync(); } else { buffer[buffer_index++] = c; if (buffer_index >= BufferLength) { - m_emitter(std::string_view(buffer, buffer_index)); - buffer_index = 0; + sync(); } } } - std::streamsize xsputn(const char *s, std::streamsize n) { + std::streamsize xsputn(const char *s, std::streamsize n) override { for (std::streamsize i = 0; i < n; ++i) push_back(s[i]); return n; } + + int sync() override { + if (buffer_index) + m_emitter(std::string_view(buffer, buffer_index)); + buffer_index = 0; + return 0; + } + private: Emitter m_emitter; + unsigned int buffer_index; char buffer[BufferLength]; - int buffer_index; }; class DummyStreamBuffer : public std::streambuf { - int overflow(int c) { - return c; + int overflow(int c) override { + return 0; } - std::streamsize xsputn(const char *s, std::streamsize n) { + std::streamsize xsputn(const char *s, std::streamsize n) override { return n; } };