#include <cerrno>
#include <cstring>
+const int BUFFER_LENGTH = 256;
+
class StringBuffer : public std::streambuf {
public:
- StringBuffer() {}
+ StringBuffer() {
+ buffer_index = 0;
+ }
int overflow(int c);
virtual void flush(const std::string &buf) = 0;
void push_back(char c);
private:
- std::string buffer;
+ char buffer[BUFFER_LENGTH];
+ int buffer_index;
};
m_outputs[lev].push_back(out);
}
+void Logger::addOutputMasked(ILogOutput *out, LogLevelMask mask)
+{
+ for (size_t i = 0; i < LL_MAX; i++) {
+ if (mask & LOGLEVEL_TO_MASKLEVEL(i))
+ m_outputs[i].push_back(out);
+ }
+}
+
void Logger::addOutputMaxLevel(ILogOutput *out, LogLevel lev)
{
assert(lev < LL_MAX);
m_outputs[i].push_back(out);
}
-void Logger::removeOutput(ILogOutput *out)
+LogLevelMask Logger::removeOutput(ILogOutput *out)
{
+ LogLevelMask ret_mask = 0;
for (size_t i = 0; i < LL_MAX; i++) {
std::vector<ILogOutput *>::iterator it;
it = std::find(m_outputs[i].begin(), m_outputs[i].end(), out);
- if (it != m_outputs[i].end())
+ if (it != m_outputs[i].end()) {
+ ret_mask |= LOGLEVEL_TO_MASKLEVEL(i);
m_outputs[i].erase(it);
+ }
}
+ return ret_mask;
}
void Logger::setLevelSilenced(LogLevel lev, bool silenced)
void StringBuffer::push_back(char c)
{
if (c == '\n' || c == '\r') {
- if (!buffer.empty())
- flush(buffer);
- buffer.clear();
+ if (buffer_index)
+ flush(std::string(buffer, buffer_index));
+ buffer_index = 0;
} else {
- buffer.push_back(c);
+ int index = buffer_index;
+ buffer[index++] = c;
+ if (index >= BUFFER_LENGTH) {
+ flush(std::string(buffer, buffer_index));
+ buffer_index = 0;
+ } else {
+ buffer_index = index;
+ }
}
}