X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=src%2Fstorage%2Ffamily.c;h=1508cd929446ebc4f0fb9ec87114c6945586d82d;hb=316265277d8e381c76496643edd3285fbfd5b244;hp=e08223cd2a15eebb684c1b340aa2f0549d9c2d21;hpb=094bc471373afa79a63c024909d57261fef00b2f;p=familia.git diff --git a/src/storage/family.c b/src/storage/family.c index e08223c..1508cd9 100644 --- a/src/storage/family.c +++ b/src/storage/family.c @@ -1,6 +1,7 @@ #include #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; }