]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Add rspamd_memspn function
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 21 Jun 2018 13:20:13 +0000 (14:20 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 21 Jun 2018 13:20:13 +0000 (14:20 +0100)
src/libutil/str_util.c
src/libutil/str_util.h

index 026e331feae5b15fbc0f1a8f29b60576031f8d2a..cfacf514f4d327f1f8ebfd3577fe9b8009a8b0d1 100644 (file)
@@ -1738,12 +1738,19 @@ decode:
 
 #define BITOP(a,b,op) \
                ((a)[(gsize)(b)/(8*sizeof *(a))] op (gsize)1<<((gsize)(b)%(8*sizeof *(a))))
+
+
 gsize
 rspamd_memcspn (const gchar *s, const gchar *e, gsize len)
 {
        gsize byteset[32 / sizeof(gsize)];
        const gchar *p = s, *end = s + len;
 
+       if (!e[1]) {
+               for (; *p != *e; p++);
+               return p - s;
+       }
+
        memset (byteset, 0, sizeof byteset);
 
        for (; *e && BITOP (byteset, *(guchar *)e, |=); e++);
@@ -1752,6 +1759,25 @@ rspamd_memcspn (const gchar *s, const gchar *e, gsize len)
        return p - s;
 }
 
+gsize
+rspamd_memspn (const gchar *s, const gchar *e, gsize len)
+{
+       gsize byteset[32 / sizeof(gsize)];
+       const gchar *p = s, *end = s + len;
+
+       if (!e[1]) {
+               for (; *p == *e; p++);
+               return p - s;
+       }
+
+       memset (byteset, 0, sizeof byteset);
+
+       for (; *e && BITOP (byteset, *(guchar *)e, |=); e++);
+       for (; p < end && BITOP (byteset, *(guchar *)p, &); p++);
+
+       return p - s;
+}
+
 gssize
 rspamd_decode_qp2047_buf (const gchar *in, gsize inlen,
                gchar *out, gsize outlen)
index 45507e2be6e46d4c25bb92f1a4f224685baab2b0..9fa91429260aaafbbba025d0df24c050184c6ab8 100644 (file)
@@ -334,6 +334,14 @@ const void *rspamd_memrchr (const void *m, gint c, gsize len);
  */
 gsize rspamd_memcspn (const gchar *s, const gchar *e, gsize len);
 
+/**
+ * Return length of memory segment starting in `s` that contains only chars from `e`
+ * @param s any input
+ * @param e zero terminated string of inclusions
+ * @param len length of `s`
+ * @return segment size
+ */
+gsize rspamd_memspn (const gchar *s, const gchar *e, gsize len);
 
 /* https://graphics.stanford.edu/~seander/bithacks.html#HasMoreInWord */
 #define rspamd_str_hasmore(x,n) ((((x)+~0UL/255*(127-(n)))|(x))&~0UL/255*128)