bugfix: fixed invalid offset in unified format difference when difference is too large.
This commit is contained in:
		
							
								
								
									
										19
									
								
								dtl/Diff.hpp
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								dtl/Diff.hpp
									
									
									
									
									
								
							| @@ -67,6 +67,8 @@ namespace dtl { | |||||||
|         bool               editDistanceOnly; |         bool               editDistanceOnly; | ||||||
|         uniHunkVec         uniHunks; |         uniHunkVec         uniHunks; | ||||||
|         comparator         cmp; |         comparator         cmp; | ||||||
|  |         long long          ox; | ||||||
|  |         long long          oy; | ||||||
|     public : |     public : | ||||||
|         Diff () {} |         Diff () {} | ||||||
|          |          | ||||||
| @@ -260,7 +262,8 @@ namespace dtl { | |||||||
|             if (isHuge()) { |             if (isHuge()) { | ||||||
|                 pathCordinates.reserve(MAX_CORDINATES_SIZE); |                 pathCordinates.reserve(MAX_CORDINATES_SIZE); | ||||||
|             } |             } | ||||||
|              |             ox = 0; | ||||||
|  |             oy = 0; | ||||||
|             long long p = -1; |             long long p = -1; | ||||||
|             fp = new long long[M + N + 3]; |             fp = new long long[M + N + 3]; | ||||||
|             fill(&fp[0], &fp[M + N + 3], -1); |             fill(&fp[0], &fp[M + N + 3], -1); | ||||||
| @@ -595,18 +598,18 @@ namespace dtl { | |||||||
|                 while(px_idx < v[i].x || py_idx < v[i].y) { |                 while(px_idx < v[i].x || py_idx < v[i].y) { | ||||||
|                     if (v[i].y - v[i].x > py_idx - px_idx) { |                     if (v[i].y - v[i].x > py_idx - px_idx) { | ||||||
|                         if (!wasSwapped()) { |                         if (!wasSwapped()) { | ||||||
|                             ses.addSequence(*y, 0, y_idx, SES_ADD); |                             ses.addSequence(*y, 0, y_idx + oy, SES_ADD); | ||||||
|                         } else { |                         } else { | ||||||
|                             ses.addSequence(*y, y_idx, 0, SES_DELETE); |                             ses.addSequence(*y, y_idx + oy, 0, SES_DELETE); | ||||||
|                         } |                         } | ||||||
|                         ++y; |                         ++y; | ||||||
|                         ++y_idx; |                         ++y_idx; | ||||||
|                         ++py_idx; |                         ++py_idx; | ||||||
|                     } else if (v[i].y - v[i].x < py_idx - px_idx) { |                     } else if (v[i].y - v[i].x < py_idx - px_idx) { | ||||||
|                         if (!wasSwapped()) { |                         if (!wasSwapped()) { | ||||||
|                             ses.addSequence(*x, x_idx, 0, SES_DELETE); |                             ses.addSequence(*x, x_idx + ox, 0, SES_DELETE); | ||||||
|                         } else { |                         } else { | ||||||
|                             ses.addSequence(*x, 0, x_idx, SES_ADD); |                             ses.addSequence(*x, 0, x_idx + ox, SES_ADD); | ||||||
|                         } |                         } | ||||||
|                         ++x; |                         ++x; | ||||||
|                         ++x_idx; |                         ++x_idx; | ||||||
| @@ -614,10 +617,10 @@ namespace dtl { | |||||||
|                     } else { |                     } else { | ||||||
|                         if (!wasSwapped()) { |                         if (!wasSwapped()) { | ||||||
|                             lcs.addSequence(*x); |                             lcs.addSequence(*x); | ||||||
|                             ses.addSequence(*x, x_idx, y_idx, SES_COMMON); |                             ses.addSequence(*x, x_idx + ox, y_idx + oy, SES_COMMON); | ||||||
|                         } else { |                         } else { | ||||||
|                             lcs.addSequence(*y); |                             lcs.addSequence(*y); | ||||||
|                             ses.addSequence(*y, y_idx, x_idx, SES_COMMON); |                             ses.addSequence(*y, y_idx + oy, x_idx + ox, SES_COMMON); | ||||||
|                         } |                         } | ||||||
|                         ++x; |                         ++x; | ||||||
|                         ++y; |                         ++y; | ||||||
| @@ -658,6 +661,8 @@ namespace dtl { | |||||||
|                 fp = new long long[M + N + 3]; |                 fp = new long long[M + N + 3]; | ||||||
|                 fill(&fp[0], &fp[M + N + 3], -1); |                 fill(&fp[0], &fp[M + N + 3], -1); | ||||||
|                 fill(path.begin(), path.end(), -1); |                 fill(path.begin(), path.end(), -1); | ||||||
|  |                 ox = x_idx - 1; | ||||||
|  |                 oy = y_idx - 1; | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|             return true; |             return true; | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ protected : | |||||||
|         cases.push_back(createCase("abcdefq3wefarhgorequgho4euhfteowauhfwehogfewrquhoi23hroewhoahfotrhguoiewahrgqqabcdef", |         cases.push_back(createCase("abcdefq3wefarhgorequgho4euhfteowauhfwehogfewrquhoi23hroewhoahfotrhguoiewahrgqqabcdef", | ||||||
|                                    "3abcdef4976fd86ouofita67t85r876e5e746578tgliuhopoqqabcdef")); // 8 |                                    "3abcdef4976fd86ouofita67t85r876e5e746578tgliuhopoqqabcdef")); // 8 | ||||||
|         cases.push_back(createCase("abcqqqeqqqccc", "abdqqqeqqqddd")); // 9 |         cases.push_back(createCase("abcqqqeqqqccc", "abdqqqeqqqddd")); // 9 | ||||||
|  |         cases.push_back(createCase("aaaaaaaaaaaaa>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>aaaadsafabcaaaaaaaaaaaaaaaaaaewaaabdaaaaaabbb", "aaaaaaaaaaaaaaadasfdsafsadasdafbaaaaaaaaaaaaaaaaaeaaaaaaaaaae&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&saaabcaaaaaaccc")); // 10 | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     void TearDown () {} |     void TearDown () {} | ||||||
| @@ -96,3 +97,8 @@ TEST_F (Patchtest, patch_test9) { | |||||||
|     ASSERT_EQ(cases[9].B, cases[9].diff.patch(cases[9].A)); |     ASSERT_EQ(cases[9].B, cases[9].diff.patch(cases[9].A)); | ||||||
|     ASSERT_EQ(cases[9].B, cases[9].diff.uniPatch(cases[9].A)); |     ASSERT_EQ(cases[9].B, cases[9].diff.uniPatch(cases[9].A)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_F (Patchtest, patch_test10) { | ||||||
|  |     ASSERT_EQ(cases[10].B, cases[10].diff.patch(cases[10].A)); | ||||||
|  |     ASSERT_EQ(cases[10].B, cases[10].diff.uniPatch(cases[10].A)); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ def path_chomp(path): | |||||||
| env  = Environment( | env  = Environment( | ||||||
|     CPPFLAGS=['-Wall', '-O2'], |     CPPFLAGS=['-Wall', '-O2'], | ||||||
|     CPPPATH=['..'], |     CPPPATH=['..'], | ||||||
|  | 	CXXFLAGS="-std=c++11", | ||||||
| ) | ) | ||||||
|  |  | ||||||
| conf = Configure(env); | conf = Configure(env); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user