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