cepheid

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

commit 58cfc5b7bb192a8d188a8ec90d8a6f926eac9479
parent de8927f4c4b54dd8c9c4c6e0dd7ac0ce1cdaf517
Author: hhvn <dev@hhvn.uk>
Date:   Tue, 15 Nov 2022 16:56:17 +0000

Fix tree_sort

Diffstat:
Msrc/tree.c | 23++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/tree.c b/src/tree.c @@ -219,14 +219,31 @@ tree_sort_sideways(Tree *t, Treecompar compar, void *cdata) { static int tree_sort_filter(Tree *t, void *data) { - return !t->n && t->u; + return !t->p && t->u; } void tree_sort(Tree *t, Treecompar compar, void *cdata) { Tree *p; int depth; + Tree **s; + int sl, si; - for (p = NULL; tree_iter_f(t, TREEMAX, &p, &depth, tree_sort_filter, NULL) != -1; ) - tree_sort_sideways(p, compar, cdata); + /* The tree can't be sorted (i,e, modified) whilst iterating through it. */ + sl = 10; + s = malloc(sl * sizeof(Tree *)); + + for (p = NULL, si = 0; tree_iter_f(t, TREEMAX, &p, &depth, tree_sort_filter, NULL) != -1; si++) { + if (si == sl - 1) { + sl += 10; + s = realloc(s, sl * sizeof(Tree *)); + } + + s[si] = p; + } + + while (si--) + tree_sort_sideways(s[si], compar, cdata); + + free(s); }