diff options
Diffstat (limited to 'app/bin/cundo.c')
| -rw-r--r-- | app/bin/cundo.c | 49 | 
1 files changed, 42 insertions, 7 deletions
| diff --git a/app/bin/cundo.c b/app/bin/cundo.c index e27ee75..1ed5588 100644 --- a/app/bin/cundo.c +++ b/app/bin/cundo.c @@ -330,16 +330,25 @@ LOG( log_undo, 3, ( "TruncateStream( , %ld )\n", off ) )  	UASSERT( stream->stream_da.cnt >= 0, stream->stream_da.cnt );  	return TRUE;  } +  BOOL_T WriteObject( stream_p stream, char op, track_p trk )  { +	void * buff = NULL; +	long len = 0;  	if (!WriteStream( stream, &op, sizeof op ) ||  		!WriteStream( stream, &trk, sizeof trk ) ||  		!WriteStream( stream, trk, sizeof *trk ) ||  		!WriteStream( stream, trk->endPt, trk->endCnt * sizeof trk->endPt[0] ) || -		!WriteStream( stream, trk->extraData, trk->extraSize ) ) { +		!WriteStream( stream, trk->extraData, trk->extraSize ))  		return FALSE; -	} +	/* Add a copy of the any type specific data before it is tampered with, for example */ +	StoreTrackData(trk,&buff,&len); +	if (!WriteStream( stream, &len, sizeof len )) +		return FALSE; +	if (len) +		if (!WriteStream( stream, buff, len )) +			return FALSE;  	return TRUE;  } @@ -371,7 +380,19 @@ static BOOL_T ReadObject( stream_p stream, BOOL_T needRedo )  		tempTrk.extraData = trk->extraData;  	if (!ReadStream( stream, tempTrk.extraData, tempTrk.extraSize ))  		return FALSE; -	RebuildTrackSegs(&tempTrk);  //If we had an array of Segs - recreate it +	long Addsize; +	void * tempBuff; +	/* Fix up pts to be as big as it was before -> because it may have changed since */ +	if (!ReadStream (stream, &Addsize, sizeof Addsize)) +		return FALSE; +	if (Addsize) { +		tempBuff = MyMalloc(Addsize); +		if (!ReadStream( stream, tempBuff, Addsize )) +			return FALSE; +		ReplayTrackData(&tempTrk, tempBuff, Addsize); +		MyFree(tempBuff); +	} +	RebuildTrackSegs(&tempTrk);   //If we had an array of Segs - recreate it  	if (recordUndo) Rprintf( "Restore T%D(%d) @ %lx\n", trk->index, tempTrk.index, (long)trk );  	tempTrk.index = trk->index;  	tempTrk.next = trk->next; @@ -385,7 +406,7 @@ static BOOL_T ReadObject( stream_p stream, BOOL_T needRedo )  } -static void RedrawInStream( stream_p stream, long start, long end, BOOL_T draw ) +static BOOL_T RedrawInStream( stream_p stream, long start, long end, BOOL_T draw )  {  	char op;  	track_p trk; @@ -395,8 +416,12 @@ static void RedrawInStream( stream_p stream, long start, long end, BOOL_T draw )  		if (!ReadStream( stream, &op, sizeof op ) ||  			!ReadStream( stream, &trk, sizeof trk ) ||  			!ReadStream( stream, &tempTrk, sizeof tempTrk ) ) -			return; -		stream->curr += tempTrk.extraSize + tempTrk.endCnt*sizeof tempTrk.endPt[0]; +			return FALSE; +		stream->curr += tempTrk.extraSize + tempTrk.endCnt*sizeof tempTrk.endPt[0];; +		long Addsize; +		if (!ReadStream( stream, &Addsize, sizeof Addsize )) +				return FALSE; +		stream->curr += Addsize;  		if (!trk->deleted) {  			if (draw)  				DrawNewTrack( trk ); @@ -404,6 +429,7 @@ static void RedrawInStream( stream_p stream, long start, long end, BOOL_T draw )  				UndrawNewTrack( trk );  		}  	} +	return TRUE;  } @@ -421,15 +447,20 @@ LOG( log_undo, 3, ( "DeleteInSteam( , %ld, %ld )\n", start, end ) )  			return FALSE;  		UASSERT( op == ModifyOp || op == DeleteOp, (long)op );  		if (!ReadStream( stream, &trk, sizeof trk ) || -			!ReadStream( stream, &tempTrk, sizeof tempTrk ) ) +			!ReadStream( stream, &tempTrk, sizeof tempTrk ))  			return FALSE;  		stream->curr += tempTrk.extraSize + tempTrk.endCnt*sizeof tempTrk.endPt[0]; +		long Addsize; +		if (!ReadStream( stream, &Addsize, sizeof Addsize )) +			return FALSE; +		stream->curr += Addsize;  		if (op == DeleteOp) {  			if (recordUndo) Rprintf( "    Free T%D(%d) @ %lx\n", trk->index, tempTrk.index, (long)trk );  			UASSERT( IsTrackDeleted(trk), (long)trk );  			trk->index = -1;  			delCount++;  		} +  	}  	if (delCount) {  		for (ptrk=&to_first; *ptrk; ) { @@ -475,6 +506,10 @@ static BOOL_T SetDeleteOpInStream( stream_p stream, long start, long end, track_  		if (!ReadStream( stream, &tempTrk, sizeof tempTrk ))  			return FALSE;  		stream->curr += tempTrk.extraSize + tempTrk.endCnt*sizeof tempTrk.endPt[0]; +		long Addsize; +		if (!ReadStream( stream, &Addsize, sizeof Addsize)) +				return FALSE; +		stream->curr += Addsize;  	}  	UASSERT( "Cannot find undo record to convert to DeleteOp", 0 );  	return FALSE; | 
