]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added array_reverse().
authorTimo Sirainen <tss@iki.fi>
Fri, 13 Jun 2008 01:36:19 +0000 (04:36 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 13 Jun 2008 01:36:19 +0000 (04:36 +0300)
--HG--
branch : HEAD

src/lib/array.c
src/lib/array.h
src/tests/test-lib.c

index 0fecc9e437bca710de8daf19cf23c11787481f92..08004a0cf9d2f9d8e10d7a1338a8840e2b906a85 100644 (file)
@@ -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);
+       }
+}
index 0302ef2c7d1464ed3fe3546ad94d58b85452a14e..d384c2725da6cec6b4c8d9ae74683f0fd42cdff1 100644 (file)
@@ -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
index 1c82f8ff7a0b2ced642c5ea933ed8e75b92dee1c..4ef592b4a786dfd1fcf51602b0b5f7036554bcd6 100644 (file)
 #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 @@ static void test_utc_mktime(void)
 int main(void)
 {
        static void (*test_functions[])(void) = {
+               test_array,
                test_aqueue,
                test_base64_encode,
                test_base64_decode,