Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7858:69c1e3e13464 HEAD
Added array_reverse().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 13 Jun 2008 04:36:19 +0300 |
parents | 63df79ccfedb |
children | f431c67621ed |
files | src/lib/array.c src/lib/array.h src/tests/test-lib.c |
diffstat | 3 files changed, 63 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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_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 @@ 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); + } +}
--- 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 @@ #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
--- 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 @@ -15,6 +15,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) { static const char *input[] = { @@ -720,6 +745,7 @@ int main(void) { static void (*test_functions[])(void) = { + test_array, test_aqueue, test_base64_encode, test_base64_decode,