From b10b254860b2bcbc85b9779a2388d33ce8318908 Mon Sep 17 00:00:00 2001 From: Matthew Fernandez Date: Sat, 3 Dec 2022 10:54:23 -0800 Subject: [PATCH] patchwork: replace clist implementation with generic list This replaces some common/memory.h allocations with cgraph/alloc.h, but more importantly reduces the amount of code to maintain here. Note that confusingly the list begins with a NULL entry and is only relevant to store later if we have accrued more than just the initial NULL. --- lib/patchwork/patchworkinit.c | 42 +++++++++++++---------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/lib/patchwork/patchworkinit.c b/lib/patchwork/patchworkinit.c index 5385e193f..b4955af7a 100644 --- a/lib/patchwork/patchworkinit.c +++ b/lib/patchwork/patchworkinit.c @@ -8,7 +8,10 @@ * Contributors: Details at https://graphviz.org *************************************************************************/ +#include +#include #include +#include #include #include #include @@ -17,29 +20,7 @@ /* the following code shamelessly copied from lib/fdpgen/layout.c and should be extracted and made into a common function */ -#define CL_CHUNK 10 - -typedef struct { - graph_t **cl; - int sz; - int cnt; -} clist_t; - -/* addCluster: - * Append a new cluster to the list. - * NOTE: cl[0] is empty. The clusters are in cl[1..cnt]. - * Normally, we increase the array when cnt == sz. - * The test for cnt > sz is necessary for the first time. - */ -static void addCluster(clist_t * clist, graph_t * subg) -{ - clist->cnt++; - if (clist->cnt >= clist->sz) { - clist->sz += CL_CHUNK; - clist->cl = RALLOC(clist->sz, clist->cl, graph_t *); - } - clist->cl[clist->cnt] = subg; -} +DEFINE_LIST(clist, graph_t*) /* mkClusters: * Attach list of immediate child clusters. @@ -56,6 +37,8 @@ mkClusters (graph_t * g, clist_t* pclist, graph_t* parent) clist_t* clist; if (pclist == NULL) { + // [0] is empty. The clusters are in [1..cnt]. + clist_append(&list, NULL); clist = &list; } else @@ -70,7 +53,7 @@ mkClusters (graph_t * g, clist_t* pclist, graph_t* parent) LEVEL(subg) = LEVEL(parent) + 1; GPARENT(subg) = parent; #endif - addCluster(clist, subg); + clist_append(clist, subg); mkClusters(subg, NULL, subg); } else { @@ -78,9 +61,14 @@ mkClusters (graph_t * g, clist_t* pclist, graph_t* parent) } } if (pclist == NULL) { - GD_n_cluster(g) = list.cnt; - if (list.cnt) - GD_clust(g) = RALLOC(list.cnt + 1, list.cl, graph_t*); + assert(clist_size(&list) - 1 <= INT_MAX); + GD_n_cluster(g) = (int)(clist_size(&list) - 1); + if (clist_size(&list) > 1) { + clist_shrink_to_fit(&list); + GD_clust(g) = clist_detach(&list); + } else { + clist_free(&list); + } } } -- 2.40.0