LCS: other fixes to range emission.

This commit is contained in:
antirez 2020-04-01 17:36:32 +02:00
parent c9c03c3ee6
commit 4cbf3f5ddd

View File

@ -584,12 +584,13 @@ void lcsCommand(client *c) {
i = alen, j = blen; i = alen, j = blen;
while (computelcs && i > 0 && j > 0) { while (computelcs && i > 0 && j > 0) {
int emit_range = 0;
if (a[i-1] == b[j-1]) { if (a[i-1] == b[j-1]) {
/* If there is a match, store the character and reduce /* If there is a match, store the character and reduce
* the indexes to look for a new match. */ * the indexes to look for a new match. */
result[idx-1] = a[i-1]; result[idx-1] = a[i-1];
/* Track the current range. */ /* Track the current range. */
int emit_range = 0;
if (arange_start == alen) { if (arange_start == alen) {
arange_start = i-1; arange_start = i-1;
arange_end = i-1; arange_end = i-1;
@ -605,7 +606,21 @@ void lcsCommand(client *c) {
emit_range = 1; emit_range = 1;
} }
} }
/* Emit the range if we matched with the first byte of
* one of the two strings. We'll exit the loop ASAP. */
if (arange_start == 0 || brange_start == 0) emit_range = 1; if (arange_start == 0 || brange_start == 0) emit_range = 1;
idx--; i--; j--;
} else {
/* Otherwise reduce i and j depending on the largest
* LCS between, to understand what direction we need to go. */
uint32_t lcs1 = LCS(i-1,j);
uint32_t lcs2 = LCS(i,j-1);
if (lcs1 > lcs2)
i--;
else
j--;
if (arange_start != alen) emit_range = 1;
}
/* Emit the current range if needed. */ /* Emit the current range if needed. */
if (emit_range) { if (emit_range) {
@ -621,17 +636,6 @@ void lcsCommand(client *c) {
arange_start = alen; /* Restart at the next match. */ arange_start = alen; /* Restart at the next match. */
arraylen++; arraylen++;
} }
idx--; i--; j--;
} else {
/* Otherwise reduce i and j depending on the largest
* LCS between, to understand what direction we need to go. */
uint32_t lcs1 = LCS(i-1,j);
uint32_t lcs2 = LCS(i,j-1);
if (lcs1 > lcs2)
i--;
else
j--;
}
} }
/* Signal modified key, increment dirty, ... */ /* Signal modified key, increment dirty, ... */