#include "rspamd.h"
#include "message.h"
#include "lua/lua_common.h"
+#include "xxhash.h"
#include <math.h>
gint
rspamd_strings_levenshtein_distance (const gchar *s1, gsize s1len,
- const gchar *s2, gsize s2len)
+ const gchar *s2, gsize s2len,
+ guint replace_cost)
{
guint x, y, lastdiag, olddiag;
gchar c1, c2;
guint *column;
gint eq;
static const guint max_cmp = 8192;
+ gint ret;
g_assert (s1 != NULL);
g_assert (s2 != NULL);
return 0;
}
- column = g_alloca ((s1len + 1) * sizeof (guint));
+ column = g_malloc0 ((s1len + 1) * sizeof (guint));
for (y = 1; y <= s1len; y++) {
column[y] = y;
olddiag = column[y];
c1 = s1[y - 1];
c2 = s2[x - 1];
- eq = (c1 == c2) ? 0 : 1;
+ eq = (c1 == c2) ? 0 : replace_cost;
column[y] = MIN3 (column[y] + 1, column[y - 1] + 1,
lastdiag + (eq));
lastdiag = olddiag;
}
}
- return column[s1len];
+ ret = column[s1len];
+ g_free (column);
+
+ return ret;
}
GString *
* @return
*/
gint rspamd_strings_levenshtein_distance (const gchar *s1, gsize s1len,
- const gchar *s2, gsize s2len);
+ const gchar *s2, gsize s2len, guint replace_cost);
/**
* Fold header using rfc822 rules, return new GString from the previous one
const gchar *s1, *s2;
gsize s1len, s2len;
gint dist = 0;
+ guint replace_cost = 1;
s1 = luaL_checklstring (L, 1, &s1len);
s2 = luaL_checklstring (L, 2, &s2len);
+ if (lua_isnumber (L, 3)) {
+ replace_cost = lua_tonumber (L, 3);
+ }
+
if (s1 && s2) {
- dist = rspamd_strings_levenshtein_distance (s1, s1len, s2, s2len);
+ dist = rspamd_strings_levenshtein_distance (s1, s1len, s2, s2len,
+ replace_cost);
}
lua_pushnumber (L, dist);