]>
git.ipfire.org Git - thirdparty/kmod.git/blob - shared/array.c
865b3e8258e33f0969a867aa3087e59558fa2360
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, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 #include <shared/array.h>
30 /* basic pointer array growing in steps */
33 static int array_realloc(struct array
*array
, size_t new_total
)
35 void *tmp
= realloc(array
->array
, sizeof(void *) * new_total
);
39 array
->total
= new_total
;
43 void array_init(struct array
*array
, size_t step
)
52 int array_append(struct array
*array
, const void *element
)
56 if (array
->count
+ 1 >= array
->total
) {
57 int r
= array_realloc(array
, array
->total
+ array
->step
);
62 array
->array
[idx
] = (void *)element
;
67 int array_append_unique(struct array
*array
, const void *element
)
69 void **itr
= array
->array
;
70 void **itr_end
= itr
+ array
->count
;
71 for (; itr
< itr_end
; itr
++)
74 return array_append(array
, element
);
77 void array_pop(struct array
*array
) {
79 if (array
->count
+ array
->step
< array
->total
) {
80 int r
= array_realloc(array
, array
->total
- array
->step
);
86 void array_free_array(struct array
*array
) {
93 void array_sort(struct array
*array
, int (*cmp
)(const void *a
, const void *b
))
95 qsort(array
->array
, array
->count
, sizeof(void *), cmp
);
98 int array_remove_at(struct array
*array
, unsigned int pos
)
100 if (array
->count
<= pos
)
104 if (pos
< array
->count
)
105 memmove(array
->array
+ pos
, array
->array
+ pos
+ 1,
106 sizeof(void *) * (array
->count
- pos
));
108 if (array
->count
+ array
->step
< array
->total
) {
109 int r
= array_realloc(array
, array
->total
- array
->step
);