diff --git a/Timeline/Loggable.C b/Timeline/Loggable.C index b3dd30a..e5e802d 100644 --- a/Timeline/Loggable.C +++ b/Timeline/Loggable.C @@ -504,27 +504,50 @@ Loggable::compact ( void ) #include -/** Buffered sprintf wrapper */ +/** Writes (part of) a line to the journal. Each separate line will be + * stored separately in _transaction until transaction is closed. + */ void Loggable::log ( const char *fmt, ... ) { + static char * buf = NULL; + static size_t i = 0; + static size_t buf_size = 0; + if ( ! _fp ) return; - /* FIXME: bogus limit */ - static char buf[1024]; - static int i = 0; + if ( NULL == buf ) + { + buf_size = 1024; + buf = (char*)malloc( buf_size ); + } va_list args; if ( fmt ) { va_start( args, fmt ); - i += vsprintf( buf + i, fmt, args ); + + for ( ;; ) + { + size_t l = vsnprintf( buf + i, buf_size - i, fmt, args ); + + if ( l >= buf_size - i ) + { + buf = (char*)realloc( buf, buf_size += (l + 1) + buf_size ); + } + else + { + i += l; + break; + } + } + va_end( args ); } - if ( rindex( buf, '\n' ) ) + if ( '\n' == buf[i-1] ) { _transaction.push( strdup( buf ) ); i = 0;