Revision: 3916
http://svn.sourceforge.net/winmerge/?rev=3916&view=rev
Author: kimmov
Date: 2006-12-05 08:39:31 -0800 (Tue, 05 Dec 2006)
Log Message:
-----------
PATCH: [ 1608846 ] Create a class for moved blocks
Modified Paths:
--------------
trunk/Src/Changes.txt
trunk/Src/DiffWrapper.cpp
trunk/Src/DiffWrapper.h
trunk/Src/Merge.dsp
trunk/Src/MergeDoc.cpp
trunk/Src/MergeDoc.h
Added Paths:
-----------
trunk/Src/MovedLines.cpp
trunk/Src/MovedLines.h
Modified: trunk/Src/Changes.txt
===================================================================
--- trunk/Src/Changes.txt 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/Changes.txt 2006-12-05 16:39:31 UTC (rev 3916)
@@ -2,6 +2,11 @@
Add new items to top.
(This summarizes all changes to all files under Src, including Src\Languages.)
+2006-12-05 Kimmo
+ PATCH: [ 1608846 ] Create a class for moved blocks
+ Src: DiffWrapper.cpp DiffWrapper.h Merge.dsp MergeDoc.cpp MergeDoc.h
+ Src new files: MovedLines.cpp MovedLines.h
+
2006-12-04 Tim
PATCH: [ 1607193 ] INI Syntax Improvements
Src/editlib: ini.cpp
Modified: trunk/Src/DiffWrapper.cpp
===================================================================
--- trunk/Src/DiffWrapper.cpp 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/DiffWrapper.cpp 2006-12-05 16:39:31 UTC (rev 3916)
@@ -31,6 +31,7 @@
#include "coretools.h"
#include "diffcontext.h"
#include "DiffList.h"
+#include "MovedLines.h"
#include "diffwrapper.h"
#include "diff.h"
#include "FileTransform.h"
@@ -78,13 +79,13 @@
: m_FilterCommentsManager(new FilterCommentsManager)
, m_bCreatePatchFile(FALSE)
, m_bUseDiffList(FALSE)
-, m_bDetectMovedBlocks(FALSE)
, m_bAddCmdLine(TRUE)
, m_bAppendFiles(FALSE)
, m_nDiffs(0)
, m_infoPrediffer(NULL)
, m_pDiffList(NULL)
, m_bPathsAreTemp(FALSE)
+, m_pMovedLines(NULL)
{
ZeroMemory(&m_settings, sizeof(DIFFSETTINGS));
ZeroMemory(&m_globalSettings, sizeof(DIFFSETTINGS));
@@ -104,6 +105,7 @@
{
delete m_infoPrediffer;
delete m_FilterCommentsManager;
+ delete m_pMovedLines;
}
/**
@@ -197,18 +199,6 @@
}
/**
- * @brief Returns current set of options used for patch-file creation.
- * @param [in, out] options Pointer to structure where options are stored.
- */
-void CDiffWrapper::GetPatchOptions(PATCHOPTIONS *options) const
-{
- ASSERT(options);
- options->nContext = m_settings.context;
- options->outputStyle = m_settings.outputStyle;
- options->bAddCommandline = m_bAddCmdLine;
-}
-
-/**
* @brief Set options used for patch-file creation.
* @param [in] options Pointer to structure having new options.
*/
@@ -221,6 +211,24 @@
}
/**
+ * @brief Enables/disables moved block detection.
+ * @param [in] bDetectMovedBlocks If TRUE moved blocks are detected.
+ */
+void CDiffWrapper::SetDetectMovedBlocks(BOOL bDetectMovedBlocks)
+{
+ if (bDetectMovedBlocks)
+ {
+ if (m_pMovedLines == NULL)
+ m_pMovedLines = new MovedLines;
+ }
+ else
+ {
+ delete m_pMovedLines;
+ m_pMovedLines = NULL;
+ }
+}
+
+/**
* @brief Test for trivial only characters in string
* @param [in] Start - Start position in string
* @param [in] End - One character pass the end position of the string
@@ -1034,14 +1042,6 @@
}
/**
- * @brief Determines if patch-files are appended (not overwritten)
- */
-BOOL CDiffWrapper::GetAppendFiles() const
-{
- return m_bAppendFiles;
-}
-
-/**
* @brief Enables/disables patch-file appending (files with same filename are appended)
*/
BOOL CDiffWrapper::SetAppendFiles(BOOL bAppendFiles)
@@ -1068,39 +1068,6 @@
}
/**
- * @brief clear the lists (left & right) of moved blocks before RunFileDiff
- */
-void CDiffWrapper::ClearMovedLists()
-{
- m_moved0.RemoveAll();
- m_moved1.RemoveAll();
-}
-
-/**
- * @brief Get left->right info for a moved line (real line number)
- */
-int CDiffWrapper::RightLineInMovedBlock(int leftLine)
-{
- int rightLine;
- if (m_moved0.Lookup(leftLine, rightLine))
- return rightLine;
- else
- return -1;
-}
-
-/**
- * @brief Get right->left info for a moved line (real line number)
- */
-int CDiffWrapper::LeftLineInMovedBlock(int rightLine)
-{
- int leftLine;
- if (m_moved1.Lookup(rightLine, leftLine))
- return leftLine;
- else
- return -1;
-}
-
-/**
* @brief Compare two files using diffutils.
*
* Compare two files (in DiffFileData param) using diffutils. Run diffutils
@@ -1125,7 +1092,7 @@
{
// Diff files. depth is zero because we are not comparing dirs
*diffs = diff_2_files (diffData->m_inf, 0, bin_status,
- m_bDetectMovedBlocks, bin_file);
+ (m_pMovedLines != NULL), bin_file);
CopyDiffutilTextStats(diffData->m_inf, diffData);
}
__except (EXCEPTION_EXECUTE_HANDLER)
@@ -1216,24 +1183,27 @@
translate_range(&inf[1], first1, last1, &trans_a1, &trans_b1);
// Store information about these blocks in moved line info
- if (thisob->match0>=0)
+ if (GetDetectMovedBlocks())
{
- ASSERT(thisob->inserted);
- for (int i=0; i<thisob->inserted; ++i)
+ if (thisob->match0>=0)
{
- int line0 = i+thisob->match0 + (trans_a0-first0-1);
- int line1 = i+thisob->line1 + (trans_a1-first1-1);
- m_moved1[line1]=line0;
+ ASSERT(thisob->inserted);
+ for (int i=0; i<thisob->inserted; ++i)
+ {
+ int line0 = i+thisob->match0 + (trans_a0-first0-1);
+ int line1 = i+thisob->line1 + (trans_a1-first1-1);
+ GetMovedLines()->Add(MovedLines::SIDE_RIGHT, line1, line0);
+ }
}
- }
- if (thisob->match1>=0)
- {
- ASSERT(thisob->deleted);
- for (int i=0; i<thisob->deleted; ++i)
+ if (thisob->match1>=0)
{
- int line0 = i+thisob->line0 + (trans_a0-first0-1);
- int line1 = i+thisob->match1 + (trans_a1-first1-1);
- m_moved0[line0]=line1;
+ ASSERT(thisob->deleted);
+ for (int i=0; i<thisob->deleted; ++i)
+ {
+ int line0 = i+thisob->line0 + (trans_a0-first0-1);
+ int line1 = i+thisob->match1 + (trans_a1-first1-1);
+ GetMovedLines()->Add(MovedLines::SIDE_LEFT, line0, line1);
+ }
}
}
Modified: trunk/Src/DiffWrapper.h
===================================================================
--- trunk/Src/DiffWrapper.h 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/DiffWrapper.h 2006-12-05 16:39:31 UTC (rev 3916)
@@ -41,6 +41,7 @@
struct file_data;
class FilterCommentsManager;
struct FilterCommentsSet;
+class MovedLines;
/** @enum COMPARE_TYPE
* @brief Different foldercompare methods.
@@ -213,11 +214,9 @@
void SetTextForAutomaticPrediff(const CString &text);
void SetPrediffer(PrediffingInfo * prediffer =NULL);
void GetPrediffer(PrediffingInfo * prediffer);
- void GetPatchOptions(PATCHOPTIONS *options) const;
void SetPatchOptions(const PATCHOPTIONS *options);
- void SetDetectMovedBlocks(BOOL bDetectMovedBlocks) { m_bDetectMovedBlocks = bDetectMovedBlocks; }
- BOOL GetDetectMovedBlocks() { return m_bDetectMovedBlocks; }
- BOOL GetAppendFiles() const;
+ void SetDetectMovedBlocks(BOOL bDetectMovedBlocks);
+ BOOL GetDetectMovedBlocks() { return (m_pMovedLines != NULL); }
BOOL SetAppendFiles(BOOL bAppendFiles);
void SetPaths(const CString &filepath1, const CString &filepath2, BOOL tempPaths);
void SetAlternativePaths(const CString &altPath1, const CString &altPath2);
@@ -227,11 +226,7 @@
void FixLastDiffRange(int leftBufferLines, int rightBufferLines, BOOL left);
void StartDirectoryDiff();
void EndDirectoryDiff();
- const CMap<int, int, int, int> * GetMoved0() { return &m_moved0; }
- const CMap<int, int, int, int> * GetMoved1() { return &m_moved1; }
- int RightLineInMovedBlock(int leftLine);
- int LeftLineInMovedBlock(int rightLine);
- void ClearMovedLists();
+ MovedLines * GetMovedLines() { return m_pMovedLines; }
void SetCompareFiles(const CString &OriginalFile1, const CString &OriginalFile2);
protected:
@@ -262,14 +257,12 @@
/// prediffer info are stored only for MergeDoc
CString m_sToFindPrediffer;
BOOL m_bUseDiffList; /**< Are results returned in difflist? */
- BOOL m_bDetectMovedBlocks; /**< Are moved blocks detected? */
BOOL m_bCreatePatchFile; /**< Do we create a patch file? */
BOOL m_bAddCmdLine; /**< Do we add commandline to patch file? */
BOOL m_bAppendFiles; /**< Do we append to existing patch file? */
int m_nDiffs; /**< Difference count */
DiffList *m_pDiffList; /**< Pointer to external DiffList */
- CMap<int, int, int, int> m_moved0; /**< Moved lines map for first side */
- CMap<int, int, int, int> m_moved1; /**< Moved lines map for second side */
+ MovedLines * m_pMovedLines;
FilterCommentsManager * m_FilterCommentsManager; /**< Comments filtering manager */
};
Modified: trunk/Src/Merge.dsp
===================================================================
--- trunk/Src/Merge.dsp 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/Merge.dsp 2006-12-05 16:39:31 UTC (rev 3916)
@@ -590,6 +590,10 @@
# End Source File
# Begin Source File
+SOURCE=.\MovedLines.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Common\multiformatText.cpp
# End Source File
# Begin Source File
@@ -1281,6 +1285,10 @@
# End Source File
# Begin Source File
+SOURCE=.\MovedLines.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Common\multiformatText.h
# End Source File
# Begin Source File
Modified: trunk/Src/MergeDoc.cpp
===================================================================
--- trunk/Src/MergeDoc.cpp 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/MergeDoc.cpp 2006-12-05 16:39:31 UTC (rev 3916)
@@ -36,6 +36,7 @@
#include "diff.h"
#include "diffcontext.h" // FILE_SAME
+#include "MovedLines.h"
#include "getopt.h"
#include "fnmatch.h"
#include "coretools.h"
@@ -430,7 +431,8 @@
m_diffList.Clear();
m_nCurDiff = -1;
// Clear moved lines lists
- m_diffWrapper.ClearMovedLists();
+ if (m_diffWrapper.GetDetectMovedBlocks())
+ m_diffWrapper.GetMovedLines()->Clear();
// Set paths for diffing and run diff
m_diffWrapper.SetPaths(m_pTempFiles->GetLeft(), m_pTempFiles->GetRight(), TRUE);
@@ -487,8 +489,8 @@
PrimeTextBuffers();
// Apply flags to lines that moved, to differentiate from appeared/disappeared lines
- FlagMovedLines(m_diffWrapper.GetMoved0(), m_ptBuf[0]);
- FlagMovedLines(m_diffWrapper.GetMoved1(), m_ptBuf[1]);
+ if (m_diffWrapper.GetDetectMovedBlocks())
+ FlagMovedLines(m_diffWrapper.GetMovedLines(), m_ptBuf[0], m_ptBuf[1]);
// After PrimeTextBuffers() we know amount of real diffs
// (m_nDiffs) and trivial diffs (m_nTrivialDiffs)
@@ -534,24 +536,42 @@
}
/** @brief Adjust all different lines that were detected as actually matching moved lines */
-void CMergeDoc::FlagMovedLines(const CMap<int, int, int, int> * movedLines, CDiffTextBuffer * pBuffer)
+void CMergeDoc::FlagMovedLines(MovedLines * pMovedLines, CDiffTextBuffer * pBuffer1,
+ CDiffTextBuffer * pBuffer2)
{
int i;
- for (i=0; i<pBuffer->GetLineCount(); ++i)
+ for (i = 0; i < pBuffer1->GetLineCount(); ++i)
{
- int j=-1;
- if (movedLines->Lookup(i, j))
+ int j = pMovedLines->LineInBlock(i, MovedLines::SIDE_LEFT);
+ if (j != -1)
{
TRACE(_T("%d->%d\n"), i, j);
ASSERT(j>=0);
// We only flag lines that are already marked as being different
- int apparent = pBuffer->ComputeApparentLine(i);
- if (pBuffer->FlagIsSet(apparent, LF_DIFF))
+ int apparent = pBuffer1->ComputeApparentLine(i);
+ if (pBuffer1->FlagIsSet(apparent, LF_DIFF))
{
- pBuffer->SetLineFlag(apparent, LF_MOVED, TRUE, FALSE, FALSE);
+ pBuffer1->SetLineFlag(apparent, LF_MOVED, TRUE, FALSE, FALSE);
}
}
}
+
+ for (i=0; i<pBuffer2->GetLineCount(); ++i)
+ {
+ int j = pMovedLines->LineInBlock(i, MovedLines::SIDE_RIGHT);
+ if (j != -1)
+ {
+ TRACE(_T("%d->%d\n"), i, j);
+ ASSERT(j>=0);
+ // We only flag lines that are already marked as being different
+ int apparent = pBuffer2->ComputeApparentLine(i);
+ if (pBuffer2->FlagIsSet(apparent, LF_DIFF))
+ {
+ pBuffer2->SetLineFlag(apparent, LF_MOVED, TRUE, FALSE, FALSE);
+ }
+ }
+ }
+
// todo: Need to record actual moved information
}
@@ -1233,7 +1253,12 @@
return -1;
int realLeftLine = m_ptBuf[0]->ComputeRealLine(apparentLeftLine);
- int realRightLine = m_diffWrapper.RightLineInMovedBlock(realLeftLine);
+ int realRightLine = -1;
+ if (m_diffWrapper.GetDetectMovedBlocks())
+ {
+ realRightLine = m_diffWrapper.GetMovedLines()->LineInBlock(realLeftLine,
+ MovedLines::SIDE_LEFT);
+ }
if (realRightLine != -1)
return m_ptBuf[1]->ComputeApparentLine(realRightLine);
else
@@ -1249,7 +1274,12 @@
return -1;
int realRightLine = m_ptBuf[1]->ComputeRealLine(apparentRightLine);
- int realLeftLine = m_diffWrapper.LeftLineInMovedBlock(realRightLine);
+ int realLeftLine = -1;
+ if (m_diffWrapper.GetDetectMovedBlocks())
+ {
+ realLeftLine = m_diffWrapper.GetMovedLines()->LineInBlock(realRightLine,
+ MovedLines::SIDE_RIGHT);
+ }
if (realLeftLine != -1)
return m_ptBuf[0]->ComputeApparentLine(realLeftLine);
else
Modified: trunk/Src/MergeDoc.h
===================================================================
--- trunk/Src/MergeDoc.h 2006-12-05 16:00:03 UTC (rev 3915)
+++ trunk/Src/MergeDoc.h 2006-12-05 16:39:31 UTC (rev 3916)
@@ -348,7 +348,8 @@
DECLARE_MESSAGE_MAP()
private:
void PrimeTextBuffers();
- void FlagMovedLines(const CMap<int, int, int, int> * movedLines, CDiffTextBuffer * pBuffer);
+ void FlagMovedLines(MovedLines * pMovedLines, CDiffTextBuffer * pBuffer1,
+ CDiffTextBuffer * pBuffer2);
CString GetFileExt(const CString& sFileName, const CString& sDescription);
};
Added: trunk/Src/MovedLines.cpp
===================================================================
--- trunk/Src/MovedLines.cpp (rev 0)
+++ trunk/Src/MovedLines.cpp 2006-12-05 16:39:31 UTC (rev 3916)
@@ -0,0 +1,71 @@
+/**
+ * @file MovedLines.cpp
+ *
+ * @brief Implementation of MovedLines class.
+ */
+
+#include "stdafx.h"
+#include "MovedLines.h"
+
+/**
+ * @brief clear the lists of moved blocks.
+ */
+void MovedLines::Clear()
+{
+ m_moved0.RemoveAll();
+ m_moved1.RemoveAll();
+}
+
+/**
+ * @brief Add moved block to the list.
+ * @param [in] side1 First side we are mapping.
+ * @param [in] line1 Linenumber in side first side.
+ * @param [in] line2 Linenumber in second side.
+ */
+void MovedLines::Add(ML_SIDE side1, unsigned int line1, unsigned int line2)
+{
+ MovedLineMap * list = NULL;
+ if (side1 == ML_SIDE::SIDE_LEFT)
+ list = &m_moved0;
+ else
+ list = &m_moved1;
+
+ (*list)[line1] = line2;
+}
+
+/**
+ * @brief Check if line is in moved block.
+ * @param [in] line Linenumber to check.
+ * @param [in] side Side of the linenumber.
+ */
+int MovedLines::LineInBlock(unsigned int line, ML_SIDE side)
+{
+ if (side == ML_SIDE::SIDE_LEFT)
+ return SecondSideInMovedBlock(line);
+ else
+ return FirstSideInMovedBlock(line);
+}
+
+/**
+ * @brief Get right->left info for a moved line (real line number)
+ */
+int MovedLines::FirstSideInMovedBlock(unsigned int secondSideLine)
+{
+ int firstSideLine;
+ if (m_moved1.Lookup(secondSideLine, firstSideLine))
+ return firstSideLine;
+ else
+ return -1;
+}
+
+/**
+ * @brief Get left->right info for a moved line (real line number)
+ */
+int MovedLines::SecondSideInMovedBlock(unsigned int firstSideLine)
+{
+ int secondSideLine;
+ if (m_moved0.Lookup(firstSideLine, secondSideLine))
+ return secondSideLine;
+ else
+ return -1;
+}
Added: trunk/Src/MovedLines.h
===================================================================
--- trunk/Src/MovedLines.h (rev 0)
+++ trunk/Src/MovedLines.h 2006-12-05 16:39:31 UTC (rev 3916)
@@ -0,0 +1,40 @@
+/**
+ * @file MovedLines.h
+ *
+ * @brief Declaration of MovedLines class
+ */
+
+#ifndef _MOVEDLINES_H_
+#define _MOVEDLINES_H_
+
+typedef CMap<int, int, int, int> MovedLineMap;
+
+/**
+ * @brief Container class for moved lines/blocks.
+ * This class contains list of moved blocs/lines we detect
+ * when comparing files.
+ */
+class MovedLines
+{
+public:
+ /** @brief Sides for mapping functions. */
+ enum ML_SIDE
+ {
+ SIDE_LEFT,
+ SIDE_RIGHT,
+ };
+
+ void Clear();
+ void Add(ML_SIDE side1, unsigned int line1, unsigned int line2);
+ int LineInBlock(unsigned int line, ML_SIDE side);
+
+protected:
+ int FirstSideInMovedBlock(unsigned int secondSideLine);
+ int SecondSideInMovedBlock(unsigned int firstSideLine);
+
+private:
+ MovedLineMap m_moved0; /**< Moved lines map for first side */
+ MovedLineMap m_moved1; /**< Moved lines map for second side */
+};
+
+#endif // _MOVEDLINES_H_
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|