You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/kompare/libdiff2/difference.cpp

138 lines
3.4 KiB

/***************************************************************************
difference.cpp - description
-------------------
begin : Sun Mar 4 2001
copyright : (C) 2001-2003 by Otto Bruggeman
and John Firebaugh
email : otto.bruggeman@home.nl
jfirebaugh@kde.org
****************************************************************************/
/***************************************************************************
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
***************************************************************************/
#include "difference.h"
#include "levenshteintable.h"
using namespace Diff2;
Difference::Difference( int sourceLineNo, int destinationLineNo, int type ) :
m_type( type ),
m_sourceLineNo( sourceLineNo ),
m_destinationLineNo( destinationLineNo ),
m_applied( false )
{
}
Difference::~Difference()
{
}
void Difference::addSourceLine( TQString line )
{
m_sourceLines.append( new DifferenceString( line ) );
}
void Difference::addDestinationLine( TQString line )
{
m_destinationLines.append( new DifferenceString( line ) );
}
int Difference::sourceLineCount() const
{
return m_sourceLines.count();
}
int Difference::destinationLineCount() const
{
return m_destinationLines.count();
}
void Difference::apply( bool apply )
{
m_applied = apply;
}
void Difference::determineInlineDifferences()
{
LevenshteinTable table;
if ( m_type != Difference::Change )
return;
// Do nothing for now when the slc != dlc
// One could try to find the closest matching destination string for any
// of the source strings but this is compute intensive
if ( sourceLineCount() != destinationLineCount() )
return;
int slc = sourceLineCount();
for ( int i = 0; i < slc; ++i )
{
DifferenceString* sl = sourceLineAt( i );
DifferenceString* dl = destinationLineAt( i );
// FIXME: If the table cant be created dont do the rest
table.createTable( sl, dl );
table.createListsOfMarkers();
}
}
TQString Difference::recreateDifference() const
{
TQString difference;
// source
DifferenceStringListConstIterator stringIt = m_sourceLines.begin();
DifferenceStringListConstIterator sEnd = m_sourceLines.end();
for ( ; stringIt != sEnd; ++stringIt )
{
switch ( m_type )
{
case Change:
case Delete:
difference += "-";
break;
default:
// Insert but this is not possible in source
// Unchanged will be handled in destination
// since they are the same
// kdDebug( 8101 ) << "Go away, nothing to do for you in source..." << endl;
continue;
}
difference += (*stringIt)->string();
}
//destination
stringIt = m_destinationLines.begin();
sEnd = m_destinationLines.end();
for ( ; stringIt != sEnd; ++stringIt )
{
switch ( m_type )
{
case Change:
case Insert:
difference += "+";
break;
case Unchanged:
difference += " ";
break;
default: // Delete but this is not possible in destination
// kdDebug( 8101 ) << "Go away, nothing to do for you in destination..." << endl;
continue;
}
difference += (*stringIt)->string();
}
return difference;
}