Basic array usage

For this example we add stdlib.h, stdio.h and string.h for some convenience functions. The first thing to do to be able to use an Eina_Array is to include Eina.h:

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

Here we have a callback that prints the element given to it:

static Eina_Bool
_print(const void *container EINA_UNUSED, void *data, void *fdata EINA_UNUSED)
{
printf("%s\n", (char *)data);
return EINA_TRUE;
}
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition: eina_types.h:539
unsigned char Eina_Bool
Type to mimic a boolean.
Definition: eina_types.h:527
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition: eina_types.h:339

Now we create our entry point and declare some variables, nothing special:

int
main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
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;
unsigned int i;
Type for an array of data.
Definition: eina_array.h:229

Before we can start using any array function we need to initialize eina:

EINA_API int eina_init(void)
Initializes the Eina library.
Definition: eina_main.c:291

So now to actually create our array. The interesting thing here is the argument given to the eina_array_new() function. This argument sets how fast the array grows.

array = eina_array_new(10);
EINA_API Eina_Array * eina_array_new(unsigned int step)
Creates a new array.
Definition: eina_array.c:276

If you know before hand how big the array will need to be you should set the step to that. In our case we can set it to the number of strings we have and since we didn't do that in the eina_array_new() we can do it now:

eina_array_step_set(array, sizeof(*array), 20);
EINA_API void eina_array_step_set(Eina_Array *array, unsigned int sizeof_eina_array, unsigned int step)
Sets the step of an array.
Definition: eina_array.c:305

Now let us populate our array with some strings:

for (i = 0; i < 20; i++)
eina_array_push(array, strdup(strings[i]));
static Eina_Bool eina_array_push(Eina_Array *array, const void *data)
Appends a data item to an array.
Note
Notice we use strdup, so we will have to free that memory later on.

Now lets check the size of the array:

printf("array count: %d\n", eina_array_count(array));
static unsigned int eina_array_count(const Eina_Array *array)
Returns the number of elements in an array.

And now we call a function on every member of our array to print it:

eina_array_foreach(array, _print, NULL);
static Eina_Bool eina_array_foreach(Eina_Array *array, Eina_Each_Cb cb, void *fdata)
Iterates over an array using a callback function.

One of the strengths of Eina_Array over Eina_List is that it has very fast random access to elements, so this is very efficient:

printf("Top gun: %s\n", (char*)eina_array_data_get(array, 2));
static void * eina_array_data_get(const Eina_Array *array, unsigned int idx)
Returns the data at a given position in an array.

And now we free up the memory allocated with the strdup()s:

while (eina_array_count(array))
free(eina_array_pop(array));
static void * eina_array_pop(Eina_Array *array)
Removes the last data item in an array.

And the array memory itself:

EINA_API void eina_array_free(Eina_Array *array)
Frees an array.
Definition: eina_array.c:295

And finally shutdown eina and exit:

return 0;
}
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_01.c file.