Coverage Report

Created: 2026-07-30 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}