From: David Herrmann Date: Tue, 5 Mar 2013 00:21:29 +0000 (+0100) Subject: shl: array: add shl_array_zresize() X-Git-Tag: kmscon-8~61 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b8f58fea9caed09cfbceea713389a93b02d59d42;p=platform%2Fupstream%2Fkmscon.git shl: array: add shl_array_zresize() This helper resizes the array to a given length and zeroes out all new elements. Signed-off-by: David Herrmann --- diff --git a/src/shl_array.h b/src/shl_array.h index e108ca3..9daf409 100644 --- a/src/shl_array.h +++ b/src/shl_array.h @@ -35,6 +35,7 @@ #include #include #include +#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;