Get multiple-undo sort of working.

This commit is contained in:
Jonathan Moore Liles 2008-02-25 16:47:49 -06:00
parent 359c2bd72f
commit 489f5e8adf
2 changed files with 33 additions and 9 deletions

View File

@ -26,9 +26,9 @@
#include <stdarg.h> #include <stdarg.h>
FILE *Loggable::_fp; FILE *Loggable::_fp;
int Loggable::_log_id = 0; int Loggable::_log_id = 0;
int Loggable::_level = 0; int Loggable::_level = 0;
int Loggable::_undo_index = 1;
vector <Loggable *> Loggable::_loggables; vector <Loggable *> Loggable::_loggables;
@ -101,24 +101,44 @@ Loggable::undo ( void )
// fflush( _fp ); // fflush( _fp );
fseek( _fp, 0 - BUFSIZ, SEEK_END ); fseek( _fp, 0, SEEK_END );
size_t len = ftell( _fp );
// fseek( _fp, 0, SEEK_SET ); fseek( _fp, 0 - (BUFSIZ > len ? len : BUFSIZ), SEEK_END );
size_t len = fread( buf, 1, BUFSIZ, _fp ); len = fread( buf, 1, BUFSIZ, _fp );
char *s = buf + len - 1; char *s = buf + len - 1;
// FIXME: handle blocks // FIXME: handle blocks
for ( --s; *s && s > buf; --s ) int i = 1;
if ( *s == '\n' )
/* move back _undo_index lines from the end */
for ( int j = _undo_index; j-- ; )
for ( --s; *s && s >= buf; --s, ++i )
{ {
s++; if ( *s == '\n' )
break; {
// s++;
break;
}
} }
s++;
buf[ len ] = NULL; buf[ len ] = NULL;
// fsync( fileno( _fp ) );
/* pop the entry off the end */
/* fseek( _fp, 0 - i, SEEK_END ); */
/* ftruncate( fileno( _fp ), ftell( _fp ) ); */
if ( ! strlen( s ) )
{
printf( "corrupt undo file or no undo entries.\n" );
return;
}
printf( "undoing \"%s\"\n", s ); printf( "undoing \"%s\"\n", s );
int id; int id;
@ -142,8 +162,9 @@ Loggable::undo ( void )
} }
delete buf; ++_undo_index;
delete buf;
} }
@ -158,6 +179,8 @@ Loggable::log ( const char *fmt, ... )
vfprintf( _fp, fmt, args ); vfprintf( _fp, fmt, args );
va_end( args ); va_end( args );
} }
fflush( _fp );
} }

View File

@ -36,6 +36,7 @@ class Loggable
static FILE *_fp; static FILE *_fp;
static int _log_id; static int _log_id;
static int _level; static int _level;
static int _undo_index;
static vector <Loggable *> _loggables; static vector <Loggable *> _loggables;