| 1792 | */ |
| 1793 | protected: |
| 1794 | void patch_addContext(Patch &patch, const string_t &text) const { |
| 1795 | if (text.empty()) { |
| 1796 | return; |
| 1797 | } |
| 1798 | string_t pattern = safeMid(text, patch.start2, patch.length1); |
| 1799 | ssize_t padding = 0; |
| 1800 | |
| 1801 | // Look for the first and last matches of pattern in text. If two different |
| 1802 | // matches are found, increase the pattern length. |
| 1803 | while (text.find(pattern) != text.rfind(pattern) |
| 1804 | && (ssize_t)pattern.length() < Match_MaxBits - Patch_Margin - Patch_Margin) { |
| 1805 | padding += Patch_Margin; |
| 1806 | pattern = safeMid(text, std::max(0l, (long)(patch.start2 - padding)), |
| 1807 | std::min((ssize_t)text.length(), patch.start2 + patch.length1 + padding) |
| 1808 | - std::max(0l, (long)(patch.start2 - padding))); |
| 1809 | } |
| 1810 | // Add one chunk for good luck. |
| 1811 | padding += Patch_Margin; |
| 1812 | |
| 1813 | // Add the prefix. |
| 1814 | string_t prefix = safeMid(text, std::max(0l, (long)(patch.start2 - padding)), |
| 1815 | patch.start2 - std::max(0l, (long)(patch.start2 - padding))); |
| 1816 | if (!prefix.empty()) { |
| 1817 | patch.diffs.push_front(Diff(EQUAL, prefix)); |
| 1818 | } |
| 1819 | // Add the suffix. |
| 1820 | string_t suffix = safeMid(text, patch.start2 + patch.length1, |
| 1821 | std::min((ssize_t)text.length(), patch.start2 + patch.length1 + padding) |
| 1822 | - (patch.start2 + patch.length1)); |
| 1823 | if (!suffix.empty()) { |
| 1824 | patch.diffs.push_back(Diff(EQUAL, suffix)); |
| 1825 | } |
| 1826 | |
| 1827 | // Roll back the start points. |
| 1828 | patch.start1 -= prefix.length(); |
| 1829 | patch.start2 -= prefix.length(); |
| 1830 | // Extend the lengths. |
| 1831 | patch.length1 += prefix.length() + suffix.length(); |
| 1832 | patch.length2 += prefix.length() + suffix.length(); |
| 1833 | } |
| 1834 | |
| 1835 | /** |
| 1836 | * Compute a list of patches to turn text1 into text2. |