mercurial/bdiff.c
branchstable
changeset 29014 f1ca249696ed
parent 29013 9a8363d23419
child 29015 87d4a6c5567e
equal deleted inserted replaced
29013:9a8363d23419 29014:f1ca249696ed
   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 		}