Browse Source

[Fix] Fix order of arguments in 2-ways search

tags/1.2.4
Vsevolod Stakhov 8 years ago
parent
commit
04f6578bec
1 changed files with 29 additions and 26 deletions
  1. 29
    26
      src/libutil/str_util.c

+ 29
- 26
src/libutil/str_util.c View File

@@ -1261,7 +1261,7 @@ rspamd_substring_search_caseless (const gchar *in, gsize inlen,

/* Computing of the maximal suffix for <= */
static inline gint
rspamd_two_way_max_suffix (const gchar *x, gint m, gint *p)
rspamd_two_way_max_suffix (const gchar *srch, gint srchlen, gint *p)
{
gint ms, j, k;
gchar a, b;
@@ -1270,9 +1270,9 @@ rspamd_two_way_max_suffix (const gchar *x, gint m, gint *p)
j = 0;
k = *p = 1;

while (j + k < m) {
a = x[j + k];
b = x[ms + k];
while (j + k < srchlen) {
a = srch[j + k];
b = srch[ms + k];

if (a < b) {
j += k;
@@ -1280,8 +1280,9 @@ rspamd_two_way_max_suffix (const gchar *x, gint m, gint *p)
*p = j - ms;
}
else if (a == b)
if (k != *p)
++k;
if (k != *p) {
k++;
}
else {
j += *p;
k = 1;
@@ -1298,7 +1299,7 @@ rspamd_two_way_max_suffix (const gchar *x, gint m, gint *p)

/* Computing of the maximal suffix for >= */
static inline gint
rspamd_two_way_max_suffix_tilde (const gchar *x, gint m, gint *p)
rspamd_two_way_max_suffix_tilde (const gchar *srch, gint srchlen, gint *p)
{
gint ms, j, k;
gchar a, b;
@@ -1307,9 +1308,9 @@ rspamd_two_way_max_suffix_tilde (const gchar *x, gint m, gint *p)
j = 0;
k = *p = 1;

while (j + k < m) {
a = x[j + k];
b = x[ms + k];
while (j + k < srchlen) {
a = srch[j + k];
b = srch[ms + k];

if (a > b) {
j += k;
@@ -1317,8 +1318,9 @@ rspamd_two_way_max_suffix_tilde (const gchar *x, gint m, gint *p)
*p = j - ms;
}
else if (a == b)
if (k != *p)
++k;
if (k != *p) {
k ++;
}
else {
j += *p;
k = 1;
@@ -1340,8 +1342,8 @@ rspamd_substring_search_twoway (const gchar *in, gint inlen,
int i, j, ell, memory, p, per, q;

/* Preprocessing */
i = rspamd_two_way_max_suffix (in, inlen, &p);
j = rspamd_two_way_max_suffix_tilde (in, inlen, &q);
i = rspamd_two_way_max_suffix (srch, srchlen, &p);
j = rspamd_two_way_max_suffix_tilde (srch, srchlen, &q);

if (i > j) {
ell = i;
@@ -1353,21 +1355,21 @@ rspamd_substring_search_twoway (const gchar *in, gint inlen,
}

/* Searching */
if (memcmp (in, in + per, ell + 1) == 0) {
if (memcmp (srch, srch + per, ell + 1) == 0) {
j = 0;
memory = -1;

while (j <= srchlen - inlen) {
while (j <= inlen - srchlen) {
i = MAX (ell, memory) + 1;

while (i < inlen && in[i] == srch[i + j]) {
while (i < srchlen && srch[i] == in[i + j]) {
i ++;
}

if (i >= inlen) {
if (i >= srchlen) {
i = ell;

while (i > memory && in[i] == srch[i + j]) {
while (i > memory && srch[i] == in[i + j]) {
i --;
}

@@ -1376,7 +1378,7 @@ rspamd_substring_search_twoway (const gchar *in, gint inlen,
}

j += per;
memory = inlen - per - 1;
memory = srchlen - per - 1;
}
else {
j += (i - ell);
@@ -1385,20 +1387,20 @@ rspamd_substring_search_twoway (const gchar *in, gint inlen,
}
}
else {
per = MAX (ell + 1, inlen - ell - 1) + 1;
per = MAX (ell + 1, srchlen - ell - 1) + 1;
j = 0;

while (j <= srchlen - inlen) {
while (j <= inlen - srchlen) {
i = ell + 1;

while (i < inlen && in[i] == srch[i + j]) {
while (i < srchlen && srch[i] == in[i + j]) {
i ++;
}

if (i >= inlen) {
if (i >= srchlen) {
i = ell;

while (i >= 0 && in[i] == srch[i + j]) {
while (i >= 0 && srch[i] == in[i + j]) {
i --;
}

@@ -1408,8 +1410,9 @@ rspamd_substring_search_twoway (const gchar *in, gint inlen,

j += per;
}
else
else {
j += (i - ell);
}
}
}


Loading…
Cancel
Save