Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6897:0a3186f44dff HEAD
Added seq_range_array_remove_seq_range() and
seq_range_array_remove_invert_range().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 02 Dec 2007 23:22:28 +0200 |
parents | 139bd6094de6 |
children | e739cffd05ef |
files | src/lib/seq-range-array.c src/lib/seq-range-array.h |
diffstat | 2 files changed, 44 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/seq-range-array.c Sun Dec 02 16:22:44 2007 +0200 +++ b/src/lib/seq-range-array.c Sun Dec 02 23:22:28 2007 +0200 @@ -213,6 +213,44 @@ return remove_count; } +unsigned int seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest, + const ARRAY_TYPE(seq_range) *src) +{ + unsigned int ret = 0; + const struct seq_range *src_range; + unsigned int i, count; + + src_range = array_get(src, &count); + for (i = 0; i < count; i++) { + ret += seq_range_array_remove_range(dest, src_range[i].seq1, + src_range[i].seq2); + } + return ret; +} + +unsigned int +seq_range_array_remove_invert_range(ARRAY_TYPE(seq_range) *dest, + const ARRAY_TYPE(seq_range) *src) +{ + const struct seq_range *src_range; + unsigned int i, count, ret = 0; + uint32_t last_seq = 0; + + src_range = array_get(src, &count); + for (i = 0; i < count; i++) { + if (last_seq + 1 < src_range[i].seq1) { + ret += seq_range_array_remove_range(dest, last_seq + 1, + src_range[i].seq1 - 1); + } + last_seq = src_range[i].seq2; + } + if (last_seq != (uint32_t)-1) { + ret += seq_range_array_remove_range(dest, last_seq + 1, + (uint32_t)-1); + } + return ret; +} + bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq) { unsigned int idx;
--- a/src/lib/seq-range-array.h Sun Dec 02 16:22:44 2007 +0200 +++ b/src/lib/seq-range-array.h Sun Dec 02 23:22:28 2007 +0200 @@ -16,6 +16,12 @@ /* Remove a sequence range. Returns number of sequences actually removed. */ unsigned int seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array, uint32_t seq1, uint32_t seq2); +unsigned int seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest, + const ARRAY_TYPE(seq_range) *src); +/* Remove sequences from dest that don't exist in src. */ +unsigned int +seq_range_array_remove_invert_range(ARRAY_TYPE(seq_range) *dest, + const ARRAY_TYPE(seq_range) *src); /* Returns TRUE if sequence exists in the range. */ bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq);