cepheid

An Aurora 4X clone
Log | Files | Refs | README

commit 26b02f144f89012c6d7659aaa9233997ddbc71f4
parent fda512107eeea19a05dfb030deb4e34846b71158
Author: hhvn <dev@hhvn.uk>
Date:   Sat, 19 Nov 2022 21:29:13 +0000

Free tree data properly

Diffstat:
Msrc/body.c | 6++++++
Msrc/main.h | 8++++++--
Msrc/save.c | 9+--------
Msrc/struct.h | 1+
Msrc/system.c | 14++++++++++++++
Msrc/tree.c | 15++++++++++-----
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;