Coverage Report

Created: 2026-09-03 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/seq-range-array.h
Line
Count
Source
1
#ifndef SEQ_RANGE_ARRAY_H
2
#define SEQ_RANGE_ARRAY_H
3
4
/* NOTE: A full 0..UINT_MAX sequence range isn't valid to use here, because its
5
   size would become UINT_MAX+1, which can't be returned by e.g.
6
   seq_range_count() and similar functions. Attempting to use such sequence
7
   ranges will result in assert-crash. */
8
9
struct seq_range {
10
  uint32_t seq1, seq2;
11
};
12
ARRAY_DEFINE_TYPE(seq_range, struct seq_range);
13
14
struct seq_range_iter {
15
  const ARRAY_TYPE(seq_range) *array;
16
  unsigned int prev_n, prev_idx;
17
};
18
19
static inline uint32_t ATTR_PURE seq_range_length(const struct seq_range *range)
20
0
{
21
0
  i_assert(range->seq2 >= range->seq1);
22
0
  i_assert(range->seq1 > 0 || range->seq2 < (uint32_t)-1);
23
0
  return range->seq2 - range->seq1 + 1;
24
0
}
Unexecuted instantiation: testsuite-common.c:seq_range_length
Unexecuted instantiation: testsuite-objects.c:seq_range_length
Unexecuted instantiation: testsuite-message.c:seq_range_length
Unexecuted instantiation: testsuite-mailstore.c:seq_range_length
Unexecuted instantiation: cmd-test-message.c:seq_range_length
Unexecuted instantiation: sieve-message.c:seq_range_length
Unexecuted instantiation: sieve-storage-sync.c:seq_range_length
Unexecuted instantiation: sieve-rusage.c:seq_range_length
Unexecuted instantiation: sieve-interpreter.c:seq_range_length
Unexecuted instantiation: sieve-result.c:seq_range_length
Unexecuted instantiation: sieve-actions.c:seq_range_length
Unexecuted instantiation: tst-size.c:seq_range_length
Unexecuted instantiation: cmd-redirect.c:seq_range_length
Unexecuted instantiation: sieve-file-storage.c:seq_range_length
Unexecuted instantiation: tag-flags.c:seq_range_length
Unexecuted instantiation: tag-mailbox-create.c:seq_range_length
Unexecuted instantiation: tst-mailboxexists.c:seq_range_length
Unexecuted instantiation: tst-duplicate.c:seq_range_length
Unexecuted instantiation: tag-index.c:seq_range_length
Unexecuted instantiation: ext-metadata.c:seq_range_length
Unexecuted instantiation: tst-metadata.c:seq_range_length
Unexecuted instantiation: tst-metadataexists.c:seq_range_length
Unexecuted instantiation: tag-mime.c:seq_range_length
Unexecuted instantiation: tag-specialuse.c:seq_range_length
Unexecuted instantiation: tst-specialuse-exists.c:seq_range_length
Unexecuted instantiation: tag-redirect-list.c:seq_range_length
Unexecuted instantiation: edit-mail.c:seq_range_length
Unexecuted instantiation: mail-raw.c:seq_range_length
Unexecuted instantiation: cmd-vacation.c:seq_range_length
Unexecuted instantiation: ext-imap4flags-common.c:seq_range_length
Unexecuted instantiation: ext-body-common.c:seq_range_length
Unexecuted instantiation: ntfy-mailto.c:seq_range_length
Unexecuted instantiation: ext-spamvirustest-common.c:seq_range_length
Unexecuted instantiation: cmd-addheader.c:seq_range_length
Unexecuted instantiation: cmd-deleteheader.c:seq_range_length
Unexecuted instantiation: ext-extlists-common.c:seq_range_length
Unexecuted instantiation: cmd-report.c:seq_range_length
Unexecuted instantiation: sieve-tool.c:seq_range_length
Unexecuted instantiation: index-mail-binary.c:seq_range_length
Unexecuted instantiation: index-mail.c:seq_range_length
Unexecuted instantiation: index-storage.c:seq_range_length
Unexecuted instantiation: index-thread.c:seq_range_length
Unexecuted instantiation: index-transaction.c:seq_range_length
Unexecuted instantiation: istream-mail.c:seq_range_length
Unexecuted instantiation: mail-cache-decisions.c:seq_range_length
Unexecuted instantiation: mail-cache-fields.c:seq_range_length
Unexecuted instantiation: mail-cache-lookup.c:seq_range_length
Unexecuted instantiation: mail-cache-purge.c:seq_range_length
Unexecuted instantiation: mail-cache-transaction.c:seq_range_length
Unexecuted instantiation: mail-cache.c:seq_range_length
Unexecuted instantiation: mail-index-alloc-cache.c:seq_range_length
Unexecuted instantiation: mail-index-fsck.c:seq_range_length
Unexecuted instantiation: mail-index-lock.c:seq_range_length
Unexecuted instantiation: mail-index-map.c:seq_range_length
Unexecuted instantiation: mail-index-modseq.c:seq_range_length
Unexecuted instantiation: mail-index-strmap.c:seq_range_length
Unexecuted instantiation: mail-index-sync.c:seq_range_length
Unexecuted instantiation: mail-index-transaction-finish.c:seq_range_length
Unexecuted instantiation: mail-index-transaction-sort-appends.c:seq_range_length
Unexecuted instantiation: mail-index-transaction-update.c:seq_range_length
Unexecuted instantiation: mail-index-transaction-view.c:seq_range_length
Unexecuted instantiation: mail-index-transaction.c:seq_range_length
Unexecuted instantiation: mail-index-util.c:seq_range_length
Unexecuted instantiation: mail-index-view-sync.c:seq_range_length
Unexecuted instantiation: mail-index-view.c:seq_range_length
Unexecuted instantiation: mail-index-write.c:seq_range_length
Unexecuted instantiation: mail-index.c:seq_range_length
Unexecuted instantiation: mail-namespace.c:seq_range_length
Unexecuted instantiation: mail-search-build.c:seq_range_length
Unexecuted instantiation: mail-search-register.c:seq_range_length
Unexecuted instantiation: mail-search.c:seq_range_length
Unexecuted instantiation: mail-storage-hooks.c:seq_range_length
Unexecuted instantiation: mail-storage-service.c:seq_range_length
Unexecuted instantiation: mail-storage-settings.c:seq_range_length
Unexecuted instantiation: mail-storage.c:seq_range_length
Unexecuted instantiation: mail-transaction-log-append.c:seq_range_length
Unexecuted instantiation: mail-transaction-log-file.c:seq_range_length
Unexecuted instantiation: mail-transaction-log-modseq.c:seq_range_length
Unexecuted instantiation: mail-transaction-log-view.c:seq_range_length
Unexecuted instantiation: mail-transaction-log.c:seq_range_length
Unexecuted instantiation: mail-user.c:seq_range_length
Unexecuted instantiation: mail.c:seq_range_length
Unexecuted instantiation: mailbox-attribute.c:seq_range_length
Unexecuted instantiation: mailbox-get.c:seq_range_length
Unexecuted instantiation: mailbox-guid-cache.c:seq_range_length
Unexecuted instantiation: mailbox-header.c:seq_range_length
Unexecuted instantiation: mailbox-keywords.c:seq_range_length
Unexecuted instantiation: mailbox-list-iter.c:seq_range_length
Unexecuted instantiation: mailbox-list-subscriptions.c:seq_range_length
Unexecuted instantiation: mailbox-list.c:seq_range_length
Unexecuted instantiation: mailbox-recent-flags.c:seq_range_length
Unexecuted instantiation: mailbox-search-result.c:seq_range_length
Unexecuted instantiation: mailbox-watch.c:seq_range_length
Unexecuted instantiation: raw-storage.c:seq_range_length
Unexecuted instantiation: raw-sync.c:seq_range_length
Unexecuted instantiation: shared-list.c:seq_range_length
Unexecuted instantiation: shared-storage.c:seq_range_length
Unexecuted instantiation: subscription-file.c:seq_range_length
Unexecuted instantiation: imap-metadata.c:seq_range_length
Unexecuted instantiation: fail-mailbox.c:seq_range_length
Unexecuted instantiation: imapc-list.c:seq_range_length
Unexecuted instantiation: imapc-storage.c:seq_range_length
Unexecuted instantiation: imapc-sync.c:seq_range_length
Unexecuted instantiation: index-attachment.c:seq_range_length
Unexecuted instantiation: index-attribute.c:seq_range_length
Unexecuted instantiation: index-mail-headers.c:seq_range_length
Unexecuted instantiation: index-mailbox-size.c:seq_range_length
Unexecuted instantiation: index-pop3-uidl.c:seq_range_length
Unexecuted instantiation: index-search.c:seq_range_length
Unexecuted instantiation: index-sort.c:seq_range_length
Unexecuted instantiation: index-status.c:seq_range_length
Unexecuted instantiation: index-sync-pvt.c:seq_range_length
Unexecuted instantiation: index-sync.c:seq_range_length
Unexecuted instantiation: index-thread-finish.c:seq_range_length
Unexecuted instantiation: index-thread-links.c:seq_range_length
Unexecuted instantiation: mail-cache-sync-update.c:seq_range_length
Unexecuted instantiation: mail-copy.c:seq_range_length
Unexecuted instantiation: mail-index-dummy-view.c:seq_range_length
Unexecuted instantiation: mail-index-map-read.c:seq_range_length
Unexecuted instantiation: mail-index-sync-update.c:seq_range_length
Unexecuted instantiation: mail-index-transaction-export.c:seq_range_length
Unexecuted instantiation: mail-search-args-simplify.c:seq_range_length
Unexecuted instantiation: mail-search-mime-register.c:seq_range_length
Unexecuted instantiation: mail-search-mime.c:seq_range_length
Unexecuted instantiation: mail-search-register-human.c:seq_range_length
Unexecuted instantiation: mail-search-register-imap.c:seq_range_length
Unexecuted instantiation: mail-storage-register.c:seq_range_length
Unexecuted instantiation: mailbox-attribute-internal.c:seq_range_length
Unexecuted instantiation: mailbox-list-fs.c:seq_range_length
Unexecuted instantiation: mailbox-list-index-backend.c:seq_range_length
Unexecuted instantiation: mailbox-list-index-status.c:seq_range_length
Unexecuted instantiation: mailbox-list-index-sync.c:seq_range_length
Unexecuted instantiation: mailbox-list-index.c:seq_range_length
Unexecuted instantiation: mailbox-list-maildir.c:seq_range_length
Unexecuted instantiation: mailbox-list-none.c:seq_range_length
Unexecuted instantiation: maildir-storage.c:seq_range_length
Unexecuted instantiation: maildir-sync-index.c:seq_range_length
Unexecuted instantiation: maildir-sync.c:seq_range_length
Unexecuted instantiation: maildir-uidlist.c:seq_range_length
Unexecuted instantiation: maildir-util.c:seq_range_length
Unexecuted instantiation: mbox-storage.c:seq_range_length
Unexecuted instantiation: mbox-sync-list-index.c:seq_range_length
Unexecuted instantiation: mbox-sync.c:seq_range_length
Unexecuted instantiation: mdbox-deleted-storage.c:seq_range_length
Unexecuted instantiation: mdbox-file.c:seq_range_length
Unexecuted instantiation: mdbox-mail.c:seq_range_length
Unexecuted instantiation: mdbox-map.c:seq_range_length
Unexecuted instantiation: mdbox-purge.c:seq_range_length
Unexecuted instantiation: mdbox-save.c:seq_range_length
Unexecuted instantiation: mdbox-settings.c:seq_range_length
Unexecuted instantiation: mdbox-storage-rebuild.c:seq_range_length
Unexecuted instantiation: mdbox-storage.c:seq_range_length
Unexecuted instantiation: mdbox-sync.c:seq_range_length
Unexecuted instantiation: pop3c-storage.c:seq_range_length
Unexecuted instantiation: pop3c-sync.c:seq_range_length
Unexecuted instantiation: raw-mail.c:seq_range_length
Unexecuted instantiation: sdbox-storage.c:seq_range_length
Unexecuted instantiation: sdbox-sync.c:seq_range_length
Unexecuted instantiation: dbox-file-fix.c:seq_range_length
Unexecuted instantiation: dbox-file.c:seq_range_length
Unexecuted instantiation: dbox-mail.c:seq_range_length
Unexecuted instantiation: dbox-save.c:seq_range_length
Unexecuted instantiation: dbox-storage.c:seq_range_length
Unexecuted instantiation: fail-mail-storage.c:seq_range_length
Unexecuted instantiation: fail-mail.c:seq_range_length
Unexecuted instantiation: imapc-attribute.c:seq_range_length
Unexecuted instantiation: imapc-connection.c:seq_range_length
Unexecuted instantiation: imapc-mail-fetch.c:seq_range_length
Unexecuted instantiation: imapc-mail.c:seq_range_length
Unexecuted instantiation: imapc-mailbox.c:seq_range_length
Unexecuted instantiation: imapc-save.c:seq_range_length
Unexecuted instantiation: imapc-search.c:seq_range_length
Unexecuted instantiation: index-rebuild.c:seq_range_length
Unexecuted instantiation: index-search-mime.c:seq_range_length
Unexecuted instantiation: index-sort-string.c:seq_range_length
Unexecuted instantiation: index-sync-changes.c:seq_range_length
Unexecuted instantiation: index-sync-search.c:seq_range_length
Unexecuted instantiation: mail-index-map-hdr.c:seq_range_length
Unexecuted instantiation: mail-index-sync-ext.c:seq_range_length
Unexecuted instantiation: mail-index-sync-keywords.c:seq_range_length
Unexecuted instantiation: mail-search-args-imap.c:seq_range_length
Unexecuted instantiation: mail-search-mime-build.c:seq_range_length
Unexecuted instantiation: mail-storage-list-index-rebuild.c:seq_range_length
Unexecuted instantiation: mailbox-list-delete.c:seq_range_length
Unexecuted instantiation: mailbox-list-fs-flags.c:seq_range_length
Unexecuted instantiation: mailbox-list-fs-iter.c:seq_range_length
Unexecuted instantiation: mailbox-list-index-iter.c:seq_range_length
Unexecuted instantiation: mailbox-list-index-notify.c:seq_range_length
Unexecuted instantiation: mailbox-list-maildir-iter.c:seq_range_length
Unexecuted instantiation: mailbox-list-notify-tree.c:seq_range_length
Unexecuted instantiation: maildir-copy.c:seq_range_length
Unexecuted instantiation: maildir-filename-flags.c:seq_range_length
Unexecuted instantiation: maildir-filename.c:seq_range_length
Unexecuted instantiation: maildir-keywords.c:seq_range_length
Unexecuted instantiation: maildir-mail.c:seq_range_length
Unexecuted instantiation: maildir-save.c:seq_range_length
Unexecuted instantiation: mbox-file.c:seq_range_length
Unexecuted instantiation: mbox-lock.c:seq_range_length
Unexecuted instantiation: mbox-mail.c:seq_range_length
Unexecuted instantiation: mbox-save.c:seq_range_length
Unexecuted instantiation: mbox-sync-parse.c:seq_range_length
Unexecuted instantiation: mbox-sync-rewrite.c:seq_range_length
Unexecuted instantiation: mbox-sync-update.c:seq_range_length
Unexecuted instantiation: pop3c-mail.c:seq_range_length
Unexecuted instantiation: sdbox-copy.c:seq_range_length
Unexecuted instantiation: sdbox-file.c:seq_range_length
Unexecuted instantiation: sdbox-mail.c:seq_range_length
Unexecuted instantiation: sdbox-save.c:seq_range_length
Unexecuted instantiation: sdbox-settings.c:seq_range_length
Unexecuted instantiation: sdbox-sync-rebuild.c:seq_range_length
Unexecuted instantiation: dbox-attachment.c:seq_range_length
Unexecuted instantiation: index-search-result.c:seq_range_length
Unexecuted instantiation: imap-seqset.c:seq_range_length
Unexecuted instantiation: imap-util.c:seq_range_length
Unexecuted instantiation: seq-range-array.c:seq_range_length
25
26
/* Add sequence to range. If the array isn't created yet, create it with
27
   initial size of init_count. */
