More generic use of event.
[familia.git] / src / storage / family.c
index e08223cd2a15eebb684c1b340aa2f0549d9c2d21..6e53a6a34ccef3e294bebe8aa4bd2d8b90b709ef 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 
 #include "family.h"
+#include "individual.h"
 
 #include "../debug.h"
 
@@ -18,6 +19,9 @@ struct familia_family * familia_family_new()
        family->individual1 = NULL;
        family->individual2 = NULL;
 
+       family->children = NULL;
+       family->children_no = 0;
+
        return family;
 }
 
@@ -26,10 +30,21 @@ void familia_family_free(struct familia_family * family)
        family->individual1 = NULL;
        family->individual2 = NULL;
 
+       if (family->children) {
+               int i = 0;
+               /* Remove all children links. */
+               for (; i < family->children_no; i++) {
+                       family->children[i] = NULL;
+               }
+               free(family->children);
+               family->children = NULL;
+               family->children_no = 0;
+       }
+
        free(family);
 }
 
-void familia_family_set_individual(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index)
+void familia_family_set_parent(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index)
 {
        switch (index) {
        case Individual1:
@@ -41,23 +56,84 @@ void familia_family_set_individual(struct familia_family * family, struct famili
        }
 }
 
-struct familia_individual * familia_family_get_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
+struct familia_individual * familia_family_get_parent(struct familia_family * family, enum FFamilyIndividualIndex index)
 {
+       struct familia_individual * individual = NULL;
+
        switch (index) {
        case Individual1:
-               return family->individual1;
+               individual = family->individual1;
+               break;
        case Individual2:
-               return family->individual2;
+               individual = family->individual2;
+               break;
        }
-       return NULL;
+
+       return individual;
 }
 
-struct familia_individual * familia_family_remove_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
+struct familia_individual * familia_family_remove_parent(struct familia_family * family, enum FFamilyIndividualIndex index)
 {
+       struct familia_individual * individual = NULL;
+
        switch (index) {
        case Individual1:
+               individual = family->individual1;
                family->individual1 = NULL;
        case Individual2:
+               individual = family->individual2;
                family->individual2 = NULL;
        }
+
+       return individual;
+}
+
+void familia_family_add_child(struct familia_family * family, struct familia_individual * individual)
+{
+       struct familia_individual ** tmp = NULL;
+       int size = (family->children_no + 1);
+
+       tmp = realloc(family->children, size * sizeof(struct familia_individual *));
+
+       if (tmp) {
+               /* TODO: Add children by their age */
+               family->children = tmp;
+               family->children[family->children_no] = individual;
+               family->children_no++;
+/*             familia_individual_set_parents(individual, family);*/
+       }
+       else {
+               debug("There were problems with allocating memory for family children.\n");
+       }
+}
+
+struct familia_individual * familia_family_get_child_by_id(struct familia_family * family, unsigned short index)
+{
+       struct familia_individual * child = NULL;
+
+       if (index < family->children_no) {
+               child = family->children[index];
+       }
+
+       return child;
+}
+
+struct familia_individual * familia_family_remove_child_by_id(struct familia_family * family, unsigned short index)
+{
+       struct familia_individual * child = NULL;
+
+       child = familia_family_get_child_by_id(family, index);
+
+       if (child) {
+               int i = index;
+               family->children[index] = NULL;
+
+               for (; i < family->children_no - 1; i++) {
+                       family->children[i] = family->children[i + 1];
+               }
+
+               family->children[--(family->children_no)] = NULL;
+       }
+
+       return child;
 }