#include <stdlib.h>
#include "family.h"
+#include "individual.h"
#include "../debug.h"
family->individual1 = NULL;
family->individual2 = NULL;
+ family->children = NULL;
+ family->children_no = 0;
+
return 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);
}
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;
}