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