7 struct familia_storage * _familia_storage_current;
9 extern void _familia_storage_positions_init();
10 extern void _familia_storage_positions_free();
12 struct familia_storage * familia_storage_get_current()
14 return _familia_storage_current;
17 void familia_storage_set_current(struct familia_storage * storage)
19 _familia_storage_current = storage;
22 struct familia_storage * familia_storage_new()
24 struct familia_storage * storage = NULL;
25 storage = malloc(sizeof(struct familia_storage));
28 debug("["__FILE__ "] There was a problem with allocating memory for storage.\n");
32 storage->individuals = NULL;
33 storage->individuals_no = 0;
34 storage->families = NULL;
35 storage->families_no = 0;
37 _familia_storage_positions_init();
42 void familia_storage_free(struct familia_storage * storage)
46 if (storage->individuals_no) {
47 for (i = 0; i < storage->individuals_no; i++) {
48 familia_individual_free(storage->individuals[i]);
49 storage->individuals[i] = NULL;
51 free(storage->individuals);
52 storage->individuals = NULL;
53 storage->individuals_no = 0;
56 if (storage->families_no) {
57 for (i = 0; i < storage->families_no; i++) {
58 familia_family_free(storage->families[i]);
59 storage->families[i] = NULL;
61 free(storage->families);
62 storage->families = NULL;
63 storage->families_no = 0;
66 _familia_storage_positions_free();
69 void familia_storage_add_individual(struct familia_storage * storage, struct familia_individual * individual)
71 struct familia_individual ** tmp = NULL;
72 int size = (storage->individuals_no + 1);
75 tmp = realloc(storage->individuals, size * sizeof(struct familia_individual *));
78 storage->individuals = tmp;
79 storage->individuals[storage->individuals_no] = individual;
80 storage->individuals_no++;
83 debug("["__FILE__ "] There were problems with allocating memory for individual.\n");
88 struct familia_individual * familia_storage_get_individual_by_id(struct familia_storage * storage, unsigned int id)
90 if (storage->individuals_no < id) {
91 debug("["__FILE__ "Trying to get not existing individual!\n");
94 return storage->individuals[id];
97 void familia_storage_remove_individual_by_id(struct familia_storage * storage, unsigned int id)
101 struct familia_individual ** tmp = NULL;
103 if (storage->individuals_no < id) {
104 debug("["__FILE__ "] Trying to remove not existing individual!\n");
108 for (i = 0; i < storage->individuals_no; i++) {
109 if (storage->individuals[i]->id == id) {
111 familia_individual_free(storage->individuals[i]);
112 storage->individuals[i] = NULL;
116 * If family has been found, reorder rest of files to avoid
117 * NULL pointers inside array.
119 if (found && (i < storage->individuals_no - 1)) {
120 storage->individuals[i] = storage->individuals[i + 1];
125 tmp = realloc(storage->individuals,
126 (storage->families_no) * sizeof(struct familia_family *));
129 storage->individuals = tmp;
131 storage->individuals_no--;
135 void familia_storage_add_family(struct familia_storage * storage, struct familia_family * family)
137 struct familia_family ** tmp = NULL;
138 int size = (storage->families_no + 1);
141 tmp = realloc(storage->families, size * sizeof(struct familia_family *));
144 storage->families = tmp;
145 storage->families[storage->families_no] = family;
146 storage->families_no++;
149 debug("["__FILE__ "] There were problems with allocating memory for family.\n");
154 struct familia_family * familia_storage_get_family_by_id(struct familia_storage * storage, unsigned int id)
156 if (storage->families_no < id) {
157 debug("["__FILE__ "Trying to get not existing family!\n");
160 return storage->families[id];
163 void familia_storage_remove_family_by_id(struct familia_storage * storage, unsigned int id)
167 struct familia_family ** tmp = NULL;
169 if (storage->families_no < id) {
170 debug("["__FILE__ "] Trying to remove not existing family!\n");
174 for (i = 0; i < storage->families_no; i++) {
175 if (storage->families[i]->id == id) {
177 familia_family_free(storage->families[i]);
178 storage->families[i] = NULL;
182 * If family has been found, reorder rest of files to avoid
183 * NULL pointers inside array.
185 if (found && (i < storage->families_no - 1)) {
186 storage->families[i] = storage->families[i + 1];
191 tmp = realloc(storage->families,
192 (storage->families_no) * sizeof(struct familia_family *));
195 storage->families = tmp;
197 storage->families_no--;