dovecot-1.1: Added array_reverse().
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jun 13 04:39:54 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/7f7de0ca30c5
changeset: 7658:7f7de0ca30c5
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 a81b260ff47e -r 7f7de0ca30c5 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 a81b260ff47e -r 7f7de0ca30c5 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 a81b260ff47e -r 7f7de0ca30c5 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