/src/pigeonhole/src/lib-sieve/plugins/relational/mcht-value.c
Line | Count | Source |
1 | | /* Copyright (c) Pigeonhole authors, see top-level COPYING file */ |
2 | | |
3 | | #include "lib.h" |
4 | | #include "str.h" |
5 | | |
6 | | #include "sieve-common.h" |
7 | | |
8 | | #include "sieve-ast.h" |
9 | | #include "sieve-code.h" |
10 | | #include "sieve-extensions.h" |
11 | | #include "sieve-commands.h" |
12 | | #include "sieve-comparators.h" |
13 | | #include "sieve-match-types.h" |
14 | | #include "sieve-validator.h" |
15 | | #include "sieve-generator.h" |
16 | | #include "sieve-interpreter.h" |
17 | | #include "sieve-match.h" |
18 | | |
19 | | #include "ext-relational-common.h" |
20 | | |
21 | | /* |
22 | | * Match-type objects |
23 | | */ |
24 | | |
25 | | const struct sieve_match_type_def value_match_type = { |
26 | | SIEVE_OBJECT("value", &rel_match_type_operand, RELATIONAL_VALUE), |
27 | | .validate = mcht_relational_validate, |
28 | | }; |
29 | | |
30 | | #define VALUE_MATCH_TYPE(name, rel_match) \ |
31 | | const struct sieve_match_type_def rel_match_value_ ## name = { \ |
32 | | SIEVE_OBJECT("value-" #name, \ |
33 | | &rel_match_type_operand, \ |
34 | | REL_MATCH_INDEX(RELATIONAL_VALUE, rel_match)), \ |
35 | | .match_key = mcht_value_match_key, \ |
36 | | } |
37 | | |
38 | | VALUE_MATCH_TYPE(gt, REL_MATCH_GREATER); |
39 | | VALUE_MATCH_TYPE(ge, REL_MATCH_GREATER_EQUAL); |
40 | | VALUE_MATCH_TYPE(lt, REL_MATCH_LESS); |
41 | | VALUE_MATCH_TYPE(le, REL_MATCH_LESS_EQUAL); |
42 | | VALUE_MATCH_TYPE(eq, REL_MATCH_EQUAL); |
43 | | VALUE_MATCH_TYPE(ne, REL_MATCH_NOT_EQUAL); |
44 | | |
45 | | /* |
46 | | * Match-type implementation |
47 | | */ |
48 | | |
49 | | int mcht_value_match_key(struct sieve_match_context *mctx, |
50 | | const char *val, size_t val_size, |
51 | | const char *key, size_t key_size) |
52 | 0 | { |
53 | 0 | const struct sieve_match_type *mtch = mctx->match_type; |
54 | 0 | unsigned int rel_match = REL_MATCH(mtch->object.def->code); |
55 | 0 | int cmp_result; |
56 | |
|
57 | 0 | cmp_result = mctx->comparator->def->compare( |
58 | 0 | mctx->comparator, val, val_size, key, key_size); |
59 | |
|
60 | 0 | switch (rel_match) { |
61 | 0 | case REL_MATCH_GREATER: |
62 | 0 | return (cmp_result > 0 ? 1 : 0); |
63 | 0 | case REL_MATCH_GREATER_EQUAL: |
64 | 0 | return (cmp_result >= 0 ? 1 : 0); |
65 | 0 | case REL_MATCH_LESS: |
66 | 0 | return (cmp_result < 0 ? 1 : 0); |
67 | 0 | case REL_MATCH_LESS_EQUAL: |
68 | 0 | return (cmp_result <= 0 ? 1 : 0); |
69 | 0 | case REL_MATCH_EQUAL: |
70 | 0 | return (cmp_result == 0 ? 1 : 0); |
71 | 0 | case REL_MATCH_NOT_EQUAL: |
72 | 0 | return (cmp_result != 0 ? 1 : 0); |
73 | 0 | } |
74 | 0 | i_unreached(); |
75 | 0 | } |