X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fundostack.C;h=59eadada8047ecd3cdf7c02670037515754b4141;hp=4adef936fbae44f3b31d974eaf2da6e7a136b1e5;hb=e21b91bb19b37efa7644445f6137ee926d685795;hpb=585f4f65f1c7870acf05a52da02e601172e3beb4 diff --git a/cinelerra-5.1/cinelerra/undostack.C b/cinelerra-5.1/cinelerra/undostack.C index 4adef936..59eadada 100644 --- a/cinelerra-5.1/cinelerra/undostack.C +++ b/cinelerra-5.1/cinelerra/undostack.C @@ -257,9 +257,9 @@ UndoHash *UndoHashTable::add(char *txt, int len) return hp; } -UndoLine::UndoLine(UndoHash *hash) +UndoLine::UndoLine(UndoHash *hash, char *tp) { - this->txt = 0; this->len = 0; + this->txt = tp; this->len = 0; this->hash = hash; hash->occurs[va] = hash->occurs[vb] = 1; } @@ -280,7 +280,6 @@ int UndoLine::eq(UndoLine *ln) void UndoVersion::scan_lines(UndoHashTable *hash, char *sp, char *ep) { - append(new UndoLine(hash->bof)); for( int line=1; sphash->occurs[ver]; append(ln); } - append(new UndoLine(hash->eof)); } @@ -334,13 +332,21 @@ void UndoStackItem::set_data(char *data) UndoVersion alines(va), blines(vb); char *asp = data, *aep = asp + data_size-1; char *bsp = prev, *bep = bsp + prev_size-1; + alines.append(new UndoLine(hash.bof, asp)); + blines.append(new UndoLine(hash.bof, bsp)); alines.scan_lines(&hash, asp, aep); blines.scan_lines(&hash, bsp, bep); -// trim suffix int asz = alines.size(), bsz = blines.size(); +// trim matching suffix while( asz > 0 && bsz > 0 && alines[asz-1]->eq(blines[bsz-1]) ) { - --asz; --bsz; + aep = alines[--asz]->txt; alines.remove_object(); + bep = blines[--bsz]->txt; blines.remove_object(); } +// include for matching last item + alines.append(new UndoLine(hash.eof, aep)); + blines.append(new UndoLine(hash.eof, bep)); + hash.eof->line[va] = asz++; + hash.eof->line[vb] = bsz++; int ai = 0, bi = 0; while( ai < asz || bi < bsz ) {