extern "C" {
#endif
+static unsigned util_dynarray_is_data_stack_allocated;
+
/* A zero-initialized version of this is guaranteed to represent an
* empty array.
*
}
static inline void
+util_dynarray_init_from_stack(struct util_dynarray *buf, void *data, unsigned capacity)
+{
+ memset(buf, 0, sizeof(*buf));
+ buf->mem_ctx = &util_dynarray_is_data_stack_allocated;
+ buf->data = data;
+ buf->capacity = capacity;
+}
+
+static inline void
util_dynarray_fini(struct util_dynarray *buf)
{
if (buf->data) {
- if (buf->mem_ctx) {
+ if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated) {
+ } else if (buf->mem_ctx) {
ralloc_free(buf->data);
} else {
free(buf->data);
unsigned capacity = MAX3(DYN_ARRAY_INITIAL_SIZE, buf->capacity * 2, newcap);
void *data;
- if (buf->mem_ctx) {
+ if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated) {
+ data = malloc(capacity);
+ if (data) {
+ memcpy(data, buf->data, buf->size);
+ buf->mem_ctx = NULL;
+ }
+ } else if (buf->mem_ctx) {
data = reralloc_size(buf->mem_ctx, buf->data, capacity);
} else {
data = realloc(buf->data, capacity);
static inline void
util_dynarray_trim(struct util_dynarray *buf)
{
+ if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated)
+ return;
+
if (buf->size != buf->capacity) {
if (buf->size) {
if (buf->mem_ctx) {