dynarray: Add PA_DYNARRAY_FOREACH 45/21945/1
authorTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Thu, 19 Dec 2013 19:29:50 +0000 (21:29 +0200)
committerIsmo Puustinen <ismo.puustinen@intel.com>
Wed, 28 May 2014 09:40:03 +0000 (12:40 +0300)
The PA_DYNARRAY_FOREACH macro requires that pa_dynarray_get() returns
NULL if the index is out of bounds.

Change-Id: If9db312516fbb079e8b67d94d35a44783ab3395a
Signed-off-by: Jaska Uimonen <jaska.uimonen@intel.com>
src/pulsecore/dynarray.c
src/pulsecore/dynarray.h
src/pulsecore/tokenizer.c

index b65fb62..8dd8fab 100644 (file)
@@ -74,7 +74,9 @@ void pa_dynarray_append(pa_dynarray *array, void *p) {
 
 void *pa_dynarray_get(pa_dynarray *array, unsigned i) {
     pa_assert(array);
-    pa_assert(i < array->n_entries);
+
+    if (i >= array->n_entries)
+        return NULL;
 
     return array->data[i];
 }
index 078acec..65030f2 100644 (file)
@@ -48,6 +48,8 @@ pa_dynarray* pa_dynarray_new(pa_free_cb_t free_cb);
 void pa_dynarray_free(pa_dynarray *array);
 
 void pa_dynarray_append(pa_dynarray *array, void *p);
+
+/* Returns NULL if i is out of bounds. */
 void *pa_dynarray_get(pa_dynarray *array, unsigned i);
 
 /* Returns the removed item, or NULL if the array is empty. */
@@ -56,4 +58,7 @@ void *pa_dynarray_steal_last(pa_dynarray *array);
 unsigned pa_dynarray_size(pa_dynarray *array);
 void * const *pa_dynarray_get_raw_array(pa_dynarray *array);
 
+#define PA_DYNARRAY_FOREACH(elem, array, idx) \
+    for ((idx) = 0; ((elem) = pa_dynarray_get(array, idx)); (idx)++)
+
 #endif
index 4c610e8..d71a7da 100644 (file)
@@ -80,8 +80,5 @@ const char *pa_tokenizer_get(pa_tokenizer *t, unsigned i) {
 
     pa_assert(a);
 
-    if (i >= pa_dynarray_size(a))
-        return NULL;
-
     return pa_dynarray_get(a, i);
 }