protected void patch_addContext ( Patch patch , String text ) { if ( text . length ( ) == 0 ) { return ; } String pattern = text . substring ( patch . start2 , patch . start2 + patch . length1 ) ; int 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 ) != text . lastIndexOf ( pattern ) && pattern . length ( ) < Match_MaxBits - Patch_Margin - Patch_Margin ) { padding += Patch_Margin ; pattern = text . substring ( Math . max ( 0 , patch . start2 - padding ) , Math . min ( text . length ( ) , patch . start2 + patch . length1 + padding ) ) ; } // Add one chunk for good luck. padding += Patch_Margin ; // Add the prefix. String prefix = text . substring ( Math . max ( 0 , patch . start2 - padding ) , patch . start2 ) ; if ( prefix . length ( ) != 0 ) { patch . diffs . addFirst ( new Diff ( Operation . EQUAL , prefix ) ) ; } // Add the suffix. String suffix = text . substring ( patch . start2 + patch . length1 , Math . min ( text . length ( ) , patch . start2 + patch . length1 + padding ) ) ; if ( suffix . length ( ) != 0 ) { patch . diffs . addLast ( new Diff ( Operation . EQUAL , suffix ) ) ; } // Roll back the start points. patch . start1 -= prefix . length ( ) ; patch . start2 -= prefix . length ( ) ; // Extend the lengths. patch . length1 += prefix . length ( ) + suffix . length ( ) ; patch . length2 += prefix . length ( ) + suffix . length ( ) ; }
Increase the context until it is unique but don t let the pattern expand beyond Match_MaxBits .