Removing array elements

Just the usual includes:

#include <stdio.h>
#include <string.h>
#include <Eina.h>
Eina.h
Eina Utility library.

This is the callback we are going to use to decide which strings stay on the array and which will be removed. We use something simple, but this can be as complex as you like:

Eina_Bool keep(void *data, void *gdata EINA_UNUSED)
{
if (strlen((const char*)data) <= 5)
return EINA_TRUE;
return EINA_FALSE;
}
EINA_TRUE
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition eina_types.h:539
EINA_FALSE
#define EINA_FALSE
boolean value FALSE (numerical value 0)
Definition eina_types.h:533
Eina_Bool
unsigned char Eina_Bool
Type to mimic a boolean.
Definition eina_types.h:527
EINA_UNUSED
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition eina_types.h:339

This is the same code we used before to populate the list with the slight difference of not using strdup:

int
main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
const char* strs[] = {
"one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
"ten", "eleven", "twelve", "thirteen", "fourtenn", "fifteen", "sixteen",
"seventeen", "eighteen", "nineteen", "twenty"
};
const char* strings[] = {
"helo", "hera", "starbuck", "kat", "boomer",
"hotdog", "longshot", "jammer", "crashdown", "hardball",
"duck", "racetrack", "apolo", "husker", "freaker",
"skulls", "bulldog", "flat top", "hammerhead", "gonzo"
};
Eina_Array *array;
Eina_Array_Iterator iterator;
const char *item;
unsigned int i;
eina_init();
array = eina_array_new(10);
for (i = 0; i < 20; i++)
eina_array_push(array, strs[i]);
Eina_Array_Iterator
void ** Eina_Array_Iterator
Type for an iterator on arrays, used with EINA_ARRAY_ITER_NEXT.
Definition eina_array.h:222
Eina_Array
struct _Eina_Array Eina_Array
Type for a generic one-dimensional linear data structure.
Definition eina_array.h:216
eina_array_push
static Eina_Bool eina_array_push(Eina_Array *array, const void *data)
Appends a data item to an array.
eina_array_new
EINA_API Eina_Array * eina_array_new(unsigned int step)
Creates a new array.
Definition eina_array.c:276
eina_init
EINA_API int eina_init(void)
Initializes the Eina library.
Definition eina_main.c:291

So we have added all our elements to the array, but it turns out that is not the elements we wanted, so let's empty the array and add the correct strings:

eina_array_clean(array);
for (i = 0; i < 20; i++)
eina_array_push(array, strings[i]);
eina_array_clean
static void eina_array_clean(Eina_Array *array)
Clears an array of its elements, without deallocating memory.

It seems we made a little mistake in one of our strings so we need to replace it, here is how:

eina_array_data_set(array, 17, "flattop");
eina_array_data_set
static void eina_array_data_set(const Eina_Array *array, unsigned int idx, const void *data)
Sets the data at a given position in an array.

Now that there is a populated array we can remove elements from it easily:

eina_array_remove(array, keep, NULL);
eina_array_remove
EINA_API Eina_Bool eina_array_remove(Eina_Array *array, Eina_Bool(*keep)(void *data, void *gdata), void *gdata)
Rebuilds an array by specifying the data to keep.
Definition eina_array.c:346

And check that the elements were actually removed:

EINA_ARRAY_ITER_NEXT(array, i, item, iterator)
printf("item #%u: %s\n", i, item);
EINA_ARRAY_ITER_NEXT
#define EINA_ARRAY_ITER_NEXT(array, index, item, iterator)
Iterates through an array's elements.
Definition eina_array.h:507

Since this time we didn't use strdup we don't need to free each string:

eina_array_free(array);
eina_shutdown();
return 0;
}
eina_array_free
EINA_API void eina_array_free(Eina_Array *array)
Frees an array.
Definition eina_array.c:295
eina_shutdown
EINA_API int eina_shutdown(void)
Shuts down the Eina library.
Definition eina_main.c:379

The full source code can be found in the examples folder in the eina_array_02.c file.