summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/cmp-i-octet.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:51:24 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:51:24 +0000
commitf7548d6d28c313cf80e6f3ef89aed16a19815df1 (patch)
treea3f6f2a3f247293bee59ecd28e8cd8ceb6ca064a /pigeonhole/src/lib-sieve/cmp-i-octet.c
parentInitial commit. (diff)
downloaddovecot-upstream.tar.xz
dovecot-upstream.zip
Adding upstream version 1:2.3.19.1+dfsg1.upstream/1%2.3.19.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'pigeonhole/src/lib-sieve/cmp-i-octet.c')
-rw-r--r--pigeonhole/src/lib-sieve/cmp-i-octet.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/cmp-i-octet.c b/pigeonhole/src/lib-sieve/cmp-i-octet.c
new file mode 100644
index 0000000..caa46fa
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/cmp-i-octet.c
@@ -0,0 +1,97 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+/* Comparator 'i;octet':
+ *
+ */
+
+#include "lib.h"
+
+#include "sieve-common.h"
+#include "sieve-comparators.h"
+
+#include <string.h>
+#include <stdio.h>
+
+/*
+ * Forward declarations
+ */
+
+static int cmp_i_octet_compare
+ (const struct sieve_comparator *cmp,
+ const char *val1, size_t val1_size, const char *val2, size_t val2_size);
+static bool cmp_i_octet_char_match
+ (const struct sieve_comparator *cmp, const char **val1, const char *val1_end,
+ const char **val2, const char *val2_end);
+
+/*
+ * Comparator object
+ */
+
+const struct sieve_comparator_def i_octet_comparator = {
+ SIEVE_OBJECT("i;octet",
+ &comparator_operand, SIEVE_COMPARATOR_I_OCTET),
+ .flags =
+ SIEVE_COMPARATOR_FLAG_ORDERING |
+ SIEVE_COMPARATOR_FLAG_EQUALITY |
+ SIEVE_COMPARATOR_FLAG_SUBSTRING_MATCH |
+ SIEVE_COMPARATOR_FLAG_PREFIX_MATCH,
+ .compare = cmp_i_octet_compare,
+ .char_match = cmp_i_octet_char_match,
+ .char_skip = sieve_comparator_octet_skip
+};
+
+/*
+ * Comparator implementation
+ */
+
+static int cmp_i_octet_compare(
+ const struct sieve_comparator *cmp ATTR_UNUSED,
+ const char *val1, size_t val1_size, const char *val2, size_t val2_size)
+{
+ int result;
+
+ if ( val1_size == val2_size ) {
+ return memcmp((void *) val1, (void *) val2, val1_size);
+ }
+
+ if ( val1_size > val2_size ) {
+ result = memcmp((void *) val1, (void *) val2, val2_size);
+
+ if ( result == 0 ) return 1;
+
+ return result;
+ }
+
+ result = memcmp((void *) val1, (void *) val2, val1_size);
+
+ if ( result == 0 ) return -1;
+
+ return result;
+}
+
+static bool cmp_i_octet_char_match
+ (const struct sieve_comparator *cmp ATTR_UNUSED,
+ const char **val, const char *val_end,
+ const char **key, const char *key_end)
+{
+ const char *val_begin = *val;
+ const char *key_begin = *key;
+
+ while ( **val == **key && *val < val_end && *key < key_end ) {
+ (*val)++;
+ (*key)++;
+ }
+
+ if ( *key < key_end ) {
+ /* Reset */
+ *val = val_begin;
+ *key = key_begin;
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+