Coverage Report

Created: 2026-09-03 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pigeonhole/src/lib-sieve/cmp-i-octet.c
Line
Count
Source
1
/* Copyright (c) Pigeonhole authors, see top-level COPYING file */
2
3
/* Comparator 'i;octet':
4
 *
5
 */
6
7
#include "lib.h"
8
9
#include "sieve-common.h"
10
#include "sieve-comparators.h"
11
12
#include <string.h>
13
#include <stdio.h>
14
15
/*
16
 * Forward declarations
17
 */
18
19
static int
20
cmp_i_octet_compare(const struct sieve_comparator *cmp,
21
        const char *val1, size_t val1_size,
22
        const char *val2, size_t val2_size);
23
static bool
24
cmp_i_octet_char_match(const struct sieve_comparator *cmp,
25
           const char **val1, const char *val1_end,
26
           const char **val2, const char *val2_end);
27
28
/*
29
 * Comparator object
30
 */
31
32
const struct sieve_comparator_def i_octet_comparator = {
33
  SIEVE_OBJECT("i;octet", &comparator_operand,
34
         SIEVE_COMPARATOR_I_OCTET),
35
  .flags =
36
    SIEVE_COMPARATOR_FLAG_ORDERING |
37
    SIEVE_COMPARATOR_FLAG_EQUALITY |
38
    SIEVE_COMPARATOR_FLAG_SUBSTRING_MATCH |
39
    SIEVE_COMPARATOR_FLAG_PREFIX_MATCH,
40
  .compare = cmp_i_octet_compare,
41
  .char_match = cmp_i_octet_char_match,
42
  .char_skip = sieve_comparator_octet_skip
43
};
44
45
/*
46
 * Comparator implementation
47
 */
48
49
static int
50
cmp_i_octet_compare(const struct sieve_comparator *cmp ATTR_UNUSED,
51
        const char *val1, size_t val1_size,
52
        const char *val2, size_t val2_size)
53
0
{
54
0
  int result;
55
56
0
  if (val1_size == val2_size)
57
0
    return memcmp(val1, val2, val1_size);
58
59
0
  if (val1_size > val2_size) {
60
0
    result = memcmp(val1, val2, val2_size);
61
62
0
    if (result == 0)
63
0
      return 1;
64
0
    return result;
65
0
  }
66
67
0
  result = memcmp(val1, val2, val1_size);
68
69
0
  if (result == 0)
70
0
    return -1;
71
0
  return result;
72
0
}
73
74
static bool
75
cmp_i_octet_char_match(const struct sieve_comparator *cmp ATTR_UNUSED,
76
           const char **val, const char *val_end,
77
           const char **key, const char *key_end)
78
0
{
79
0
  const char *val_begin = *val;
80
0
  const char *key_begin = *key;
81
82
0
  while (*val < val_end && *key < key_end && **val == **key) {
83
0
    (*val)++;
84
0
    (*key)++;
85
0
  }
86
87
0
  if (*key < key_end) {
88
    /* Reset */
89
0
    *val = val_begin;
90
0
    *key = key_begin;
91
92
0
    return FALSE;
93
0
  }
94
0
  return TRUE;
95
0
}