dovecot-1.2: Added array_reverse().

dovecot at dovecot.org dovecot at dovecot.org
Tue Jun 17 12:36:44 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/69c1e3e13464
changeset: 7858:69c1e3e13464
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jun 13 04:36:19 2008 +0300
description:
Added array_reverse().

diffstat:

3 files changed, 63 insertions(+)
src/lib/array.c      |   33 +++++++++++++++++++++++++++++++++
src/lib/array.h      |    4 ++++
src/tests/test-lib.c |   26 ++++++++++++++++++++++++++

diffs (102 lines):

diff -r 63df79ccfedb -r 69c1e3e13464 src/lib/array.c
--- a/src/lib/array.c	Fri Jun 13 04:25:05 2008 +0300
+++ b/src/lib/array.c	Fri Jun 13 04:36:19 2008 +0300
@@ -41,6 +41,20 @@ void array_idx_clear_i(struct array *arr
 	}
 }
 
+void *array_insert_space_i(struct array *array, unsigned int idx)
+{
+	void *data;
+	size_t pos;
+
+	pos = idx * array->element_size;
+	buffer_copy(array->buffer, pos + array->element_size,
+		    array->buffer, pos, (size_t)-1);
+
+	data = buffer_get_space_unsafe(array->buffer, pos, array->element_size);
+	memset(data, 0, array->element_size);
+	return data;
+}
+
 bool array_cmp_i(const struct array *array1, const struct array *array2)
 {
 	if (!array_is_created_i(array1) || array1->buffer->used == 0)
@@ -51,3 +65,22 @@ bool array_cmp_i(const struct array *arr
 
 	return buffer_cmp(array1->buffer, array2->buffer);
 }
+
+void array_reverse_i(const struct array *array)
+{
+	const unsigned int element_size = array->element_size;
+	unsigned int i, count = array_count_i(array);
+	size_t size;
+	void *data, *tmp;
+
+	data = buffer_get_modifiable_data(array->buffer, &size);
+	tmp = t_buffer_get(array->element_size);
+	for (i = 0; i+1 < count; i++, count--) {
+		memcpy(tmp, PTR_OFFSET(data, i * element_size), element_size);
+		memcpy(PTR_OFFSET(data, i * element_size),
+		       PTR_OFFSET(data, (count-1) * element_size),
+		       element_size);
+		memcpy(PTR_OFFSET(data, (count-1) * element_size), tmp,
+		       element_size);
+	}
+}
diff -r 63df79ccfedb -r 69c1e3e13464 src/lib/array.h
--- a/src/lib/array.h	Fri Jun 13 04:25:05 2008 +0300
+++ b/src/lib/array.h	Fri Jun 13 04:36:19 2008 +0300
@@ -221,4 +221,8 @@ bool array_cmp_i(const struct array *arr
 #define array_cmp(array1, array2) \
 	array_cmp_i(&(array1)->arr, &(array2)->arr)
 
+void array_reverse_i(const struct array *array);
+#define array_reverse(array) \
+	array_reverse_i(&(array)->arr)
+
 #endif
diff -r 63df79ccfedb -r 69c1e3e13464 src/tests/test-lib.c
--- a/src/tests/test-lib.c	Fri Jun 13 04:25:05 2008 +0300
+++ b/src/tests/test-lib.c	Fri Jun 13 04:36:19 2008 +0300
@@ -14,6 +14,31 @@
 
 #include <stdlib.h>
 #include <time.h>
+
+static void test_array(void)
+{
+	ARRAY_DEFINE(intarr, int);
+	int input[] = { -1234567890, -272585721, 2724859223, 824725652 };
+	const int *output;
+	unsigned int i, j;
+	bool success = TRUE;
+
+	t_array_init(&intarr, 5);
+	for (i = 0; i < N_ELEMENTS(input); i++) {
+		array_clear(&intarr);
+		array_append(&intarr, input, i);
+		array_reverse(&intarr);
+
+		output = i == 0 ? NULL : array_idx(&intarr, 0);
+		for (j = 0; j < i; j++) {
+			if (input[i-j-1] != output[j]) {
+				success = FALSE;
+				break;
+			}
+		}
+	}
+	test_out("array_reverse()", success);
+}
 
 static void test_base64_encode(void)
 {
@@ -720,6 +745,7 @@ int main(void)
 int main(void)
 {
 	static void (*test_functions[])(void) = {
+		test_array,
 		test_aqueue,
 		test_base64_encode,
 		test_base64_decode,


More information about the dovecot-cvs mailing list