#include <stdio.h>
#include <string.h>
#include "array.h"
#define ARRAY_SIZE 5
#define BUFFER_SIZE 32
struct s_data {
char *s;
int size;
};
int copy_data(void *src, void *dest)
{
struct s_data *from, *to;
from = (struct s_data*)src;
to = (struct s_data*)dest;
if (to->s != NULL) { free(to->s); }
to->s = (char*)malloc((strlen(from->s)+1)*sizeof(char));
if (to->s == NULL) { return 1; }
strcpy (to->s, from->s);
to->size = strlen(to->s);
return 0;
}
int remove_data(void *target)
{
struct s_data *location;
location = (struct s_data*)target;
if (location->s != NULL) { free (location->s); location->s = NULL; }
location->size = 0;
return 0;
}
int compare(void *d1, void *d2)
{
struct s_data *data1, *data2;
data1 = (struct s_data*)d1;
data2 = (struct s_data*)d2;
if (strcmp (data1->s, data2->s) < 0) { return -1; }
if (strcmp (data1->s, data2->s) == 0) { return 0; }
if (strcmp (data1->s, data2->s) > 0) { return 1; }
return -2;
}
void* get_index(void *start, int idx)
{
struct s_data *s;
s = (struct s_data*)start;
return (void*)(s+idx);
}
int init_data (void *data)
{
struct s_data *d;
d = (struct s_data*)data;
d->s = NULL;
d->size = 0;
return 0;
}
int main (int argc, char *argv[])
{
struct s_data datas[ARRAY_SIZE], data;
Array my_array;
char buffer[BUFFER_SIZE];
int i;
if (array_init (
&my_array,
(void*)datas,
ARRAY_SIZE,
copy_data,
remove_data,
compare,
get_index,
init_data
) == -1)
{
fprintf (stderr, "\nERROR: Can not allocate memory!\n");
return 1;
}
array_init_element (&my_array);
fprintf (stdout, "\nPutting data into the array");
fprintf (stdout, "\n---------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
i = 1;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
while (array_add(&my_array, (void*)&data) != -1)
{
fprintf (stdout, "[%d:%s] ", array_number_of_elements(my_array), data.s); fflush (stdout);
i *= 10;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
}
fprintf (stdout, "\n"); fflush (stdout);
fprintf (stdout, "\nPrinting the entire array");
fprintf (stdout, "\n-------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
for (i=0; i<ARRAY_SIZE; i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n"); fflush (stdout);
fprintf (stdout, "\nRemoving elements from the array");
fprintf (stdout, "\n--------------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
fprintf (stdout, "Removing element which index is 1 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 1!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 0 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 0) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 2 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 2) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 2!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 0 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 0) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 0 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 0) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "\nPutting data into the array");
fprintf (stdout, "\n---------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
i = 1;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
while (array_add(&my_array, (void*)&data) != -1)
{
fprintf (stdout, "[%d:%s] ", array_number_of_elements(my_array), data.s); fflush (stdout);
i *= 10;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
}
fprintf (stdout, "\n"); fflush (stdout);
fprintf (stdout, "\nInserting data into the array");
fprintf (stdout, "\n-----------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
fprintf (stdout, "Removing element which index is 1 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 1!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (1) at index 0\n");
i = 1;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 0, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 1 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 1!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (15) at index 1\n");
i = 15;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 1, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 1 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 1!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (155) at index 3\n");
i = 155;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 3, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Removing element which index is 1 (%d elements):\n", array_number_of_elements(my_array));
if (array_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: Can not remove the element which index is 1!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (157) at index 2\n");
i = 157;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 2, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "\nRemoving a list of elements (elements index 1,2,3)");
fprintf (stdout, "\n--------------------------------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
if (array_schedule_for_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [1] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 2) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [1] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 3) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [1] for removing!\n");
return 1;
}
if (array_rem_all (&my_array) == -1)
{
fprintf (stderr, "\nERROR: error while removing scheduled elements!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "\nAdding 3 elements (for more tests");
fprintf (stdout, "\n---------------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
fprintf (stdout, "inserting data (157) at index 1\n");
i = 157;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 1, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (1571) at index 1\n");
i = 1571;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 1, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "inserting data (1572) at index 1\n");
i = 1572;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
if (array_insert (&my_array, 1, (void*)&data) == -1)
{
fprintf (stderr, "\nERROR: Can not insert element at index 0!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "\nSearcing for elements (for more tests");
fprintf (stdout, "\n-------------------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
fprintf (stdout, "Searching for element 1572\n"); fflush (stdout);
i = 1572;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
i = array_find (&my_array, &data);
if (i == -1)
{ fprintf (stdout, "NOT found"); fflush (stdout); }
else
{ fprintf (stdout, "found at index %d", i); fflush (stdout); }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Searching for element 123\n"); fflush (stdout);
i = 123;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
i = array_find (&my_array, &data);
if (i == -1)
{ fprintf (stdout, "NOT found"); fflush (stdout); }
else
{ fprintf (stdout, "found at index %d", i); fflush (stdout); }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "Searching for element 10000\n"); fflush (stdout);
i = 10000;
sprintf (buffer, "%d", i);
data.s = buffer;
data.size = strlen(data.s);
i = array_find (&my_array, &data);
if (i == -1)
{ fprintf (stdout, "NOT found"); fflush (stdout); }
else
{ fprintf (stdout, "found at index %d", i); fflush (stdout); }
fprintf (stdout, "\n\n"); fflush (stdout);
fprintf (stdout, "\nRemoving a list of elements (elements index 0,1,2,3,4)");
fprintf (stdout, "\n------------------------------------------------------");
fprintf (stdout, "\n\n");
fflush (stdout);
if (array_schedule_for_rem (&my_array, 0) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [0] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 1) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [1] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 2) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [2] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 3) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [3] for removing!\n");
return 1;
}
if (array_schedule_for_rem (&my_array, 4) == -1)
{
fprintf (stderr, "\nERROR: error while scheduling element [4] for removing!\n");
return 1;
}
if (array_rem_all (&my_array) == -1)
{
fprintf (stderr, "\nERROR: error while removing scheduled elements!\n");
return 1;
}
for (i=0; i<array_number_of_elements(my_array); i++)
{ if (datas[i].s != NULL) { fprintf (stdout, "%s ", datas[i].s); fflush (stdout); } }
fprintf (stdout, "\n\n"); fflush (stdout);
array_free (&my_array);
return 0;
}