Added debugging code for dumping data from memory using GUI.
[familia.git] / src / storage / family.c
1 #include <stdlib.h>
2
3 #include "family.h"
4 #include "individual.h"
5
6 #include "../debug.h"
7
8 struct familia_family * familia_family_new()
9 {
10         struct familia_family * family = NULL;
11         family = malloc(sizeof(struct familia_family));
12
13         if (!family) {
14                 debug("["__FILE__ "] There was a problem with allocating memory for family.\n");
15                 return NULL;
16         }
17
18         family->id = 0;
19         family->individual1 = NULL;
20         family->individual2 = NULL;
21
22         family->children = NULL;
23         family->children_no = 0;
24
25         return family;
26 }
27
28 void familia_family_free(struct familia_family * family)
29 {
30         family->individual1 = NULL;
31         family->individual2 = NULL;
32
33         if (family->children) {
34                 int i = 0;
35                 /* Remove all children links. */
36                 for (; i < family->children_no; i++) {
37                         family->children[i] = NULL;
38                 }
39                 free(family->children);
40                 family->children = NULL;
41                 family->children_no = 0;
42         }
43
44         free(family);
45 }
46
47 void familia_family_set_individual(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index)
48 {
49         switch (index) {
50         case Individual1:
51                 family->individual1 = individual;
52                 break;
53         case Individual2:
54                 family->individual2 = individual;
55                 break;
56         }
57 }
58
59 struct familia_individual * familia_family_get_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
60 {
61         struct familia_individual * individual = NULL;
62
63         switch (index) {
64         case Individual1:
65                 individual = family->individual1;
66         case Individual2:
67                 individual = family->individual2;
68         }
69
70         return individual;
71 }
72
73 struct familia_individual * familia_family_remove_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
74 {
75         struct familia_individual * individual = NULL;
76
77         switch (index) {
78         case Individual1:
79                 individual = family->individual1;
80                 family->individual1 = NULL;
81         case Individual2:
82                 individual = family->individual2;
83                 family->individual2 = NULL;
84         }
85
86         return individual;
87 }
88
89 void familia_family_add_child(struct familia_family * family, struct familia_individual * individual)
90 {
91         struct familia_individual ** tmp = NULL;
92         int size = (family->children_no + 1);
93
94         tmp = realloc(family->children, size * sizeof(struct familia_individual *));
95
96         if (tmp) {
97                 /* TODO: Add children by their age */
98                 family->children = tmp;
99                 family->children[family->children_no] = individual;
100                 family->children_no++;
101                 familia_individual_set_parents(individual, family);
102         }
103         else {
104                 debug("There were problems with allocating memory for family children.\n");
105         }
106 }
107
108 struct familia_individual * familia_family_get_child_by_id(struct familia_family * family, unsigned short index)
109 {
110         struct familia_individual * child = NULL;
111
112         if (index < family->children_no) {
113                 child = family->children[index];
114         }
115
116         return child;
117 }
118
119 struct familia_individual * familia_family_remove_child_by_id(struct familia_family * family, unsigned short index)
120 {
121         struct familia_individual * child = NULL;
122
123         child = familia_family_get_child_by_id(family, index);
124
125         if (child) {
126                 int i = index;
127                 family->children[index] = NULL;
128
129                 for (; i < family->children_no - 1; i++) {
130                         family->children[i] = family->children[i + 1];
131                 }
132
133                 family->children[--(family->children_no)] = NULL;
134         }
135
136         return child;
137 }