changeset 6040:fef4aad133dd HEAD

seq_range_array_remove_range() returns now how many sequences were removed.
author Timo Sirainen <tss@iki.fi>
date Tue, 17 Jul 2007 21:16:23 +0300
parents 3887591e7a54
children f2ab0b7e5ae6
files src/lib/seq-range-array.c src/lib/seq-range-array.h
diffstat 2 files changed, 20 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/seq-range-array.c	Tue Jul 17 20:39:27 2007 +0300
+++ b/src/lib/seq-range-array.c	Tue Jul 17 21:16:23 2007 +0300
@@ -172,23 +172,26 @@
 	return FALSE;
 }
 
-void seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
-				  uint32_t seq1, uint32_t seq2)
+unsigned int seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
+					  uint32_t seq1, uint32_t seq2)
 {
 	const struct seq_range *data;
-	unsigned int idx, idx2, count;
+	unsigned int idx, idx2, count, remove_count = 0;
 
 	/* remove first and last. this makes sure that everything between
 	   can simply be deleted with array_delete().
 
 	   FIXME: it would be faster if we did only one binary lookup here
 	   and handled the splitting ourself.. */
-	seq_range_array_remove(array, seq1++);
+	if (seq_range_array_remove(array, seq1++))
+		remove_count++;
 	if (seq1 > seq2)
-		return;
-	seq_range_array_remove(array, seq2--);
+		return remove_count;
+
+	if (seq_range_array_remove(array, seq2--))
+		remove_count++;
 	if (seq1 == seq2)
-		return;
+		return remove_count;
 
 	/* find the beginning */
 	data = array_get(array, &count);
@@ -197,14 +200,16 @@
 		idx++;
 
 	if (idx == count)
-		return;
+		return remove_count;
 
 	i_assert(data[idx].seq1 >= seq1);
 	for (idx2 = idx; idx2 < count; idx2++) {
 		if (data[idx2].seq1 > seq2)
 			break;
+		remove_count += data[idx2].seq2 - data[idx2].seq1 + 1;
 	}
 	array_delete(array, idx, idx2-idx);
+	return remove_count;
 }
 
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq)
--- a/src/lib/seq-range-array.h	Tue Jul 17 20:39:27 2007 +0300
+++ b/src/lib/seq-range-array.h	Tue Jul 17 21:16:23 2007 +0300
@@ -7,11 +7,16 @@
 
 ARRAY_DEFINE_TYPE(seq_range, struct seq_range);
 
+/* Add sequrence to range. If the array isn't created yet, create it with
+   initial size of init_count. */
 void seq_range_array_add(ARRAY_TYPE(seq_range) *array, unsigned int init_count,
 			 uint32_t seq);
+/* Remove given sequrence from range. Returns TRUE if it was found. */
 bool seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq);
-void seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
-				  uint32_t seq1, uint32_t seq2);
+/* 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);
+/* Returns TRUE if sequence exists in the range. */
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq);
 
 #endif