dovecot-2.2: seq_range_array_add(): Fixed handling sequence rang...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Feb 24 11:58:58 EET 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/db0ada89b81a
changeset: 15907:db0ada89b81a
user: Timo Sirainen <tss at iki.fi>
date: Sun Feb 24 11:54:00 2013 +0200
description:
seq_range_array_add(): Fixed handling sequence ranges that contain zeros.
diffstat:
src/lib/seq-range-array.c | 24 ++++++++++++------------
src/lib/test-seq-range-array.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 12 deletions(-)
diffs (91 lines):
diff -r 11858b3dbd84 -r db0ada89b81a src/lib/seq-range-array.c
--- a/src/lib/seq-range-array.c Sun Feb 24 10:50:35 2013 +0200
+++ b/src/lib/seq-range-array.c Sun Feb 24 11:54:00 2013 +0200
@@ -48,22 +48,22 @@
}
/* quick checks */
- if (data[count-1].seq2 == seq-1) {
- /* grow last range */
- data[count-1].seq2 = seq;
- return FALSE;
- }
if (data[count-1].seq2 < seq) {
- array_append(array, &value, 1);
- return FALSE;
- }
- if (data[0].seq1 == seq+1) {
- /* grow down first range */
- data[0].seq1 = seq;
+ if (data[count-1].seq2 == seq-1) {
+ /* grow last range */
+ data[count-1].seq2 = seq;
+ } else {
+ array_append(array, &value, 1);
+ }
return FALSE;
}
if (data[0].seq1 > seq) {
- array_insert(array, 0, &value, 1);
+ if (data[0].seq1-1 == seq) {
+ /* grow down first range */
+ data[0].seq1 = seq;
+ } else {
+ array_insert(array, 0, &value, 1);
+ }
return FALSE;
}
diff -r 11858b3dbd84 -r db0ada89b81a src/lib/test-seq-range-array.c
--- a/src/lib/test-seq-range-array.c Sun Feb 24 10:50:35 2013 +0200
+++ b/src/lib/test-seq-range-array.c Sun Feb 24 11:54:00 2013 +0200
@@ -6,6 +6,41 @@
#include <stdlib.h>
+static void
+boundaries_permute(uint32_t *input, unsigned int i, unsigned int count)
+{
+ ARRAY_TYPE(seq_range) range;
+ const struct seq_range *seqs;
+ unsigned int seqs_count;
+ uint32_t tmp;
+ unsigned int j;
+
+ if (i+1 < count) {
+ for (j = i; j < count; j++) {
+ tmp = input[i]; input[i] = input[j]; input[j] = tmp;
+ boundaries_permute(input, i+1, count);
+ tmp = input[i]; input[i] = input[j]; input[j] = tmp;
+ }
+ return;
+ }
+ t_array_init(&range, 4);
+ for (i = 0; i < count; i++)
+ seq_range_array_add(&range, input[i]);
+ seqs = array_get(&range, &seqs_count);
+ test_assert(seqs_count == 2);
+ test_assert(seqs[0].seq1 == 0);
+ test_assert(seqs[0].seq2 == 1);
+ test_assert(seqs[1].seq1 == (uint32_t)-2);
+ test_assert(seqs[1].seq2 == (uint32_t)-1);
+}
+
+static void test_seq_range_array_add_boundaries(void)
+{
+ static uint32_t input[] = { 0, 1, (uint32_t)-2, (uint32_t)-1 };
+
+ boundaries_permute(input, 0, N_ELEMENTS(input));
+}
+
static void test_seq_range_array_add_merge(void)
{
ARRAY_TYPE(seq_range) range;
@@ -169,6 +204,7 @@
void test_seq_range_array(void)
{
+ test_seq_range_array_add_boundaries();
test_seq_range_array_add_merge();
test_seq_range_array_invert();
test_seq_range_array_have_common();
More information about the dovecot-cvs
mailing list