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;
27 void familia_individual_free(struct familia_individual * individual)
31 if (individual->first_name) {
32 free(individual->first_name);
33 individual->first_name = NULL;
36 if (individual->last_name) {
37 free(individual->last_name);
38 individual->last_name = NULL;
41 if (individual->families) {
42 /* Remove all family links. */
43 for (i = 0; i < individual->families_no; i++) {
44 individual->families[i] = NULL;
46 free(individual->families);
47 individual->families = NULL;
48 individual->families_no = 0;
54 void familia_individual_set_first_name(struct familia_individual * individual, char * first_name)
56 /* Remove old data if it exists */
57 if (individual->first_name) {
58 free(individual->first_name);
61 individual->first_name = malloc(strlen(first_name) + 1);
64 * Malloc could return null on allocation failure.
65 * Check if memory is allocated correctly and copy string.
67 if (individual->first_name) {
68 strcpy(individual->first_name, first_name);
71 debug("There were problems with allocating memory for individual first name.\n");
75 char * familia_individual_get_first_name(struct familia_individual * individual)
77 return individual->first_name;
80 void familia_individual_set_last_name(struct familia_individual * individual, char * last_name)
82 /* Remove old data if it exists */
83 if (individual->last_name) {
84 free(individual->last_name);
87 if (last_name == NULL) {
91 individual->last_name = malloc(strlen(last_name) + 1);
94 * Malloc returns NULL on allocation failure.
95 * Check if memory is allocated correctly and copy string.
97 if (individual->last_name) {
98 strncpy(individual->last_name, last_name, strlen(last_name));
101 debug("There were problems with allocating memory for individual last name.\n");
105 char * familia_individual_get_last_name(struct familia_individual * individual)
107 return individual->last_name;
110 void familia_individual_add_family(struct familia_individual * individual, struct familia_family * family)
112 struct familia_family ** tmp = NULL;
113 int size = (individual->families_no + 1);
115 tmp = realloc(individual->families, size * sizeof(struct familia_family *));
118 individual->families = tmp;
119 individual->families[individual->families_no] = family;
120 individual->families_no++;
123 debug("There were problems with allocating memory for family.\n");
128 struct familia_family * familia_individual_get_family_by_id(struct familia_individual * individual, unsigned int id)
130 if (individual->families_no < id) {
131 debug("Trying to get not existing family!\n");
134 return individual->families[id];
137 void familia_individual_remove_family_by_id(struct familia_individual * individual, unsigned int id)
141 struct familia_family ** tmp = NULL;
143 if (individual->families_no < id) {
144 debug("Trying to remove not existing family!\n");
148 for (i = 0; i < individual->families_no; i++) {
149 if (individual->families[i]->id == id) {
151 individual->families[i] = NULL;
155 * If family has been found, reorder rest of files to avoid
156 * NULL pointers inside array.
158 if (found && (i < individual->families_no - 1)) {
159 individual->families[i] = individual->families[i + 1];
164 tmp = realloc(individual->families,
165 (individual->families_no) * sizeof(struct familia_family *));
168 individual->families = tmp;
170 individual->families_no--;