Browse Source

[Minor] rspamd_text:byte() metamethod

tags/2.7
Andrew Lewis 3 years ago
parent
commit
68badebdac

+ 1
- 1
contrib/lua-fun/fun.lua View File

@@ -96,7 +96,7 @@ local text_gen = function(param, state)
if state > #param then
return nil
end
local r = string.char(param:at(state))
local r = string.char(param:byte(state))
return state, r
end


+ 1
- 1
lualib/lua_content/pdf.lua View File

@@ -954,7 +954,7 @@ local function attach_pdf_streams(task, input, pdf)
end
-- Strip the first \n
while first < last do
local chr = input:at(first)
local chr = input:byte(first)
if chr ~= 13 and chr ~= 10 then break end
first = first + 1
end

+ 1
- 1
lualib/lua_magic/heuristics.lua View File

@@ -181,7 +181,7 @@ local function detect_ole_format(input, log_obj, _, part)
end

local function process_dir_entry(offset)
local dtype = input:at(offset + 66)
local dtype = input:byte(offset + 66)
lua_util.debugm(N, log_obj, "dtype: %s, offset: %s", dtype, offset)

if dtype then

+ 28
- 12
src/lua/lua_text.c View File

@@ -58,6 +58,14 @@ LUA_FUNCTION_DEF (text, randombytes);
* @return {rspamd_text} resulting text
*/
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
@@ -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),
@@ -946,24 +955,31 @@ 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

+ 30
- 0
test/lua/unit/rspamd_text.lua View File

@@ -0,0 +1,30 @@
context("Rspamd_text:byte() test", function()
local lua_util = require "lua_util"
local rspamd_text = require "rspamd_text"

local str = 'OMG'
local txt = rspamd_text.fromstring(str)
local fmt = 'case rspamd_text:byte(%s,%s)'
local cases = {
{'1', 'nil'},
{'nil', '1'},
}

for start = -4, 4 do
for stop = -4, 4 do
table.insert(cases, {tostring(start), tostring(stop)})
end
end

for _, case in ipairs(cases) do
local name = string.format(fmt, case[1], case[2])
test(name, function()
local txt_bytes = {txt:byte(tonumber(case[1]), tonumber(case[2]))}
local str_bytes = {str:byte(tonumber(case[1]), tonumber(case[2]))}
assert_rspamd_table_eq({
expect = str_bytes,
actual = txt_bytes
})
end)
end
end)

Loading…
Cancel
Save