From 7c7bf95aba9c99e31eb2a3b4732b6a765f774436 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 13 Jun 2008 04:36:19 +0300 Subject: [PATCH] Added array_reverse(). --HG-- branch : HEAD --- src/lib/array.c | 33 +++++++++++++++++++++++++++++++++ src/lib/array.h | 4 ++++ src/tests/test-lib.c | 26 ++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/src/lib/array.c b/src/lib/array.c index 0fecc9e437..08004a0cf9 100644 --- a/src/lib/array.c +++ b/src/lib/array.c @@ -41,6 +41,20 @@ void array_idx_clear_i(struct array *array, unsigned int idx) } } +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 *array1, const struct array *array2) 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 --git a/src/lib/array.h b/src/lib/array.h index 0302ef2c7d..d384c2725d 100644 --- a/src/lib/array.h +++ b/src/lib/array.h @@ -221,4 +221,8 @@ bool array_cmp_i(const struct array *array1, const struct array *array2); #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 --git a/src/tests/test-lib.c b/src/tests/test-lib.c index 1c82f8ff7a..4ef592b4a7 100644 --- a/src/tests/test-lib.c +++ b/src/tests/test-lib.c @@ -15,6 +15,31 @@ #include #include +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 @@ static void test_utc_mktime(void) int main(void) { static void (*test_functions[])(void) = { + test_array, test_aqueue, test_base64_encode, test_base64_decode, -- 2.47.3