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

if state > #param then if state > #param then
return nil return nil
end end
local r = string.char(param:at(state))
local r = string.char(param:byte(state))
return state, r return state, r
end end



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

end end
-- Strip the first \n -- Strip the first \n
while first < last do while first < last do
local chr = input:at(first)
local chr = input:byte(first)
if chr ~= 13 and chr ~= 10 then break end if chr ~= 13 and chr ~= 10 then break end
first = first + 1 first = first + 1
end end

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

end end


local function process_dir_entry(offset) 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) lua_util.debugm(N, log_obj, "dtype: %s, offset: %s", dtype, offset)


if dtype then if dtype then

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

* @return {rspamd_text} resulting text * @return {rspamd_text} resulting text
*/ */
LUA_FUNCTION_DEF (text, fromtable); 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() * @method rspamd_text:len()
* Returns length of a string * Returns length of a string
LUA_INTERFACE_DEF (text, split), LUA_INTERFACE_DEF (text, split),
LUA_INTERFACE_DEF (text, at), LUA_INTERFACE_DEF (text, at),
LUA_INTERFACE_DEF (text, memchr), LUA_INTERFACE_DEF (text, memchr),
LUA_INTERFACE_DEF (text, byte),
LUA_INTERFACE_DEF (text, bytes), LUA_INTERFACE_DEF (text, bytes),
LUA_INTERFACE_DEF (text, lower), LUA_INTERFACE_DEF (text, lower),
LUA_INTERFACE_DEF (text, exclude_chars), LUA_INTERFACE_DEF (text, exclude_chars),


static gint static gint
lua_text_at (lua_State *L) lua_text_at (lua_State *L)
{
return lua_text_byte(L);
}

static gint
lua_text_byte (lua_State *L)
{ {
LUA_TRACE_POINT; LUA_TRACE_POINT;
struct rspamd_lua_text *t = lua_check_text (L, 1); 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 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 static gint

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

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