equal
deleted
inserted
replaced
146 } |
146 } |
147 |
147 |
148 static int longest_match(struct line *a, struct line *b, struct pos *pos, |
148 static int longest_match(struct line *a, struct line *b, struct pos *pos, |
149 int a1, int a2, int b1, int b2, int *omi, int *omj) |
149 int a1, int a2, int b1, int b2, int *omi, int *omj) |
150 { |
150 { |
151 int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k; |
151 int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k, half = (a1 + a2) / 2; |
152 |
152 |
153 for (i = a1; i < a2; i++) { |
153 for (i = a1; i < a2; i++) { |
154 /* skip all lines in b after the current block */ |
154 /* skip all lines in b after the current block */ |
155 for (j = a[i].n; j >= b2; j = b[j].n) |
155 for (j = a[i].n; j >= b2; j = b[j].n) |
156 ; |
156 ; |
163 else |
163 else |
164 k = 1; |
164 k = 1; |
165 pos[j].pos = i; |
165 pos[j].pos = i; |
166 pos[j].len = k; |
166 pos[j].len = k; |
167 |
167 |
168 /* best match so far? */ |
168 /* best match so far? we prefer matches closer |
169 if (k > mk || (k == mk && i <= mi)) { |
169 to the middle to balance recursion */ |
|
170 if (k > mk || (k == mk && (i <= mi || i < half))) { |
170 mi = i; |
171 mi = i; |
171 mj = j; |
172 mj = j; |
172 mk = k; |
173 mk = k; |
173 } |
174 } |
174 } |
175 } |