summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c')
-rw-r--r--pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c b/pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c
new file mode 100644
index 0000000..dd55590
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c
@@ -0,0 +1,80 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+#include "str.h"
+
+#include "sieve-common.h"
+
+#include "sieve-ast.h"
+#include "sieve-code.h"
+#include "sieve-extensions.h"
+#include "sieve-commands.h"
+#include "sieve-comparators.h"
+#include "sieve-match-types.h"
+#include "sieve-validator.h"
+#include "sieve-generator.h"
+#include "sieve-interpreter.h"
+#include "sieve-match.h"
+
+#include "ext-relational-common.h"
+
+/*
+ * Match-type objects
+ */
+
+const struct sieve_match_type_def value_match_type = {
+ SIEVE_OBJECT("value",
+ &rel_match_type_operand, RELATIONAL_VALUE),
+ .validate = mcht_relational_validate
+};
+
+#define VALUE_MATCH_TYPE(name, rel_match) \
+const struct sieve_match_type_def rel_match_value_ ## name = { \
+ SIEVE_OBJECT("value-" #name, \
+ &rel_match_type_operand, \
+ REL_MATCH_INDEX(RELATIONAL_VALUE, rel_match)), \
+ .match_key = mcht_value_match_key, \
+}
+
+VALUE_MATCH_TYPE(gt, REL_MATCH_GREATER);
+VALUE_MATCH_TYPE(ge, REL_MATCH_GREATER_EQUAL);
+VALUE_MATCH_TYPE(lt, REL_MATCH_LESS);
+VALUE_MATCH_TYPE(le, REL_MATCH_LESS_EQUAL);
+VALUE_MATCH_TYPE(eq, REL_MATCH_EQUAL);
+VALUE_MATCH_TYPE(ne, REL_MATCH_NOT_EQUAL);
+
+/*
+ * Match-type implementation
+ */
+
+int mcht_value_match_key
+(struct sieve_match_context *mctx, const char *val, size_t val_size,
+ const char *key, size_t key_size)
+{
+ const struct sieve_match_type *mtch = mctx->match_type;
+ unsigned int rel_match = REL_MATCH(mtch->object.def->code);
+ int cmp_result;
+
+ cmp_result = mctx->comparator->def->
+ compare(mctx->comparator, val, val_size, key, key_size);
+
+ switch ( rel_match ) {
+ case REL_MATCH_GREATER:
+ return ( cmp_result > 0 ? 1 : 0 );
+ case REL_MATCH_GREATER_EQUAL:
+ return ( cmp_result >= 0 ? 1 : 0 );
+ case REL_MATCH_LESS:
+ return ( cmp_result < 0 ? 1 : 0 );
+ case REL_MATCH_LESS_EQUAL:
+ return ( cmp_result <= 0 ? 1 : 0 );
+ case REL_MATCH_EQUAL:
+ return ( cmp_result == 0 ? 1 : 0);
+ case REL_MATCH_NOT_EQUAL:
+ return ( cmp_result != 0 ? 1 : 0);
+ }
+
+ i_unreached();
+}
+
+