예제 #1
0
        /// <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;
        }
예제 #2
0
 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;
     }
 }