shl: array: add shl_array_zresize()
authorDavid Herrmann <dh.herrmann@gmail.com>
Tue, 5 Mar 2013 00:21:29 +0000 (01:21 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Tue, 5 Mar 2013 00:21:29 +0000 (01:21 +0100)
This helper resizes the array to a given length and zeroes out all new
elements.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
src/shl_array.h

index e108ca3..9daf409 100644 (file)
@@ -35,6 +35,7 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
+#include "shl_misc.h"
 
 struct shl_array {
        size_t element_size;
@@ -84,6 +85,32 @@ static inline void shl_array_free(struct shl_array *arr)
        free(arr);
 }
 
+/* resize to length=size and zero out new array entries */
+static inline int shl_array_zresize(struct shl_array *arr, size_t size)
+{
+       void *tmp;
+       size_t newsize;
+
+       if (!arr)
+               return -EINVAL;
+
+       if (size > arr->size) {
+               newsize = shl_next_pow2(size);
+               tmp = realloc(arr->data, arr->element_size * newsize);
+               if (!tmp)
+                       return -ENOMEM;
+
+               arr->data = tmp;
+               arr->size = newsize;
+
+               memset(((uint8_t*)arr->data) + arr->element_size * arr->length,
+                      0, arr->element_size * (size - arr->length));
+       }
+
+       arr->length = size;
+       return 0;
+}
+
 static inline int shl_array_push(struct shl_array *arr, const void *data)
 {
        void *tmp;