From 4d6343b8fcbf8fb99d5e384fe84119841a48d81c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 20 Aug 2015 14:20:12 +0100 Subject: [PATCH] Add lua bindings for levenshtein distance --- src/lua/lua_util.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c index b17eef9ae..57b93d12f 100644 --- a/src/lua/lua_util.c +++ b/src/lua/lua_util.c @@ -86,6 +86,15 @@ LUA_FUNCTION_DEF (util, tanh); */ LUA_FUNCTION_DEF (util, parse_html); +/*** + * @function util.levenshtein_distance(s1, s2) + * Returns levenstein distance between two strings + * @param {string} s1 the first string + * @param {string} s2 the second string + * @return {number} number of differences in two strings + */ +LUA_FUNCTION_DEF (util, levenshtein_distance); + static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, create_event_base), LUA_INTERFACE_DEF (util, load_rspamd_config), @@ -96,6 +105,7 @@ static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, tokenize_text), LUA_INTERFACE_DEF (util, tanh), LUA_INTERFACE_DEF (util, parse_html), + LUA_INTERFACE_DEF (util, levenshtein_distance), {NULL, NULL} }; @@ -500,6 +510,25 @@ lua_util_parse_html (lua_State *L) return 1; } +static gint +lua_util_levenshtein_distance (lua_State *L) +{ + const gchar *s1, *s2; + gsize s1len, s2len; + gint dist = 0; + + s1 = luaL_checklstring (L, 1, &s1len); + s2 = luaL_checklstring (L, 2, &s2len); + + if (s1 && s2) { + dist = rspamd_strings_levenshtein_distance (s1, s1len, s2, s2len); + } + + lua_pushnumber (L, dist); + + return 1; +} + static gint lua_load_util (lua_State * L) { -- 2.39.5