]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Lua_util: Allow to use text in several rspamd_util methods
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 2 Apr 2021 14:37:52 +0000 (15:37 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 2 Apr 2021 14:37:52 +0000 (15:37 +0100)
src/lua/lua_common.h
src/lua/lua_util.c

index 4c416fa0b5ce683756bcd674ecbd8450b5b4bf74..bf918274cb19663972b2d5f1a54413dc4b9c9595 100644 (file)
@@ -258,6 +258,7 @@ struct rspamd_lua_text *lua_check_text (lua_State *L, gint pos);
 /**
  * Checks for a text or a string. In case of string a pointer to static structure is returned.
  * So it should not be reused or placed to Lua stack anyhow!
+ * However, you can use this function up to 4 times and have distinct static structures
  * @param L
  * @param pos
  * @return
index e879d37af00686f7415dd64b9b5c1900b014c5db..883039508c1b0c3e3b561aeeb4cd7780714c87f9 100644 (file)
@@ -1527,17 +1527,16 @@ static gint
 lua_util_strlen_utf8 (lua_State *L)
 {
        LUA_TRACE_POINT;
-       const gchar *str;
-       gsize len;
+       struct rspamd_lua_text *t;
 
-       str = lua_tolstring (L, 1, &len);
+       t = lua_check_text_or_string (L, 1);
 
-       if (str) {
+       if (t) {
                gint32 i = 0, nchars = 0;
                UChar32 uc;
 
-               while (i < len) {
-                       U8_NEXT ((guint8 *) str, i, len, uc);
+               while (i < t->len) {
+                       U8_NEXT ((guint8 *)t->start, i, t->len, uc);
                        nchars ++;
                }
 
@@ -1554,26 +1553,33 @@ static gint
 lua_util_lower_utf8 (lua_State *L)
 {
        LUA_TRACE_POINT;
-       const gchar *str;
+       struct rspamd_lua_text *t;
+
        gchar *dst;
-       gsize len;
        UChar32 uc;
        UBool err = 0;
        gint32 i = 0, j = 0;
 
-       str = lua_tolstring (L, 1, &len);
+       t = lua_check_text_or_string (L, 1);
 
-       if (str) {
-               dst = g_malloc (len);
+       if (t) {
+               dst = g_malloc (t->len);
 
-               while (i < len && err == 0) {
-                       U8_NEXT ((guint8 *) str, i, len, uc);
+               while (i < t->len && err == 0) {
+                       U8_NEXT ((guint8 *) t->start, i, t->len, uc);
                        uc = u_tolower (uc);
-                       U8_APPEND (dst, j, len, uc, err);
+                       U8_APPEND (dst, j, t->len, uc, err);
                }
 
-               lua_pushlstring (L, dst, j);
-               g_free (dst);
+               if (lua_isstring (L, 1)) {
+                       lua_pushlstring (L, dst, j);
+                       g_free (dst);
+               }
+               else {
+                       t = lua_new_text (L, dst, j, FALSE);
+                       /* We have actually allocated text data before */
+                       t->flags |= RSPAMD_TEXT_FLAG_OWN;
+               }
        }
        else {
                return luaL_error (L, "invalid arguments");
@@ -1586,20 +1592,19 @@ static gint
 lua_util_strcasecmp_ascii (lua_State *L)
 {
        LUA_TRACE_POINT;
-       const gchar *str1, *str2;
-       gsize len1, len2;
+       struct rspamd_lua_text *t1, *t2;
        gint ret = -1;
 
-       str1 = lua_tolstring (L, 1, &len1);
-       str2 = lua_tolstring (L, 2, &len2);
+       t1 = lua_check_text_or_string (L, 1);
+       t2 = lua_check_text_or_string (L, 2);
 
-       if (str1 && str2) {
+       if (t1 && t2) {
 
-               if (len1 == len2) {
-                       ret = g_ascii_strncasecmp (str1, str2, len1);
+               if (t1->len == t2->len) {
+                       ret = rspamd_lc_cmp (t1->start, t2->start, t1->len);
                }
                else {
-                       ret = len1 - len2;
+                       ret = t1->len - t2->len;
                }
        }
        else {
@@ -1614,20 +1619,19 @@ static gint
 lua_util_strequal_caseless (lua_State *L)
 {
        LUA_TRACE_POINT;
-       const gchar *str1, *str2;
-       gsize len1, len2;
+       struct rspamd_lua_text *t1, *t2;
        gint ret = -1;
 
-       str1 = lua_tolstring (L, 1, &len1);
-       str2 = lua_tolstring (L, 2, &len2);
+       t1 = lua_check_text_or_string (L, 1);
+       t2 = lua_check_text_or_string (L, 2);
 
-       if (str1 && str2) {
+       if (t1 && t2) {
 
-               if (len1 == len2) {
-                       ret = rspamd_lc_cmp (str1, str2, len1);
+               if (t1->len == t2->len) {
+                       ret = rspamd_lc_cmp (t1->start, t2->start, t1->len);
                }
                else {
-                       ret = len1 - len2;
+                       ret = t1->len - t2->len;
                }
        }
        else {