mirror of
https://github.com/minetest/minetest.git
synced 2025-03-28 13:12:37 +01:00
Make logging respect stream flushes
also add override keyword and fix overflow() behavior
This commit is contained in:
@ -23,48 +23,55 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
template<int BufferLength, typename Emitter = std::function<void(std::string_view)> >
|
template<unsigned int BufferLength, typename Emitter = std::function<void(std::string_view)> >
|
||||||
class StringStreamBuffer : public std::streambuf {
|
class StringStreamBuffer : public std::streambuf {
|
||||||
public:
|
public:
|
||||||
StringStreamBuffer(Emitter emitter) : m_emitter(emitter) {
|
StringStreamBuffer(Emitter emitter) : m_emitter(emitter) {
|
||||||
buffer_index = 0;
|
buffer_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int overflow(int c) {
|
int overflow(int c) override {
|
||||||
|
if (c != traits_type::eof())
|
||||||
push_back(c);
|
push_back(c);
|
||||||
return c;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void push_back(char c) {
|
void push_back(char c) {
|
||||||
if (c == '\n' || c == '\r') {
|
// emit only complete lines, or if the buffer is full
|
||||||
if (buffer_index)
|
if (c == '\n') {
|
||||||
m_emitter(std::string_view(buffer, buffer_index));
|
sync();
|
||||||
buffer_index = 0;
|
|
||||||
} else {
|
} else {
|
||||||
buffer[buffer_index++] = c;
|
buffer[buffer_index++] = c;
|
||||||
if (buffer_index >= BufferLength) {
|
if (buffer_index >= BufferLength) {
|
||||||
m_emitter(std::string_view(buffer, buffer_index));
|
sync();
|
||||||
buffer_index = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
for (std::streamsize i = 0; i < n; ++i)
|
||||||
push_back(s[i]);
|
push_back(s[i]);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sync() override {
|
||||||
|
if (buffer_index)
|
||||||
|
m_emitter(std::string_view(buffer, buffer_index));
|
||||||
|
buffer_index = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Emitter m_emitter;
|
Emitter m_emitter;
|
||||||
|
unsigned int buffer_index;
|
||||||
char buffer[BufferLength];
|
char buffer[BufferLength];
|
||||||
int buffer_index;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DummyStreamBuffer : public std::streambuf {
|
class DummyStreamBuffer : public std::streambuf {
|
||||||
int overflow(int c) {
|
int overflow(int c) override {
|
||||||
return c;
|
return 0;
|
||||||
}
|
}
|
||||||
std::streamsize xsputn(const char *s, std::streamsize n) {
|
std::streamsize xsputn(const char *s, std::streamsize n) override {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user