28
bool ATTR_NOWARN_UNUSED_RESULT
29
seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq);
30
/* Like seq_range_array_add(), but if the array isn't already initialized do
31
   it with i_array_init(). */
32
void seq_range_array_add_with_init(ARRAY_TYPE(seq_range) *array,
33
           unsigned int init_count, uint32_t seq);
34
void seq_range_array_add_range(ARRAY_TYPE(seq_range) *array,
35
             uint32_t seq1, uint32_t seq2);
36
unsigned int seq_range_array_add_range_count(ARRAY_TYPE(seq_range) *array,
37
               uint32_t seq1, uint32_t seq2);
38
void seq_range_array_merge(ARRAY_TYPE(seq_range) *dest,
39
         const ARRAY_TYPE(seq_range) *src);
40
/* Merge the first n sequences from src into dest. */
41
void seq_range_array_merge_n(ARRAY_TYPE(seq_range) *dest,
42
           const ARRAY_TYPE(seq_range) *src,
43
           unsigned int count);
44
/* Remove the given sequence from range. Returns TRUE if it was found. */
45
bool ATTR_NOWARN_UNUSED_RESULT
46
seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq);
47
/* Remove a sequence range. Returns number of sequences actually removed. */
48
unsigned int ATTR_NOWARN_UNUSED_RESULT
49
seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
50
           uint32_t seq1, uint32_t seq2);
