Mercurial > dovecot > core-2.2
changeset 15907:db0ada89b81a
seq_range_array_add(): Fixed handling sequence ranges that contain zeros.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 24 Feb 2013 11:54:00 +0200 |
parents | 11858b3dbd84 |
children | 573682b34a76 |
files | src/lib/seq-range-array.c src/lib/test-seq-range-array.c |
diffstat | 2 files changed, 48 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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();