Fixed storage dump display. Changed some variables and function names to more obvious...
[familia.git] / src / storage / individual.c
1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "individual.h"
5
6 #include "../debug.h"
7
8 struct familia_individual * familia_individual_new()
9 {
10         struct familia_individual * individual = NULL;
11         individual = malloc(sizeof(struct familia_individual));
12
13         if (!individual) {
14                 debug("["__FILE__ "] There was a problem with allocating memory for individual.\n");
15                 return NULL;
16         }
17
18         individual->id = 0;
19         individual->first_name = NULL;
20         individual->last_name = NULL;
21         individual->families = NULL;
22         individual->families_no = 0;
23         individual->parents = NULL;
24
25         return individual;
26 }
27
28 void familia_individual_free(struct familia_individual * individual)
29 {
30         unsigned int i = 0;
31
32         if (individual->first_name) {
33                 free(individual->first_name);
34                 individual->first_name = NULL;
35         }
36
37         if (individual->last_name) {
38                 free(individual->last_name);
39                 individual->last_name = NULL;
40         }
41
42         if (individual->families) {
43                 /* Remove all family links. */
44                 for (i = 0; i < individual->families_no; i++) {
45                         individual->families[i] = NULL;
46                 }
47                 free(individual->families);
48                 individual->families = NULL;
49                 individual->families_no = 0;
50         }
51
52         if (individual->parents) {
53                 individual->parents = NULL;
54         }
55
56         free(individual);
57 }
58
59 void familia_individual_set_first_name(struct familia_individual * individual, char * first_name)
60 {
61         /* Remove old data if it exists */
62         if (individual->first_name) {
63                 free(individual->first_name);
64         }
65
66         individual->first_name = malloc(strlen(first_name) + 1);
67
68         /*
69          * Malloc could return null on allocation failure.
70          * Check if memory is allocated correctly and copy string.
71          */
72         if (individual->first_name) {
73                 strcpy(individual->first_name, first_name);
74         }
75         else {
76                 debug("There were problems with allocating memory for individual first name.\n");
77         }
78 }
79
80 char * familia_individual_get_first_name(struct familia_individual * individual)
81 {
82         return individual->first_name;
83 }
84
85 void familia_individual_set_last_name(struct familia_individual * individual, char * last_name)
86 {
87         /* Remove old data if it exists */
88         if (individual->last_name) {
89                 free(individual->last_name);
90         }
91         
92         if (last_name == NULL) {
93                 debug ("IS NULL");
94         }
95
96         individual->last_name = malloc(strlen(last_name) + 1);
97
98         /*
99          * Malloc returns NULL on allocation failure.
100          * Check if memory is allocated correctly and copy string.
101          */
102         if (individual->last_name) {
103                 strncpy(individual->last_name, last_name, strlen(last_name));
104         }
105         else {
106                 debug("There were problems with allocating memory for individual last name.\n");
107         }
108 }
109
110 char * familia_individual_get_last_name(struct familia_individual * individual)
111 {
112         return individual->last_name;
113 }
114
115 void familia_individual_add_family(struct familia_individual * individual, struct familia_family * family)
116 {
117         struct familia_family ** tmp = NULL;
118         int size = (individual->families_no + 1);
119
120         tmp = realloc(individual->families, size * sizeof(struct familia_family *));
121
122         if (tmp) {
123                 individual->families = tmp;
124                 individual->families[individual->families_no] = family;
125                 individual->families_no++;
126         }
127         else {
128                 debug("There were problems with allocating memory for family.\n");
129         }
130
131 }
132
133 struct familia_family * familia_individual_get_family_by_id(struct familia_individual * individual, unsigned int id)
134 {
135         if (individual->families_no < id) {
136                 debug("Trying to get not existing family!\n");
137                 return NULL;
138         }
139         return individual->families[id];
140 }
141
142 void familia_individual_remove_family_by_id(struct familia_individual * individual, unsigned int id)
143 {
144         unsigned int i = 0;
145         int found = 0;
146         struct familia_family ** tmp = NULL;
147         
148         if (individual->families_no < id) {
149                 debug("Trying to remove not existing family!\n");
150                 return;
151         }
152
153         for (i = 0; i < individual->families_no; i++) {
154                 if (individual->families[i]->id == id) {
155                         found = 1;
156                         individual->families[i] = NULL;
157                 }
158
159                 /*
160                  * If family has been found, reorder rest of files to avoid
161                  * NULL pointers inside array.
162                  */
163                 if (found && (i < individual->families_no - 1)) {
164                         individual->families[i] = individual->families[i + 1];
165                 }
166         }
167         
168         if (found) {
169                 tmp = realloc(individual->families,
170                         (individual->families_no) * sizeof(struct familia_family *));
171
172                 if (tmp) {
173                         individual->families = tmp;
174                 }
175                 individual->families_no--;
176         }
177 }
178
179 void familia_individual_set_parents(struct familia_individual * individual, struct familia_family * family)
180 {
181         individual->parents = family;
182 }
183
184 struct familia_family * familia_individual_get_parents(struct familia_individual * individual)
185 {
186         return individual->parents;
187 }
188
189 void familia_individual_remove_parents(struct familia_individual * individual)
190 {
191         individual->parents = NULL;
192 }