static void diffRecursively (TextDiff& td, const StringRegion& a, const StringRegion& b) { int indexA, indexB; const int len = findLongestCommonSubstring (a.text, a.length, b.text, b.length, indexA, indexB); if (len >= minLengthToMatch) { if (indexA > 0 && indexB > 0) diffSkippingCommonStart (td, StringRegion (a.text, a.start, indexA), StringRegion (b.text, b.start, indexB)); else if (indexA > 0) addDeletion (td, b.start, indexA); else if (indexB > 0) addInsertion (td, b.text, b.start, indexB); diffRecursively (td, StringRegion (a.text + indexA + len, a.start + indexA + len, a.length - indexA - len), StringRegion (b.text + indexB + len, b.start + indexB + len, b.length - indexB - len)); } else { if (a.length > 0) addDeletion (td, b.start, a.length); if (b.length > 0) addInsertion (td, b.text, b.start, b.length); } }
static void diffSkippingCommonStart (TextDiff& td, const StringRegion& a, const StringRegion& b) { String::CharPointerType sa (a.text); String::CharPointerType sb (b.text); const int maxLen = jmax (a.length, b.length); for (int i = 0; i < maxLen; ++i, ++sa, ++sb) { if (*sa != *sb) { diffRecursively (td, StringRegion (sa, a.start + i, a.length - i), StringRegion (sb, b.start + i, b.length - i)); break; } } }
static void diffSkippingCommonStart (TextDiff& td, StringRegion a, StringRegion b) { for (;;) { const juce_wchar ca = *a.text; const juce_wchar cb = *b.text; if (ca != cb || ca == 0) break; a.incrementStart(); b.incrementStart(); } diffRecursively (td, a, b); }