From e2c6442dee4505f83af5435bf3017addb3e3f5bf Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Mon, 3 Mar 2008 10:13:17 -0600 Subject: [PATCH] Work on transaction support for undo system. --- Loggable.C | 66 +++++++++++++++++++++++++++++++++++++++++------------- Loggable.H | 13 ++++++----- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/Loggable.C b/Loggable.C index 2c4176d..269e59a 100644 --- a/Loggable.C +++ b/Loggable.C @@ -32,6 +32,7 @@ int Loggable::_undo_index = 1; vector Loggable::_loggables; map Loggable::_class_map; +queue Loggable::_transaction; bool Loggable::open ( const char *filename ) @@ -315,18 +316,54 @@ Loggable::snapshot( const char *file ) void Loggable::log ( const char *fmt, ... ) { + /* FIXME: bogus limit */ + static char buf[1024]; + static int i = 0; + va_list args; if ( fmt ) { va_start( args, fmt ); - vfprintf( _fp, fmt, args ); + i += vsprintf( buf + i, fmt, args ); va_end( args ); } - fflush( _fp ); + if ( rindex( buf, '\n' ) ) + { + _transaction.push( strdup( buf ) ); + i = 0; + } } +void +Loggable::flush ( void ) +{ + int n = _transaction.size(); + + if ( n > 1 ) + fprintf( _fp, "{\n" ); + + while ( ! _transaction.empty() ) + { + char *s = _transaction.front(); + + _transaction.pop(); + + if ( n > 1 ) + fprintf( _fp, "\t" ); + + fprintf( _fp, "%s", s ); + + free( s ); + } + + if ( n > 1 ) + fprintf( _fp, "}\n" ); + + + fflush( _fp ); +} void Loggable::log_print( char **o, char **n ) @@ -395,15 +432,11 @@ Loggable::log_end ( void ) if ( --_nest > 0 ) return; -// assert( _old_state ); - char **_new_state = get(); - // if ( _old_state ) - if ( log_diff( _old_state, _new_state ) ) { - indent(); +// indent(); log( "%s 0x%X set ", class_name(), _id ); log_print( _old_state, _new_state ); @@ -417,19 +450,14 @@ Loggable::log_end ( void ) _old_state = NULL; -/* if ( _old_state ) */ -/* { */ -/* free_sa( _old_state ); */ -/* _old_state = NULL; */ -/* } */ - -// _old_state = NULL; + if ( Loggable::_level == 0 ) + Loggable::flush(); } void Loggable::log_create ( void ) { - indent(); +// indent(); log( "%s 0x%X create ", class_name(), _id ); char **sa = get(); @@ -441,12 +469,15 @@ Loggable::log_create ( void ) } else log( "\n" ); + + if ( Loggable::_level == 0 ) + Loggable::flush(); } void Loggable::log_destroy ( void ) { - indent(); +// indent(); log( "%s 0x%X destroy (nothing) << ", class_name(), _id ); char **sa = get(); @@ -455,4 +486,7 @@ Loggable::log_destroy ( void ) log_print( NULL, sa ); free_sa( sa ); + + if ( Loggable::_level == 0 ) + Loggable::flush(); } diff --git a/Loggable.H b/Loggable.H index b2fff02..92b5fcc 100644 --- a/Loggable.H +++ b/Loggable.H @@ -27,11 +27,11 @@ #include #include -using std::vector; #include -using std::map; #include -using std::string; +#include +using namespace std; + class Loggable; typedef Loggable *(create_func)(char **); @@ -49,6 +49,8 @@ class Loggable static map _class_map; + static queue _transaction; + private: int _id; @@ -60,6 +62,7 @@ private: void log_print( char **o, char **n ); static void log ( const char *fmt, ... ); + static void flush ( void ); static void indent ( void ) { @@ -81,7 +84,7 @@ public: void block_start ( void ) { - indent(); +// indent(); // log( "{\n" ); ++Loggable::_level; } @@ -90,7 +93,7 @@ public: block_end ( void ) { assert( --Loggable::_level >= 0 ); - indent(); +// indent(); // log( "}\n" ); }