]> source.dussan.org Git - rspamd.git/commitdiff
Add tokens comparision routines.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 11:24:07 +0000 (12:24 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 11:24:07 +0000 (12:24 +0100)
src/libutil/fstring.c
src/libutil/fstring.h

index 6566f5af92cbe8a46644eda0020587a297627ff4..d59ccaa4d646696f80363953100c0aa82db40a20 100644 (file)
@@ -259,58 +259,64 @@ rspamd_fstring_equal (const rspamd_fstring_t *s1,
 
 extern const guchar lc_map[256];
 
-gint
-rspamd_fstring_casecmp (const rspamd_fstring_t *s1,
-               const rspamd_fstring_t *s2)
+static gint
+rspamd_fstring_lc_cmp (const gchar *s, const gchar *d, gsize l)
 {
-       gint ret = 0;
-       gsize leftover = s1->len % 4;
        guint fp, i;
-       const uint8_t *s, *d;
        guchar c1, c2, c3, c4;
        union {
                guchar c[4];
                guint32 n;
        } cmp1, cmp2;
+       gsize leftover = l % 4;
+       gint ret = 0;
 
-       g_assert (s1 != NULL && s2 != NULL);
+       fp = l - leftover;
 
-       if (s1->len == s2->len) {
-               leftover = s1->len % 4;
-               s = (const uint8_t *) s1->str;
-               d = (const uint8_t *) s2->str;
-               fp = s1->len - leftover;
-
-               for (i = 0; i != fp; i += 4) {
-                       c1 = s[i], c2 = s[i + 1], c3 = s[i + 2], c4 = s[i + 3];
-                       cmp1.c[0] = lc_map[c1];
-                       cmp1.c[1] = lc_map[c2];
-                       cmp1.c[2] = lc_map[c3];
-                       cmp1.c[3] = lc_map[c4];
-
-                       c1 = d[i], c2 = d[i + 1], c3 = d[i + 2], c4 = d[i + 3];
-                       cmp2.c[0] = lc_map[c1];
-                       cmp2.c[1] = lc_map[c2];
-                       cmp2.c[2] = lc_map[c3];
-                       cmp2.c[3] = lc_map[c4];
-
-                       if (cmp1.n != cmp2.n) {
-                               return cmp1.n - cmp2.n;
-                       }
+       for (i = 0; i != fp; i += 4) {
+               c1 = s[i], c2 = s[i + 1], c3 = s[i + 2], c4 = s[i + 3];
+               cmp1.c[0] = lc_map[c1];
+               cmp1.c[1] = lc_map[c2];
+               cmp1.c[2] = lc_map[c3];
+               cmp1.c[3] = lc_map[c4];
+
+               c1 = d[i], c2 = d[i + 1], c3 = d[i + 2], c4 = d[i + 3];
+               cmp2.c[0] = lc_map[c1];
+               cmp2.c[1] = lc_map[c2];
+               cmp2.c[2] = lc_map[c3];
+               cmp2.c[3] = lc_map[c4];
 
-                       s += 4;
-                       d += 4;
+               if (cmp1.n != cmp2.n) {
+                       return cmp1.n - cmp2.n;
                }
 
-               while (leftover > 0) {
-                       if (g_ascii_tolower (*s) != g_ascii_tolower (*d)) {
-                               return (*s) - (*d);
-                       }
+               s += 4;
+               d += 4;
+       }
 
-                       leftover --;
-                       s ++;
-                       d ++;
+       while (leftover > 0) {
+               if (g_ascii_tolower (*s) != g_ascii_tolower (*d)) {
+                       return (*s) - (*d);
                }
+
+               leftover--;
+               s++;
+               d++;
+       }
+
+       return ret;
+}
+
+gint
+rspamd_fstring_casecmp (const rspamd_fstring_t *s1,
+               const rspamd_fstring_t *s2)
+{
+       gint ret = 0;
+
+       g_assert (s1 != NULL && s2 != NULL);
+
+       if (s1->len == s2->len) {
+               ret = rspamd_fstring_lc_cmp (s1->str, s2->str, s1->len);
        }
        else {
                ret = s1->len - s2->len;
@@ -331,3 +337,34 @@ rspamd_fstring_cmp (const rspamd_fstring_t *s1,
 
        return s1->len - s2->len;
 }
+
+gint
+rspamd_ftok_casecmp (const rspamd_ftok_t *s1,
+               const rspamd_ftok_t *s2)
+{
+       gint ret = 0;
+
+       g_assert (s1 != NULL && s2 != NULL);
+
+       if (s1->len == s2->len) {
+               ret = rspamd_fstring_lc_cmp (s1->begin, s2->begin, s1->len);
+       }
+       else {
+               ret = s1->len - s2->len;
+       }
+
+       return ret;
+}
+
+gint
+rspamd_ftok_cmp (const rspamd_ftok_t *s1,
+               const rspamd_ftok_t *s2)
+{
+       g_assert (s1 != NULL && s2 != NULL);
+
+       if (s1->len == s2->len) {
+               return memcmp (s1->begin, s2->begin, s1->len);
+       }
+
+       return s1->len - s2->len;
+}
index 4d9c3678dae92f30a0c53935e49180945946bc2c..abb69dcbcab606056730fd07327ebcac4fec0050 100644 (file)
@@ -116,4 +116,16 @@ gint rspamd_fstring_casecmp (const rspamd_fstring_t *s1,
 gint rspamd_fstring_cmp (const rspamd_fstring_t *s1,
                const rspamd_fstring_t *s2);
 
+/**
+ * Compare two fixed tokens ignoring case
+ */
+gint rspamd_ftok_casecmp (const rspamd_ftok_t *s1,
+               const rspamd_ftok_t *s2);
+
+/**
+ * Compare two fixed tokens
+ */
+gint rspamd_ftok_cmp (const rspamd_ftok_t *s1,
+               const rspamd_ftok_t *s2);
+
 #endif