| 2087 | */ |
| 2088 | public: |
| 2089 | string_t patch_addPadding(Patches &patches) const { |
| 2090 | short paddingLength = Patch_Margin; |
| 2091 | string_t nullPadding; |
| 2092 | for (short x = 1; x <= paddingLength; x++) { |
| 2093 | nullPadding += (char_t)x; |
| 2094 | } |
| 2095 | |
| 2096 | // Bump all the patches forward. |
| 2097 | for (typename Patches::iterator cur_patch = patches.begin(); cur_patch != patches.end(); ++cur_patch) { |
| 2098 | (*cur_patch).start1 += paddingLength; |
| 2099 | (*cur_patch).start2 += paddingLength; |
| 2100 | } |
| 2101 | |
| 2102 | // Add some padding on start of first diff. |
| 2103 | Patch &firstPatch = patches.front(); |
| 2104 | Diffs &firstPatchDiffs = firstPatch.diffs; |
| 2105 | if (firstPatchDiffs.empty() || firstPatchDiffs.front().operation != EQUAL) { |
| 2106 | // Add nullPadding equality. |
| 2107 | firstPatchDiffs.push_front(Diff(EQUAL, nullPadding)); |
| 2108 | firstPatch.start1 -= paddingLength; // Should be 0. |
| 2109 | firstPatch.start2 -= paddingLength; // Should be 0. |
| 2110 | firstPatch.length1 += paddingLength; |
| 2111 | firstPatch.length2 += paddingLength; |
| 2112 | } else if (paddingLength > (ssize_t)firstPatchDiffs.front().text.length()) { |
| 2113 | // Grow first equality. |
| 2114 | Diff &firstDiff = firstPatchDiffs.front(); |
| 2115 | ssize_t extraLength = paddingLength - firstDiff.text.length(); |
| 2116 | firstDiff.text = safeMid(nullPadding, firstDiff.text.length(), |
| 2117 | paddingLength - firstDiff.text.length()) + firstDiff.text; |
| 2118 | firstPatch.start1 -= extraLength; |
| 2119 | firstPatch.start2 -= extraLength; |
| 2120 | firstPatch.length1 += extraLength; |
| 2121 | firstPatch.length2 += extraLength; |
| 2122 | } |
| 2123 | |
| 2124 | // Add some padding on end of last diff. |
| 2125 | Patch &lastPatch = patches.front(); |
| 2126 | Diffs &lastPatchDiffs = lastPatch.diffs; |
| 2127 | if (lastPatchDiffs.empty() || lastPatchDiffs.back().operation != EQUAL) { |
| 2128 | // Add nullPadding equality. |
| 2129 | lastPatchDiffs.push_back(Diff(EQUAL, nullPadding)); |
| 2130 | lastPatch.length1 += paddingLength; |
| 2131 | lastPatch.length2 += paddingLength; |
| 2132 | } else if (paddingLength > (ssize_t)lastPatchDiffs.back().text.length()) { |
| 2133 | // Grow last equality. |
| 2134 | Diff &lastDiff = lastPatchDiffs.back(); |
| 2135 | ssize_t extraLength = paddingLength - lastDiff.text.length(); |
| 2136 | lastDiff.text += nullPadding.substr(0, extraLength); |
| 2137 | lastPatch.length1 += extraLength; |
| 2138 | lastPatch.length2 += extraLength; |
| 2139 | } |
| 2140 | |
| 2141 | return nullPadding; |
| 2142 | } |
| 2143 | |
| 2144 | /** |
| 2145 | * Look through the patches and break up any which are longer than the |