4 #include "individual.h"
8 struct familia_individual * familia_individual_new()
10 struct familia_individual * individual = NULL;
11 individual = malloc(sizeof(struct familia_individual));
14 debug("["__FILE__ "] There was a problem with allocating memory for individual.\n");
19 individual->first_name = NULL;
20 individual->last_name = NULL;
21 individual->families = NULL;
22 individual->families_no = 0;
23 individual->parents = NULL;
28 void familia_individual_free(struct familia_individual * individual)
32 if (individual->first_name) {
33 free(individual->first_name);
34 individual->first_name = NULL;
37 if (individual->last_name) {
38 free(individual->last_name);
39 individual->last_name = NULL;
42 if (individual->families) {
43 /* Remove all family links. */
44 for (i = 0; i < individual->families_no; i++) {
45 individual->families[i] = NULL;
47 free(individual->families);
48 individual->families = NULL;
49 individual->families_no = 0;
52 if (individual->parents) {
53 individual->parents = NULL;
59 void familia_individual_set_first_name(struct familia_individual * individual, char * first_name)
61 /* Remove old data if it exists */
62 if (individual->first_name) {
63 free(individual->first_name);
66 individual->first_name = malloc(strlen(first_name) + 1);
69 * Malloc could return null on allocation failure.
70 * Check if memory is allocated correctly and copy string.
72 if (individual->first_name) {
73 strcpy(individual->first_name, first_name);
76 debug("There were problems with allocating memory for individual first name.\n");
80 char * familia_individual_get_first_name(struct familia_individual * individual)
82 return individual->first_name;
85 void familia_individual_set_last_name(struct familia_individual * individual, char * last_name)
87 /* Remove old data if it exists */
88 if (individual->last_name) {
89 free(individual->last_name);
92 if (last_name == NULL) {
96 individual->last_name = malloc(strlen(last_name) + 1);
99 * Malloc returns NULL on allocation failure.
100 * Check if memory is allocated correctly and copy string.
102 if (individual->last_name) {
103 strncpy(individual->last_name, last_name, strlen(last_name));
106 debug("There were problems with allocating memory for individual last name.\n");
110 char * familia_individual_get_last_name(struct familia_individual * individual)
112 return individual->last_name;
115 void familia_individual_add_family(struct familia_individual * individual, struct familia_family * family)
117 struct familia_family ** tmp = NULL;
118 int size = (individual->families_no + 1);
120 tmp = realloc(individual->families, size * sizeof(struct familia_family *));
123 individual->families = tmp;
124 individual->families[individual->families_no] = family;
125 individual->families_no++;
128 debug("There were problems with allocating memory for family.\n");
133 struct familia_family * familia_individual_get_family_by_id(struct familia_individual * individual, unsigned int id)
135 if (individual->families_no < id) {
136 debug("Trying to get not existing family!\n");
139 return individual->families[id];
142 void familia_individual_remove_family_by_id(struct familia_individual * individual, unsigned int id)
146 struct familia_family ** tmp = NULL;
148 if (individual->families_no < id) {
149 debug("Trying to remove not existing family!\n");
153 for (i = 0; i < individual->families_no; i++) {
154 if (individual->families[i]->id == id) {
156 individual->families[i] = NULL;
160 * If family has been found, reorder rest of files to avoid
161 * NULL pointers inside array.
163 if (found && (i < individual->families_no - 1)) {
164 individual->families[i] = individual->families[i + 1];
169 tmp = realloc(individual->families,
170 (individual->families_no) * sizeof(struct familia_family *));
173 individual->families = tmp;
175 individual->families_no--;
179 void familia_individual_set_parents(struct familia_individual * individual, struct familia_family * family)
181 individual->parents = family;
184 struct familia_family * familia_individual_get_parents(struct familia_individual * individual)
186 return individual->parents;
189 void familia_individual_remove_parents(struct familia_individual * individual)
191 individual->parents = NULL;