annotate src/lib/array.c @ 23007:36e01285b5b8

lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 18 Mar 2019 00:52:37 +0100
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
9490
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
6
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 void *array_idx_modifiable_i(struct array *array, unsigned int idx)
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 {
18129
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
9 return buffer_get_space_unsafe(array->buffer, idx * array->element_size,
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
10 array->element_size);
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 }
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 void array_idx_set_i(struct array *array, unsigned int idx, const void *data)
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
18129
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
15 buffer_write(array->buffer, idx * array->element_size,
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
16 data, array->element_size);
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 }
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 void array_idx_clear_i(struct array *array, unsigned int idx)
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 {
18129
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
21 buffer_write_zero(array->buffer, idx * array->element_size,
0d870753d9ab lib: Small optimization / unnecessary code removal from array_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 18111
diff changeset
22 array->element_size);
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 }
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
7858
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
25 void *array_insert_space_i(struct array *array, unsigned int idx)
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
26 {
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
27 void *data;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
28 size_t pos;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
29
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
30 pos = idx * array->element_size;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
31 buffer_copy(array->buffer, pos + array->element_size,
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
32 array->buffer, pos, (size_t)-1);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
33
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
34 data = buffer_get_space_unsafe(array->buffer, pos, array->element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
35 memset(data, 0, array->element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
36 return data;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
37 }
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
38
7857
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 bool array_cmp_i(const struct array *array1, const struct array *array2)
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 {
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 if (!array_is_created_i(array1) || array1->buffer->used == 0)
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 return !array_is_created_i(array2) || array2->buffer->used == 0;
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 if (!array_is_created_i(array2))
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 return FALSE;
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 return buffer_cmp(array1->buffer, array2->buffer);
63df79ccfedb Uninlined some of the more complex array functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
7858
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
49
18111
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
50 bool array_equal_fn_i(const struct array *array1, const struct array *array2,
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
51 int (*cmp)(const void *, const void*))
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
52 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
53 unsigned int count1, count2, i;
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
54 size_t size;
18111
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
55
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
56 if (!array_is_created_i(array1) || array1->buffer->used == 0)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
57 return !array_is_created_i(array2) || array2->buffer->used == 0;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
58
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
59 if (!array_is_created_i(array2))
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
60 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
61
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
62 count1 = array_count_i(array1); count2 = array_count_i(array2);
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
63 if (count1 != count2)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
64 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
65
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
66 size = array1->element_size;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
67 i_assert(size == array2->element_size);
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
68
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
69 for (i = 0; i < count1; i++) {
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
70 if (cmp(CONST_PTR_OFFSET(array1->buffer->data, i * size),
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
71 CONST_PTR_OFFSET(array2->buffer->data, i * size)) != 0)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
72 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
73 }
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
74 return TRUE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
75 }
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
76
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
77 bool array_equal_fn_ctx_i(const struct array *array1, const struct array *array2,
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
78 int (*cmp)(const void *, const void *, const void *),
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
79 const void *context)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
80 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
81 unsigned int count1, count2, i;
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
82 size_t size;
18111
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
83
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
84 if (!array_is_created_i(array1) || array1->buffer->used == 0)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
85 return !array_is_created_i(array2) || array2->buffer->used == 0;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
86
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
87 if (!array_is_created_i(array2))
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
88 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
89
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
90 count1 = array_count_i(array1); count2 = array_count_i(array2);
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
91 if (count1 != count2)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
92 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
93
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
94 size = array1->element_size;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
95 i_assert(size == array2->element_size);
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
96
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
97 for (i = 0; i < count1; i++) {
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
98 if (cmp(CONST_PTR_OFFSET(array1->buffer->data, i * size),
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
99 CONST_PTR_OFFSET(array2->buffer->data, i * size), context) != 0)
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
100 return FALSE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
101 }
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
102 return TRUE;
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
103 }
b8ac4e5a1002 lib: array - element-wise comparison via callback
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
104
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7858
diff changeset
105 void array_reverse_i(struct array *array)
7858
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
106 {
14526
2f776ca73cef Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
107 const size_t element_size = array->element_size;
7858
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
108 unsigned int i, count = array_count_i(array);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
109 size_t size;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
110 void *data, *tmp;
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
111
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
112 data = buffer_get_modifiable_data(array->buffer, &size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
113 tmp = t_buffer_get(array->element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
114 for (i = 0; i+1 < count; i++, count--) {
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
115 memcpy(tmp, PTR_OFFSET(data, i * element_size), element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
116 memcpy(PTR_OFFSET(data, i * element_size),
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
117 PTR_OFFSET(data, (count-1) * element_size),
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
118 element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
119 memcpy(PTR_OFFSET(data, (count-1) * element_size), tmp,
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
120 element_size);
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
121 }
69c1e3e13464 Added array_reverse().
Timo Sirainen <tss@iki.fi>
parents: 7857
diff changeset
122 }
9490
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
123
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
124 void array_sort_i(struct array *array, int (*cmp)(const void *, const void *))
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
125 {
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
126 unsigned int count;
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
127
14526
2f776ca73cef Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
128 count = array_count_i(array);
19513
74850147fc47 lib: Avoid passing NULL to qsort() or bsearch() on empty array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19191
diff changeset
129 if (count == 0)
74850147fc47 lib: Avoid passing NULL to qsort() or bsearch() on empty array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19191
diff changeset
130 return;
9490
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
131 qsort(buffer_get_modifiable_data(array->buffer, NULL),
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
132 count, array->element_size, cmp);
a6e1f054a808 Added array_sort() for type-safe array sorting.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
133 }
9607
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
134
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
135 void *array_bsearch_i(struct array *array, const void *key,
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
136 int (*cmp)(const void *, const void *))
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
137 {
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
138 unsigned int count;
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
139
14526
2f776ca73cef Code cleanup: Use array_count_i() to calculate array's size internally.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
140 count = array_count_i(array);
9607
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
141 return bsearch(key, array->buffer->data,
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
142 count, array->element_size, cmp);
55690917fefb Added type safe array_bsearch().
Timo Sirainen <tss@iki.fi>
parents: 9490
diff changeset
143 }
18132
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
144
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
145 const void *array_lsearch_i(const struct array *array, const void *key,
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
146 int (*cmp)(const void *, const void *))
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
147 {
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
148 const void * const data = buffer_get_data(array->buffer, NULL);
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
149 const size_t s = array->element_size;
18132
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
150 unsigned int idx;
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
151
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
152 for (idx = 0; idx < array_count_i(array); idx++) {
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
153 if (cmp(key, CONST_PTR_OFFSET(data, idx * s)) == 0) {
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
154 return PTR_OFFSET(data, idx * s);
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
155 }
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
156 }
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
157
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
158 return NULL;
1bbec03202e0 lib: array - new linear search helper
Phil Carmody <phil@dovecot.fi>
parents: 18129
diff changeset
159 }