/// <summary> /// Compare two blocks of characters against each other. /// </summary> /// <param name="poAlpha">First block of characters.</param> /// <param name="poBeta">Second block of characters.</param> public override void Compare(Block poAlpha1, Block poBeta1) { Sections.OnAddSection += new Sections.AddSectionHandler(Sections_OnAddSection); BlockOfCharacters poAlpha = (BlockOfCharacters)poAlpha1; BlockOfCharacters poBeta = (BlockOfCharacters)poBeta1; this.MinElements = this.MinChars; Analyse(1, poAlpha, 1, poBeta); //Add missing alpha segments. SegmentComparer oSegAComparer = new SegmentComparer(); oSegAComparer.ComparisonMethod = SegmentComparer.ComparisonType.AlphaPosition; AddMissingSegments("A1", oSegAComparer, mcSegA, poAlpha); //Add missing beta segments. SegmentComparer oSegBComparer = new SegmentComparer(); oSegBComparer.ComparisonMethod = SegmentComparer.ComparisonType.BetaPosition; AddMissingSegments("B1", oSegBComparer, mcSegB, poBeta); //Check if user has chosen to cancel run. if (Interrupt.Reason == "Cancel") { return; } //Merge into report. long nCountA = 0; long nCountB = 0; string sMatchIndent = string.Empty; string sInsertIndent = string.Empty; SegmentOfCharacters oSegA = new SegmentOfCharacters(); SegmentOfCharacters oSegB = new SegmentOfCharacters(); oSegA.Type = "X1"; oSegA.Data = new BlockOfCharacters(); oSegB.Type = "Z1"; oSegB.Data = new BlockOfCharacters(); SectionOfCharacters oSection = new SectionOfCharacters(); while (nCountA < mcSegA.Count || nCountB < mcSegB.Count) { if (nCountA < mcSegA.Count) { oSegA = (SegmentOfCharacters)mcSegA[(int)nCountA]; } if (nCountB < mcSegB.Count) { oSegB = (SegmentOfCharacters)mcSegB[(int)nCountB]; } if (oSegA.Type.Substring(0, 1) == "M" && oSegB.Type.Substring(0, 1) == "M") { if (!oSegA.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegA.Type; oSection.Position = oSegA.PositionA; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegA.Size; oSection.Data = oSegA.Data; oSection.Indentation = sInsertIndent; Sections.Add(oSection); oSegA.Display(sInsertIndent); sMatchIndent = oSegA.Indent; sInsertIndent = oSegA.Indent; } nCountA++; nCountB++; } else if (oSegA.Type.Substring(0, 1) == "M" && oSegB.Type.Substring(0, 1) != "M") { if (!oSegB.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegB.Type; oSection.Position = oSegB.PositionB; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegB.Size; oSection.Data = oSegB.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegB.Display(sMatchIndent); } nCountB++; } else if (oSegA.Type.Substring(0, 1) != "M" && oSegB.Type.Substring(0, 1) == "M") { if (!oSegA.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegA.Type; oSection.Position = oSegA.PositionA; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegA.Size; oSection.Data = oSegA.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegA.Display(sMatchIndent); sInsertIndent = oSegA.Indent; } nCountA++; } else if (oSegA.Type.Substring(0, 1) != "M" && oSegB.Type.Substring(0, 1) != "M") { if (oSegA.PositionA < oSegB.PositionB) { if (!oSegA.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegA.Type; oSection.Position = oSegA.PositionA; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegA.Size; oSection.Data = oSegA.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegA.Display(sMatchIndent); sInsertIndent = oSegA.Indent; } if (!oSegB.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegB.Type; oSection.Position = oSegB.PositionB; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegB.Size; oSection.Data = oSegB.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegB.Display(sMatchIndent); } } else { if (!oSegB.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegB.Type; oSection.Position = oSegB.PositionB; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegB.Size; oSection.Data = oSegB.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegB.Display(sMatchIndent); } if (!oSegA.Data.IsEmpty) { oSection = new SectionOfCharacters(); oSection.Type = oSegA.Type; oSection.Position = oSegA.PositionA; oSection.PositionA = oSegA.PositionA; oSection.PositionB = oSegB.PositionB; oSection.Size = oSegA.Size; oSection.Data = oSegA.Data; oSection.Indentation = sMatchIndent; Sections.Add(oSection); oSegA.Display(sMatchIndent); sInsertIndent = oSegA.Indent; } } nCountA++; nCountB++; } } }
/// <summary> /// Build comparisons list. /// </summary> private void BuildComparisons() { mcComparisons = new List <Comparison>(); for (int nCount = 0; nCount < Sections.Count; nCount++) { Section oSection = (Section)Sections[nCount]; if (oSection is SectionOfLines) { SectionOfLines oSectionOfLines = (SectionOfLines)oSection; BlockOfLines moBlock = (BlockOfLines)oSectionOfLines.Data; if (oSectionOfLines.Type.Substring(0, 1) == "M") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfLines.PositionA + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Line, Comparison.MatchEnum.Match, position, sData, position, sData); mcComparisons.Add(oComparison); } } else if (oSectionOfLines.Type.Substring(0, 1) == "A") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfLines.PositionA + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Line, Comparison.MatchEnum.InsertNew, position, sData, -1, string.Empty); mcComparisons.Add(oComparison); } } else if (oSectionOfLines.Type.Substring(0, 1) == "B") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfLines.PositionB + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Line, Comparison.MatchEnum.DeleteOld, -1, string.Empty, position, sData); mcComparisons.Add(oComparison); } } } if (oSection is SectionOfCharacters) { SectionOfCharacters oSectionOfCharacters = (SectionOfCharacters)oSection; BlockOfCharacters moBlock = (BlockOfCharacters)oSectionOfCharacters.Data; if (oSectionOfCharacters.Type.Substring(0, 1) == "M") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfCharacters.PositionA + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Character, Comparison.MatchEnum.Match, position, sData, position, sData); mcComparisons.Add(oComparison); } } else if (oSectionOfCharacters.Type.Substring(0, 1) == "A") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfCharacters.PositionA + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Character, Comparison.MatchEnum.InsertNew, position, sData, -1, string.Empty); mcComparisons.Add(oComparison); } } else if (oSectionOfCharacters.Type.Substring(0, 1) == "B") { for (long nIndex = 0; nIndex < moBlock.Elements.Length; nIndex++) { long position = oSectionOfCharacters.PositionB + nIndex; string sData = moBlock.Elements[nIndex].ToDisplay(); Comparison oComparison = new Comparison(Comparison.GranularityEnum.Character, Comparison.MatchEnum.DeleteOld, -1, string.Empty, position, sData); mcComparisons.Add(oComparison); } } } } }