From: Matthew Fernandez Date: Thu, 1 Dec 2022 01:41:20 +0000 (-0800) Subject: patchwork: use a 'size_t' for treenode children count X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0eee892d5de9fd8bd870ee6152462d2d8973037d;p=graphviz patchwork: use a 'size_t' for treenode children count This also involves a cascading series of updates to other variables that are used to interact with `n_children`. Squashes four -Wsign-conversion warnings. --- diff --git a/lib/patchwork/patchwork.c b/lib/patchwork/patchwork.c index 2ee03ce21..6eaf2f5a4 100644 --- a/lib/patchwork/patchwork.c +++ b/lib/patchwork/patchwork.c @@ -26,7 +26,7 @@ struct treenode_t { Agnode_t *n; } u; int kind; - int n_children; + size_t n_children; }; #define DFLT_SZ 1.0 @@ -92,12 +92,13 @@ static treenode_t *mkTree (Agraph_t * g, attrsym_t* gp, attrsym_t* ap, attrsym_t treenode_t *cp; treenode_t *first = 0; treenode_t *prev = 0; - int i, n_children = 0; + int i; double area = 0; p->kind = AGRAPH; p->u.subg = g; + size_t n_children = 0; for (i = 1; i <= GD_n_cluster(g); i++) { subg = GD_clust(g)[i]; cp = mkTree (subg, gp, ap, mp); @@ -143,23 +144,22 @@ static int nodecmp (treenode_t** p0, treenode_t** p1) static void layoutTree(treenode_t * tree) { rectangle *recs; - int i, nc; treenode_t* cp; /* if (tree->kind == AGNODE) return; */ if (tree->n_children == 0) return; - nc = tree->n_children; + size_t nc = tree->n_children; treenode_t** nodes = gv_calloc(nc, sizeof(treenode_t*)); cp = tree->leftchild; - for (i = 0; i < nc; i++) { + for (size_t i = 0; i < nc; i++) { nodes[i] = cp; cp = cp->rightsib; } qsort (nodes, nc, sizeof(treenode_t*), (qsort_cmpf)nodecmp); double* areas_sorted = gv_calloc(nc, sizeof(double)); - for (i = 0; i < nc; i++) { + for (size_t i = 0; i < nc; i++) { areas_sorted[i] = nodes[i]->area; } if (tree->area == tree->child_area) @@ -178,7 +178,7 @@ static void layoutTree(treenode_t * tree) } if (Verbose) fprintf (stderr, "rec %f %f %f %f\n", tree->r.x[0], tree->r.x[1], tree->r.size[0], tree->r.size[1]); - for (i = 0; i < nc; i++) { + for (size_t i = 0; i < nc; i++) { nodes[i]->r = recs[i]; if (Verbose) fprintf (stderr, "%f - %f %f %f %f = %f (%f %f %f %f)\n", areas_sorted[i], @@ -192,7 +192,7 @@ static void layoutTree(treenode_t * tree) free (recs); cp = tree->leftchild; - for (i = 0; i < nc; i++) { + for (size_t i = 0; i < nc; i++) { if (cp->kind == AGRAPH) layoutTree (cp); cp = cp->rightsib; @@ -257,9 +257,9 @@ static void freeTree (treenode_t* tp) { treenode_t* cp = tp->leftchild; treenode_t* rp; - int i, nc = tp->n_children; + size_t nc = tp->n_children; - for (i = 0; i < nc; i++) { + for (size_t i = 0; i < nc; i++) { rp = cp->rightsib; freeTree (cp); cp = rp; diff --git a/lib/patchwork/tree_map.c b/lib/patchwork/tree_map.c index 2dfd4ec99..781f36af8 100644 --- a/lib/patchwork/tree_map.c +++ b/lib/patchwork/tree_map.c @@ -9,11 +9,12 @@ *************************************************************************/ #include +#include #include #include #include -static void squarify(int n, double *area, rectangle *recs, int nadded, double maxarea, double minarea, double totalarea, +static void squarify(size_t n, double *area, rectangle *recs, size_t nadded, double maxarea, double minarea, double totalarea, double asp, rectangle fillrec){ /* add a list of area in fillrec using squarified treemap alg. n: number of items to add @@ -25,13 +26,12 @@ static void squarify(int n, double *area, rectangle *recs, int nadded, double ma fillrec: the rectangle to be filled in. */ double w = fmin(fillrec.size[0], fillrec.size[1]); - int i; - if (n <= 0) return; + if (n == 0) return; if (Verbose) { fprintf(stderr, "trying to add to rect {%f +/- %f, %f +/- %f}\n",fillrec.x[0], fillrec.size[0], fillrec.x[1], fillrec.size[1]); - fprintf(stderr, "total added so far = %d\n", nadded); + fprintf(stderr, "total added so far = %" PRISIZE_T "\n", nadded); } if (nadded == 0){ @@ -55,12 +55,14 @@ static void squarify(int n, double *area, rectangle *recs, int nadded, double ma squarify(n, area, recs, ++nadded, newmaxarea, newminarea, s, newasp, fillrec); } else { /* aspectio worsen if add another area, fixed the already added recs */ - if (Verbose) fprintf(stderr,"adding %d items, total area = %f, w = %f, area/w=%f\n",nadded, totalarea, w, totalarea/w); + if (Verbose) fprintf(stderr, "adding %" PRISIZE_T + " items, total area = %f, w = %f, area/w=%f\n", + nadded, totalarea, w, totalarea/w); if (fillrec.size[0] <= fillrec.size[1]) { // tall rec. fix the items along x direction, left to right, at top hh = totalarea/w; xx = fillrec.x[0] - fillrec.size[0]/2; - for (i = 0; i < nadded; i++){ + for (size_t i = 0; i < nadded; i++){ recs[i].size[1] = hh; ww = area[i]/hh; recs[i].size[0] = ww; @@ -73,7 +75,7 @@ static void squarify(int n, double *area, rectangle *recs, int nadded, double ma } else {/* short rec. fix along y top to bot, at left*/ ww = totalarea/w; yy = fillrec.x[1] + fillrec.size[1]/2; - for (i = 0; i < nadded; i++){ + for (size_t i = 0; i < nadded; i++){ recs[i].size[0] = ww; hh = area[i]/ww; recs[i].size[1] = hh; @@ -97,18 +99,16 @@ static void squarify(int n, double *area, rectangle *recs, int nadded, double ma * fillred - rectangle to be filled * return array of rectangles */ -rectangle* tree_map(int n, double *area, rectangle fillrec){ +rectangle* tree_map(size_t n, double *area, rectangle fillrec){ /* fill a rectangle rec with n items, each item i has area[i] area. */ - int i; double total = 0, minarea = 1., maxarea = 0., asp = 1, totalarea = 0; - int nadded = 0; - for (i = 0; i < n; i++) total += area[i]; + for (size_t i = 0; i < n; i++) total += area[i]; /* make sure there is enough area */ if (total > fillrec.size[0] * fillrec.size[1] + 0.001) return NULL; rectangle *recs = gv_calloc(n, sizeof(rectangle)); - squarify(n, area, recs, nadded, maxarea, minarea, totalarea, asp, fillrec); + squarify(n, area, recs, 0, maxarea, minarea, totalarea, asp, fillrec); return recs; } diff --git a/lib/patchwork/tree_map.h b/lib/patchwork/tree_map.h index bc4f35b44..a71a16336 100644 --- a/lib/patchwork/tree_map.h +++ b/lib/patchwork/tree_map.h @@ -11,10 +11,11 @@ #pragma once #include +#include typedef struct { double x[2];/* center */ double size[2]; /* total width/height*/ } rectangle; -extern rectangle* tree_map(int n, double *area, rectangle fillrec); +extern rectangle* tree_map(size_t n, double *area, rectangle fillrec);