commit 26b02f144f89012c6d7659aaa9233997ddbc71f4
parent fda512107eeea19a05dfb030deb4e34846b71158
Author: hhvn <dev@hhvn.uk>
Date: Sat, 19 Nov 2022 21:29:13 +0000
Free tree data properly
Diffstat:
6 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/src/body.c b/src/body.c
@@ -53,3 +53,9 @@ body_init(char *name) {
return ret;
}
+
+void
+body_free(Body *b) {
+ free(b->name);
+ free(b);
+}
diff --git a/src/main.h b/src/main.h
@@ -57,8 +57,9 @@ Polar polar_add(Polar abs, Polar rel);
/* tree.c */
Tree * tree_add_child(Tree *t, char *name, int type, void *data, Tree **ptr);
-int tree_delete(Tree **t, int freedata);
-int tree_delete_r(Tree **t, int freedata);
+int tree_delete(Tree **t, Treefree freedata);
+int tree_delete_r(Tree **t, Treefree freedata);
+int tree_delete_root(Tree *t, Treefree freedata);
int tree_iter_f(Tree *t, int maxdepth, Tree **p, int *depth, Treefilter filter, void *fdata);
int tree_iter(Tree *t, int maxdepth, Tree **p, int *depth);
void tree_sort_sideways(Tree *t, Treecompar compar, void *cdata);
@@ -165,13 +166,16 @@ System *sys_init(char *name);
void sys_tree_load(void);
char * sys_tree_getter(char *dir, char *group, char *name, int depth, Tree *t);
void sys_tree_setter(char *dir, char *group, char *name, int depth, Tree *t);
+void sys_tree_free(Tree *t);
System *sys_get(char *name);
System *sys_default(void);
+void sys_free(System *s);
/* body.c */
int bodytype_enumify(char *name);
char * bodytype_strify(Body *body);
Body * body_init(char *name);
+void body_free(Body *b);
/* save.c */
void save_read(char *dir);
diff --git a/src/save.c b/src/save.c
@@ -6,20 +6,13 @@
#include <sys/stat.h>
#include "main.h"
-/* Plan for dealing with multiple saves:
- * - saves: linked list with all saves that have been loaded (some data pruned)
- * - save: the current save
- * - save_get(name): get a save from saves/disk by name and load necessary data
- * - save_select(name): set save to save_get(name) + housekeeping
- */
-
static void
save_free(void) {
free(save->db.dir);
free(save->db.races);
free(save->db.systems);
free(save->db.fleets);
- /* free systems? */
+ tree_delete_root(&save->systems, sys_tree_free);
free(save);
}
diff --git a/src/struct.h b/src/struct.h
@@ -21,6 +21,7 @@ typedef struct Treeview Treeview;
typedef char * (*Treegetter)(char *dir, char *group, char *name, int depth, Tree *t);
typedef void (*Treesetter)(char *dir, char *group, char *name, int depth, Tree *t);
+typedef void (*Treefree)(Tree *t);
typedef int (*Treefilter)(Tree *t, void *data);
typedef void (*Treeprinter)(int x, int y, Treeview *tv, Tree *t);
diff --git a/src/system.c b/src/system.c
@@ -46,6 +46,12 @@ sys_init(char *name) {
return ret;
}
+void
+sys_free(System *s) {
+ free(s->name);
+ free(s);
+}
+
static int
sys_tree_compar(Tree *a, Tree *b, void *data) {
System *sa, *sb;
@@ -228,6 +234,14 @@ sys_tree_setter(char *dir, char *group, char *name, int depth, Tree *t) {
}
}
+void
+sys_tree_free(Tree *t) {
+ switch (t->type) {
+ case SYSTREE_SYS: sys_free(t->data); break;
+ case SYSTREE_BODY: body_free(t->data); break;
+ }
+}
+
System *
sys_get(char *name) {
Tree *t;
diff --git a/src/tree.c b/src/tree.c
@@ -49,7 +49,7 @@ tree_add_child(Tree *t, char *name, int type, void *data, Tree **ptr) {
/* Deletes a node in the tree and replaces it with its children. */
int
-tree_delete(Tree **t, int freedata) {
+tree_delete(Tree **t, Treefree freedata) {
Tree *e;
Tree *p;
Tree *fc, *lc;
@@ -79,14 +79,14 @@ tree_delete(Tree **t, int freedata) {
e->n->p = lc ? lc : e->p;
if (freedata)
- free(e->data);
+ freedata(e);
free(e);
return 0;
}
static Tree *
-tree_delete_r_sub(Tree *e, int freedata) {
+tree_delete_r_sub(Tree *e, Treefree freedata) {
Tree *c;
Tree *n;
@@ -94,7 +94,7 @@ tree_delete_r_sub(Tree *e, int freedata) {
n = e->n;
if (freedata)
- free(e->data);
+ freedata(e);
free(e);
while (c)
@@ -105,7 +105,7 @@ tree_delete_r_sub(Tree *e, int freedata) {
/* Deletes a node and its children. */
int
-tree_delete_r(Tree **t, int freedata) {
+tree_delete_r(Tree **t, Treefree freedata) {
Tree *e;
if (!*t)
@@ -128,6 +128,11 @@ tree_delete_r(Tree **t, int freedata) {
return 0;
}
+int
+tree_delete_root(Tree *t, Treefree freedata) {
+ return tree_delete_r(&t->d, freedata);
+}
+
static int
tree_iter_f_yes(Tree *t, void *data) {
return 1;