2 * Copyright (c) 2000-2001
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 void *sameregion data
;
41 size_t nelems
, nalloc
;
44 struct array
*new_array(region r
, size_t initialsize
,
45 size_t typesize
, type_t typeinfo
)
47 struct array
*a
= ralloc(r
, struct array
);
50 a
->data
= typed_rarrayalloc(r
, initialsize
, typesize
, typeinfo
);
51 a
->elemsize
= typesize
;
52 a
->elemtype
= typeinfo
;
54 a
->nalloc
= initialsize
;
59 void *array_extend(struct array
*a
, int by
)
61 size_t oldelems
= a
->nelems
;
64 assert(((unsigned int)-by
) <= a
->nelems
&& by
!= INT_MIN
);
65 else if (a
->nelems
+ by
> a
->nalloc
)
67 size_t newsize
= a
->nalloc
* 2 + by
;
68 void *newdata
= typed_rarrayalloc(a
->r
, newsize
, a
->elemsize
, a
->elemtype
);
70 /* XXX: could work harder to support really large array sizes
71 (this code will fail for a->nalloc >= (max(size_t)-by)/2) */
72 assert(newsize
> a
->nalloc
); /* die when we get really big */
73 typed_rarraycopy(newdata
, a
->data
, a
->nelems
, a
->elemsize
, a
->elemtype
);
79 return (char *)a
->data
+ a
->elemsize
* oldelems
;
82 void array_reset(struct array
*a
)
87 size_t array_length(struct array
*a
)
92 void *array_data(struct array
*a
)