8 struct familia_storage * _familia_storage_current;
10 extern void _familia_storage_positions_init();
11 extern void _familia_storage_positions_free();
13 struct familia_storage * familia_storage_get_current()
15 return _familia_storage_current;
18 void familia_storage_set_current(struct familia_storage * storage)
20 _familia_storage_current = storage;
23 struct familia_storage * familia_storage_new()
25 struct familia_storage * storage = NULL;
26 storage = malloc(sizeof(struct familia_storage));
29 debug("["__FILE__ "] There was a problem with allocating memory for storage.\n");
33 storage->individuals = NULL;
34 storage->individuals_no = 0;
35 storage->families = NULL;
36 storage->families_no = 0;
38 _familia_storage_positions_init();
43 void familia_storage_free(struct familia_storage * storage)
47 if (storage->individuals_no) {
48 for (i = 0; i < storage->individuals_no; i++) {
49 familia_individual_free(storage->individuals[i]);
50 storage->individuals[i] = NULL;
52 free(storage->individuals);
53 storage->individuals = NULL;
54 storage->individuals_no = 0;
57 if (storage->families_no) {
58 for (i = 0; i < storage->families_no; i++) {
59 familia_family_free(storage->families[i]);
60 storage->families[i] = NULL;
62 free(storage->families);
63 storage->families = NULL;
64 storage->families_no = 0;
67 _familia_storage_positions_free();
70 void familia_storage_add_individual(struct familia_storage * storage, struct familia_individual * individual)
72 struct familia_individual ** tmp = NULL;
73 int size = (storage->individuals_no + 1);
76 tmp = realloc(storage->individuals, size * sizeof(struct familia_individual *));
79 storage->individuals = tmp;
80 storage->individuals[storage->individuals_no] = individual;
81 storage->individuals_no++;
84 debug("["__FILE__ "] There were problems with allocating memory for individual.\n");
89 struct familia_individual * familia_storage_get_individual_by_id(struct familia_storage * storage, unsigned int id)
91 if (storage->individuals_no < id) {
92 debug("["__FILE__ "Trying to get not existing individual!\n");
95 return storage->individuals[id];
98 void familia_storage_remove_individual_by_id(struct familia_storage * storage, unsigned int id)
102 struct familia_individual ** tmp = NULL;
104 if (storage->individuals_no < id) {
105 debug("["__FILE__ "] Trying to remove not existing individual!\n");
109 for (i = 0; i < storage->individuals_no; i++) {
110 if (storage->individuals[i]->id == id) {
112 familia_individual_free(storage->individuals[i]);
113 storage->individuals[i] = NULL;
117 * If family has been found, reorder rest of files to avoid
118 * NULL pointers inside array.
120 if (found && (i < storage->individuals_no - 1)) {
121 storage->individuals[i] = storage->individuals[i + 1];
126 tmp = realloc(storage->individuals,
127 (storage->families_no) * sizeof(struct familia_family *));
130 storage->individuals = tmp;
132 storage->individuals_no--;
136 void familia_storage_add_family(struct familia_storage * storage, struct familia_family * family)
138 struct familia_family ** tmp = NULL;
139 int size = (storage->families_no + 1);
142 tmp = realloc(storage->families, size * sizeof(struct familia_family *));
145 storage->families = tmp;
146 storage->families[storage->families_no] = family;
147 storage->families_no++;
150 debug("["__FILE__ "] There were problems with allocating memory for family.\n");
155 struct familia_family * familia_storage_get_family_by_id(struct familia_storage * storage, unsigned int id)
157 if (storage->families_no < id) {
158 debug("["__FILE__ "Trying to get not existing family!\n");
161 return storage->families[id];
164 void familia_storage_remove_family_by_id(struct familia_storage * storage, unsigned int id)
168 struct familia_family ** tmp = NULL;
170 if (storage->families_no < id) {
171 debug("["__FILE__ "] Trying to remove not existing family!\n");
175 for (i = 0; i < storage->families_no; i++) {
176 if (storage->families[i]->id == id) {
178 familia_family_free(storage->families[i]);
179 storage->families[i] = NULL;
183 * If family has been found, reorder rest of files to avoid
184 * NULL pointers inside array.
186 if (found && (i < storage->families_no - 1)) {
187 storage->families[i] = storage->families[i + 1];
192 tmp = realloc(storage->families,
193 (storage->families_no) * sizeof(struct familia_family *));
196 storage->families = tmp;
198 storage->families_no--;
202 void familia_storage_dump_all()
205 struct familia_storage * storage = NULL;
206 struct familia_family * family = NULL;
207 struct familia_individual * individual = NULL;
209 storage = familia_storage_get_current();
211 for (i = 0; i < storage->individuals_no; i++) {
212 individual = storage->individuals[i];
213 printf("Individual (%d)\n", individual->id);
214 printf("\t First name: %s\n", individual->first_name);
215 printf("\t Last name: %s\n", individual->last_name);
216 if (individual->families_no > 0) {
218 struct familia_family * f = NULL;
219 struct familia_individual * i1 = NULL;
220 struct familia_individual * i2 = NULL;
222 printf("\t Families:\n");
223 for (j = 0; j < individual->families_no; j++) {
224 f = individual->families[j];
225 i1 = familia_family_get_individual(f, Individual1);
226 i2 = familia_family_get_individual(f, Individual2);
228 printf("\t > %s&%s\n", familia_individual_get_first_name(i1), familia_individual_get_first_name(i2));
230 printf("\t Parents:\n");
231 f = familia_individual_get_parents(individual);
232 i1 = familia_family_get_individual(f, Individual1);
233 i2 = familia_family_get_individual(f, Individual2);
235 printf("\t > %s&%s\n", familia_individual_get_first_name(i1), familia_individual_get_first_name(i2));
240 for (i = 0; i < storage->families_no; i++) {
242 struct familia_individual * i1 = NULL;
243 struct familia_individual * i2 = NULL;
245 family = storage->families[i];
247 printf("Family (%d)\n", family->id);
248 i1 = familia_family_get_individual(family, Individual1);
249 i2 = familia_family_get_individual(family, Individual2);
250 printf("\t First parent: %s\n", familia_individual_get_first_name(i1));
251 printf("\t Second parent: %s\n", familia_individual_get_first_name(i2));
253 printf("\t Children:\n");
254 if (family->children_no > 0) {
255 for (j = 0; j < family->children_no; j++) {
256 i1 = family->children[j];
257 printf("\t > %s\n", familia_individual_get_first_name(i1));