equal
deleted
inserted
replaced
77 return i - 1; |
77 return i - 1; |
78 } |
78 } |
79 |
79 |
80 static inline int cmp(struct bdiff_line *a, struct bdiff_line *b) |
80 static inline int cmp(struct bdiff_line *a, struct bdiff_line *b) |
81 { |
81 { |
82 return a->hash != b->hash || a->len != b->len || memcmp(a->l, b->l, a->len); |
82 return a->hash != b->hash || a->len != b->len || |
|
83 memcmp(a->l, b->l, a->len); |
83 } |
84 } |
84 |
85 |
85 static int equatelines(struct bdiff_line *a, int an, struct bdiff_line *b, |
86 static int equatelines(struct bdiff_line *a, int an, struct bdiff_line *b, |
86 int bn) |
87 int bn) |
87 { |
88 { |
209 mi = mi - mk + 1; |
210 mi = mi - mk + 1; |
210 mj = mj - mk + 1; |
211 mj = mj - mk + 1; |
211 } |
212 } |
212 |
213 |
213 /* expand match to include subsequent popular lines */ |
214 /* expand match to include subsequent popular lines */ |
214 while (mi + mk < a2 && mj + mk < b2 && |
215 while (mi + mk < a2 && mj + mk < b2 && a[mi + mk].e == b[mj + mk].e) |
215 a[mi + mk].e == b[mj + mk].e) |
|
216 mk++; |
216 mk++; |
217 |
217 |
218 *omi = mi; |
218 *omi = mi; |
219 *omj = mj; |
219 *omj = mj; |
220 |
220 |
236 /* and recurse on the remaining chunks on either side */ |
236 /* and recurse on the remaining chunks on either side */ |
237 l = recurse(a, b, pos, a1, i, b1, j, l); |
237 l = recurse(a, b, pos, a1, i, b1, j, l); |
238 if (!l) |
238 if (!l) |
239 return NULL; |
239 return NULL; |
240 |
240 |
241 l->next = (struct bdiff_hunk *)malloc(sizeof(struct bdiff_hunk)); |
241 l->next = |
|
242 (struct bdiff_hunk *)malloc(sizeof(struct bdiff_hunk)); |
242 if (!l->next) |
243 if (!l->next) |
243 return NULL; |
244 return NULL; |
244 |
245 |
245 l = l->next; |
246 l = l->next; |
246 l->a1 = i; |
247 l->a1 = i; |
272 curr = recurse(a, b, pos, 0, an, 0, bn, base); |
273 curr = recurse(a, b, pos, 0, an, 0, bn, base); |
273 if (!curr) |
274 if (!curr) |
274 return -1; |
275 return -1; |
275 |
276 |
276 /* sentinel end hunk */ |
277 /* sentinel end hunk */ |
277 curr->next = (struct bdiff_hunk *)malloc(sizeof(struct bdiff_hunk)); |
278 curr->next = |
|
279 (struct bdiff_hunk *)malloc(sizeof(struct bdiff_hunk)); |
278 if (!curr->next) |
280 if (!curr->next) |
279 return -1; |
281 return -1; |
280 curr = curr->next; |
282 curr = curr->next; |
281 curr->a1 = curr->a2 = an; |
283 curr->a1 = curr->a2 = an; |
282 curr->b1 = curr->b2 = bn; |
284 curr->b1 = curr->b2 = bn; |
291 |
293 |
292 if (!next) |
294 if (!next) |
293 break; |
295 break; |
294 |
296 |
295 if (curr->a2 == next->a1 || curr->b2 == next->b1) |
297 if (curr->a2 == next->a1 || curr->b2 == next->b1) |
296 while (curr->a2 < an && curr->b2 < bn |
298 while (curr->a2 < an && curr->b2 < bn && |
297 && next->a1 < next->a2 |
299 next->a1 < next->a2 && next->b1 < next->b2 && |
298 && next->b1 < next->b2 |
300 !cmp(a + curr->a2, b + curr->b2)) { |
299 && !cmp(a + curr->a2, b + curr->b2)) { |
|
300 curr->a2++; |
301 curr->a2++; |
301 next->a1++; |
302 next->a1++; |
302 curr->b2++; |
303 curr->b2++; |
303 next->b1++; |
304 next->b1++; |
304 } |
305 } |