f3806096d1f4923623e3e92ce1f2fc62927f7667
[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                 family->children = tmp;
97                 family->children[family->children_no] = individual;
98                 family->children_no++;
99         }
100         else {
101                 debug("There were problems with allocating memory for family children.\n");
102         }
103 }
104
105 struct familia_individual * familia_family_get_child_by_id(struct familia_family * family, unsigned short index)
106 {
107         struct familia_individual * child = NULL;
108
109         if (index < family->children_no) {
110                 child = family->children[index];
111         }
112
113         return child;
114 }
115
116 struct familia_individual * familia_family_remove_child_by_id(struct familia_family * family, unsigned short index)
117 {
118         struct familia_individual * child = NULL;
119
120         child = familia_family_get_child_by_id(family, index);
121
122         if (child) {
123                 int i = index;
124                 family->children[index] = NULL;
125
126                 for (; i < family->children_no - 1; i++) {
127                         family->children[i] = family->children[i + 1];
128                 }
129
130                 family->children[--(family->children_no)] = NULL;
131         }
132
133         return child;
134 }