summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/mcht-contains.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/mcht-contains.c')
-rw-r--r--pigeonhole/src/lib-sieve/mcht-contains.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/mcht-contains.c b/pigeonhole/src/lib-sieve/mcht-contains.c
new file mode 100644
index 0000000..a9b3190
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/mcht-contains.c
@@ -0,0 +1,66 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+/* Match-type ':contains'
+ */
+
+#include "lib.h"
+
+#include "sieve-match-types.h"
+#include "sieve-comparators.h"
+#include "sieve-match.h"
+
+#include <string.h>
+#include <stdio.h>
+
+/*
+ * Forward declarations
+ */
+
+static int mcht_contains_match_key
+ (struct sieve_match_context *mctx, const char *val, size_t val_size,
+ const char *key, size_t key_size);
+
+/*
+ * Match-type object
+ */
+
+const struct sieve_match_type_def contains_match_type = {
+ SIEVE_OBJECT("contains",
+ &match_type_operand, SIEVE_MATCH_TYPE_CONTAINS),
+ .validate_context = sieve_match_substring_validate_context,
+ .match_key = mcht_contains_match_key
+};
+
+/*
+ * Match-type implementation
+ */
+
+/* FIXME: Naive substring match implementation. Should switch to more
+ * efficient algorithm if large values need to be searched (e.g. message body).
+ */
+static int mcht_contains_match_key
+(struct sieve_match_context *mctx, const char *val, size_t val_size,
+ const char *key, size_t key_size)
+{
+ const struct sieve_comparator *cmp = mctx->comparator;
+ const char *vend = (const char *) val + val_size;
+ const char *kend = (const char *) key + key_size;
+ const char *vp = val;
+ const char *kp = key;
+
+ if ( val_size == 0 )
+ return ( key_size == 0 ? 1 : 0 );
+
+ if ( cmp->def == NULL || cmp->def->char_match == NULL )
+ return 0;
+
+ while ( (vp < vend) && (kp < kend) ) {
+ if ( !cmp->def->char_match(cmp, &vp, vend, &kp, kend) )
+ vp++;
+ }
+
+ return ( kp == kend ? 1 : 0 );
+}
+
+