]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] rspamd_text:byte() metamethod 3553/head
authorAndrew Lewis <nerf@judo.za.org>
Mon, 16 Nov 2020 18:13:03 +0000 (20:13 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Mon, 16 Nov 2020 18:13:03 +0000 (20:13 +0200)
contrib/lua-fun/fun.lua
lualib/lua_content/pdf.lua
lualib/lua_magic/heuristics.lua
src/lua/lua_text.c
test/lua/unit/rspamd_text.lua [new file with mode: 0644]

index e16fe07ae34c7092ce55edbdad621fcf59076298..2c712d306930b3823527c0c6c31089f9b68626eb 100644 (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
 
index 141a07a5f06fd0e6f9b4a0ed73abaffd39bbc290..11d5cab46ee448e0074bc08b8908dd7e06bc3fe8 100644 (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
index 6822abe1e389aed5bc2116e2477347def4cc05b5..02bc2b4a28131f648b44ea0785912dff98db5d30 100644 (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
index 5bbcfb96e620568450960bd0d89e01ef33667a1f..37e1752c1dee480b4a225ed04f2847eb181366bb 100644 (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
diff --git a/test/lua/unit/rspamd_text.lua b/test/lua/unit/rspamd_text.lua
new file mode 100644 (file)
index 0000000..269b491
--- /dev/null
@@ -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)