intfuzzy_compare(constchar*str1,constchar*str2){unsignedintblock_size1,block_size2;uint32_tscore=0;char*s1,*s2;char*s1_1,*s1_2,*s1_3;char*s2_1,*s2_2,*s2_3;if(NULL==str1||...
int fuzzy_compare(const char *str1, const char *str2)
{
unsigned int block_size1, block_size2;
uint32_t score = 0;
char *s1, *s2;
char *s1_1, *s1_2, *s1_3;
char *s2_1, *s2_2, *s2_3;
if (NULL == str1 || NULL == str2)
return -1;
if (sscanf(str1, "%u:", &block_size1) != 1 ||
sscanf(str2, "%u:", &block_size2) != 1) {
return -1;
}
if (block_size1 != block_size2 &&
block_size1 != block_size2*2 &&
block_size2 != block_size1*2) {
return 0;
}
str1 = strchr(str1, ':');
str2 = strchr(str2, ':');
if (!str1 || !str2) {
return -1;
}
s1 = eliminate_sequences(str1+1);
if (!s1)
return 0;
s2 = eliminate_sequences(str2+1);
if (!s2)
{
free(s1);
return 0;
}
s1_1 = s1;
s2_1 = s2;
s1_2 = strchr(s1, ':');
s2_2 = strchr(s2, ':');
if (!s1_2 || !s2_2) {
free(s1); free(s2);
return -1;
}
*s1_2 = 0;
s1_2++;
*s2_2 = 0;
s2_2++;
s1_3 = strchr(s1_2, ',');
s2_3 = strchr(s2_2, ',');
if (s1_3 != NULL)
*s1_3 = 0;
if (s2_3 != NULL)
*s2_3 = 0;
if (block_size1 == block_size2 && strlen(s1) == strlen(s2)) {
if (!strncmp(s1, s2, strlen(s1))) {
free (s1);
free (s2);
return 100;
}
}
if (block_size1 == block_size2) {
uint32_t score1, score2;
score1 = score_strings(s1_1, s2_1, block_size1);
score2 = score_strings(s1_2, s2_2, block_size1*2);
score = MAX(score1, score2);
}
else if (block_size1 == block_size2*2) {
score = score_strings(s1_1, s2_2, block_size1);
}
else {
score = score_strings(s1_2, s2_1, block_size2);
}
free(s1);
free(s2);
return (int)score;
}
展开