51
unsigned int ATTR_NOWARN_UNUSED_RESULT
52
seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest,
53
         const ARRAY_TYPE(seq_range) *src);
54
/* Remove count number of sequences from the nth sequence (0 = first). */
55
void seq_range_array_remove_nth(ARRAY_TYPE(seq_range) *array,
56
        uint32_t n, uint32_t count);
57
/* Remove sequences from dest that don't exist in src. */
58
unsigned int ATTR_NOWARN_UNUSED_RESULT
59
seq_range_array_intersect(ARRAY_TYPE(seq_range) *dest,
60
        const ARRAY_TYPE(seq_range) *src);
61
/* Returns TRUE if sequence exists in the range. */
62
bool seq_range_exists(const ARRAY_TYPE(seq_range) *array,
63
          uint32_t seq) ATTR_PURE;
64
/* Returns TRUE if arrays have common sequences. */
65
bool seq_range_array_have_common(const ARRAY_TYPE(seq_range) *array1,
66
         const ARRAY_TYPE(seq_range) *array2) ATTR_PURE;
67
/* Return number of sequences in the range. */
68
unsigned int seq_range_count(const ARRAY_TYPE(seq_range) *array) ATTR_PURE;
69
70
/* Invert the sequence range. For example 5:6 -> min_seq:4,7:max_seq.
71
   The array must not have any sequences outside min_seq..max_seq or this
72
   function will assert-crash. */
73
void seq_range_array_invert(ARRAY_TYPE(seq_range) *array,
74
          uint32_t min_seq, uint32_t max_seq);
75
76
void seq_range_array_iter_init(struct seq_range_iter *iter_r,
77
             const ARRAY_TYPE(seq_range) *array);
78
/* Get the nth sequence (0 = first). Returns FALSE if idx is too large. */
79
bool seq_range_array_iter_nth(struct seq_range_iter *iter, unsigned int n,
80
            uint32_t *seq_r);
81
82
#endif