diff options
author | Andrew Lewis <nerf@judo.za.org> | 2020-11-16 20:13:03 +0200 |
---|---|---|
committer | Andrew Lewis <nerf@judo.za.org> | 2020-11-16 20:13:03 +0200 |
commit | 68badebdac453aef0f8bc5af96e9a289aefc02e5 (patch) | |
tree | b746ea582bd0e32c8a85af93c264ad2d8158045b /src/lua/lua_text.c | |
parent | 36963c3fa3b053812dbb9abea386b27a78a5d062 (diff) | |
download | rspamd-68badebdac453aef0f8bc5af96e9a289aefc02e5.tar.gz rspamd-68badebdac453aef0f8bc5af96e9a289aefc02e5.zip |
[Minor] rspamd_text:byte() metamethod
Diffstat (limited to 'src/lua/lua_text.c')
-rw-r--r-- | src/lua/lua_text.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/src/lua/lua_text.c b/src/lua/lua_text.c index 5bbcfb96e..37e1752c1 100644 --- a/src/lua/lua_text.c +++ b/src/lua/lua_text.c @@ -59,6 +59,14 @@ LUA_FUNCTION_DEF (text, randombytes); */ LUA_FUNCTION_DEF (text, fromtable); /*** + * @method rspamd_text:byte(pos[, pos2]) + * Returns a byte at the position `pos` or bytes from `pos` to `pos2` if specified + * @param {integer} pos index + * @param {integer} pos2 index + * @return {integer} byte at the position `pos` or varargs of bytes + */ +LUA_FUNCTION_DEF (text, byte); +/*** * @method rspamd_text:len() * Returns length of a string * @return {number} length of string in **bytes** @@ -226,6 +234,7 @@ static const struct luaL_reg textlib_m[] = { LUA_INTERFACE_DEF (text, split), LUA_INTERFACE_DEF (text, at), LUA_INTERFACE_DEF (text, memchr), + LUA_INTERFACE_DEF (text, byte), LUA_INTERFACE_DEF (text, bytes), LUA_INTERFACE_DEF (text, lower), LUA_INTERFACE_DEF (text, exclude_chars), @@ -947,23 +956,30 @@ lua_text_split (lua_State *L) static gint lua_text_at (lua_State *L) { + return lua_text_byte(L); +} + +static gint +lua_text_byte (lua_State *L) +{ LUA_TRACE_POINT; struct rspamd_lua_text *t = lua_check_text (L, 1); - gint pos = lua_tointeger (L, 2); - - if (t) { - if (pos > 0 && pos <= t->len) { - lua_pushinteger (L, t->start[pos - 1]); - } - else { - lua_pushnil (L); - } - } - else { + if (!t) { return luaL_error (L, "invalid arguments"); } - return 1; + gsize start = relative_pos_start (luaL_optinteger (L, 2, 1), t->len); + gsize end = relative_pos_end (luaL_optinteger (L, 3, start), t->len); + start--; + + if (start >= end) { + return 0; + } + + for (gsize i = start; i < end; i++) { + lua_pushinteger (L, t->start[i]); + } + return end - start; } static gint |