/// <summary> /// Increase the context until it is unique, /// but don't let the pattern expand beyond Match_MaxBits.</summary> /// <param name="text">Source text</param> /// <param name="patchMargin"></param> internal void AddContext(string text, short patchMargin = 4) { if (text.Length == 0) { return; } var pattern = text.Substring(Start2, Length1); var padding = 0; // Look for the first and last matches of pattern in text. If two // different matches are found, increase the pattern length. while (text.IndexOf(pattern, StringComparison.Ordinal) != text.LastIndexOf(pattern, StringComparison.Ordinal) && pattern.Length < Constants.MatchMaxBits - patchMargin - patchMargin) { padding += patchMargin; var begin = Math.Max(0, Start2 - padding); pattern = text.Substring(begin, Math.Min(text.Length, Start2 + Length1 + padding) - begin); } // Add one chunk for good luck. padding += patchMargin; // Add the prefix. var begin1 = Math.Max(0, Start2 - padding); var prefix = text.Substring(begin1, Start2 - begin1); if (prefix.Length != 0) { Diffs.Insert(0, Diff.Equal(prefix)); } // Add the suffix. var begin2 = Start2 + Length1; var length = Math.Min(text.Length, Start2 + Length1 + padding) - begin2; var suffix = text.Substring(begin2, length); if (suffix.Length != 0) { Diffs.Add(Diff.Equal(suffix)); } // Roll back the start points. Start1 -= prefix.Length; Start2 -= prefix.Length; // Extend the lengths. Length1 += prefix.Length + suffix.Length; Length2 += prefix.Length + suffix.Length; }
public void AddPaddingBeforeFirstDiff(string nullPadding) { if (Diffs.Count == 0 || Diffs[0].Operation != Operation.Equal) { // Add nullPadding equality. Diffs.Insert(0, Diff.Equal(nullPadding)); Start1 -= nullPadding.Length; // Should be 0. Start2 -= nullPadding.Length; // Should be 0. Length1 += nullPadding.Length; Length2 += nullPadding.Length; } else if (nullPadding.Length > Diffs[0].Text.Length) { // Grow first equality. var firstDiff = Diffs[0]; var extraLength = nullPadding.Length - firstDiff.Text.Length; Diffs[0] = firstDiff.Replace(nullPadding.Substring(firstDiff.Text.Length) + firstDiff.Text); Start1 -= extraLength; Start2 -= extraLength; Length1 += extraLength; Length2 += extraLength; } }