]>
git.ipfire.org Git - thirdparty/kmod.git/blob - shared/array.c
2 * libkmod - interface to kernel module operations
4 * Copyright (C) 2011-2013 ProFUSION embedded systems
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
25 #include <shared/array.h>
27 /* basic pointer array growing in steps */
30 static int array_realloc(struct array
*array
, size_t new_total
)
32 void *tmp
= realloc(array
->array
, sizeof(void *) * new_total
);
36 array
->total
= new_total
;
40 void array_init(struct array
*array
, size_t step
)
49 int array_append(struct array
*array
, const void *element
)
53 if (array
->count
+ 1 >= array
->total
) {
54 int r
= array_realloc(array
, array
->total
+ array
->step
);
59 array
->array
[idx
] = (void *)element
;
64 int array_append_unique(struct array
*array
, const void *element
)
66 void **itr
= array
->array
;
67 void **itr_end
= itr
+ array
->count
;
68 for (; itr
< itr_end
; itr
++)
71 return array_append(array
, element
);
74 void array_pop(struct array
*array
) {
76 if (array
->count
+ array
->step
< array
->total
) {
77 int r
= array_realloc(array
, array
->total
- array
->step
);
83 void array_free_array(struct array
*array
) {
90 void array_sort(struct array
*array
, int (*cmp
)(const void *a
, const void *b
))
92 qsort(array
->array
, array
->count
, sizeof(void *), cmp
);
95 int array_remove_at(struct array
*array
, unsigned int pos
)
97 if (array
->count
<= pos
)
101 if (pos
< array
->count
)
102 memmove(array
->array
+ pos
, array
->array
+ pos
+ 1,
103 sizeof(void *) * (array
->count
- pos
));
105 if (array
->count
+ array
->step
< array
->total
) {
106 int r
= array_realloc(array
, array
->total
- array
->step
);