Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #include <claw/log_stream_uniq.hpp>
00031
00032 #include <claw/claw_gettext.hpp>
00033
00034 #include <sstream>
00035
00036
00042 claw::log_stream_uniq::log_stream_uniq( log_stream* s )
00043 : m_stream(s), m_repetition_count(0)
00044 {
00045
00046 }
00047
00048
00052 claw::log_stream_uniq::~log_stream_uniq()
00053 {
00054 delete m_stream;
00055 }
00056
00057
00062 void claw::log_stream_uniq::write( const std::string& str )
00063 {
00064 std::string::size_type p = str.find_first_of('\n');
00065
00066 if ( p == std::string::npos )
00067 m_current_line += str;
00068 else
00069 {
00070 ++p;
00071 m_current_line += str.substr(0, p);
00072
00073 output_current_line();
00074
00075 if ( p != str.length() )
00076 write( str.substr(p) );
00077 }
00078 }
00079
00080
00084 void claw::log_stream_uniq::flush()
00085 {
00086 m_stream->flush();
00087 }
00088
00089
00093 void claw::log_stream_uniq::output_current_line()
00094 {
00095 if ( m_current_line == m_previous_line )
00096 ++m_repetition_count;
00097 else
00098 {
00099 if ( m_repetition_count > 0 )
00100 {
00101 std::ostringstream oss;
00102 oss << claw_gettext("(Previous line repeated ") << m_repetition_count
00103 << claw_ngettext(" time)", " times)", m_repetition_count) << '\n';
00104
00105 m_stream->write(oss.str());
00106 }
00107
00108 m_repetition_count = 0;
00109
00110 m_previous_line = m_current_line;
00111 m_stream->write( m_current_line );
00112 }
00113
00114 m_current_line.clear();
00115 }