2 * Copyright (c) 2009 The NetBSD Foundation, Inc.
5 * This code is derived from software contributed to The NetBSD Foundation
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
41 a
= malloc(sizeof(*a
));
49 array_destroy(struct array
*a
)
56 array_init(struct array
*a
)
63 array_cleanup(struct array
*a
)
65 arrayassert(a
->num
== 0);
73 array_setsize(struct array
*a
, unsigned num
)
80 while (num
> newmax
) {
81 newmax
= newmax
? newmax
*2 : 4;
83 newptr
= realloc(a
->v
, newmax
*sizeof(*a
->v
));
95 array_insert(struct array
*a
, unsigned index_
)
99 arrayassert(a
->num
<= a
->max
);
100 arrayassert(index_
< a
->num
);
102 movers
= a
->num
- index_
;
104 if (array_setsize(a
, a
->num
+ 1)) {
108 memmove(a
->v
+ index_
+1, a
->v
+ index_
, movers
*sizeof(*a
->v
));
113 array_remove(struct array
*a
, unsigned index_
)
117 arrayassert(a
->num
<= a
->max
);
118 arrayassert(index_
< a
->num
);
120 movers
= a
->num
- (index_
+ 1);
121 memmove(a
->v
+ index_
, a
->v
+ index_
+1, movers
*sizeof(*a
->v
));