Automatically set parent family in individual, when adding child to the family.
[familia.git] / src / storage / family.c
index e08223cd2a15eebb684c1b340aa2f0549d9c2d21..1508cd929446ebc4f0fb9ec87114c6945586d82d 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,6 +30,17 @@ 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);
 }
 
@@ -43,21 +58,80 @@ 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 * individual = NULL;
+
        switch (index) {
        case Individual1:
-               return family->individual1;
+               individual = family->individual1;
        case Individual2:
-               return family->individual2;
+               individual = family->individual2;
        }
-       return NULL;
+
+       return individual;
 }
 
 struct familia_individual * familia_family_remove_individual(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;
 }