]> granicus.if.org Git - graphviz/commitdiff
bcomps blockName: remove long lived allocation
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 14 Jan 2023 23:27:43 +0000 (15:27 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 15 Jan 2023 17:51:26 +0000 (09:51 -0800)
It looks like a mistake in the initial revision of Graphviz that this function
never wrote to `bufsz`. The effect of this was that this function would
reallocate on every single call. So empirically it seems there was no need to
avoid allocating new memory on each call, which is what this commit does.

Gitlab: #1950

cmd/tools/bcomps.c

index 3faeff8c098ce372459f4ad01d270eaf1f0dec13..19d8962e6b9ce5bef8d3e7065d9d1c237ef2d74d 100644 (file)
@@ -28,6 +28,7 @@
 #include <getopt.h>
 
 #include <stdlib.h>
+#include <cgraph/agxbuf.h>
 #include <cgraph/alloc.h>
 #include <cgraph/cgraph.h>
 #include <cgraph/exit.h>
@@ -74,22 +75,12 @@ typedef struct {
     Agraph_t *blks;
 } bcstate;
 
-static char *blockName(char *gname, int d)
-{
-    static char *buf;
-    static size_t bufsz;
-
-    size_t sz = strlen(gname) + 128;
-    if (sz > bufsz) {
-       free(buf);
-       buf = gv_alloc(sz);
-    }
-
+static char *blockName(agxbuf *xb, char *gname, int d) {
     if (*gname == '%') /* anonymous graph */
-       sprintf(buf, "_%s_bcc_%d", gname, d);
+       agxbprint(xb, "_%s_bcc_%d", gname, d);
     else
-       sprintf(buf, "%s_bcc_%d", gname, d);
-    return buf;
+       agxbprint(xb, "%s_bcc_%d", gname, d);
+    return agxbuse(xb);
 }
 
 /* getName:
@@ -154,7 +145,9 @@ static Agraph_t *mkBlock(Agraph_t * g, bcstate * stp)
     Agraph_t *sg;
 
     stp->nComp++;
-    sg = agsubg(g, blockName(agnameof(g), stp->nComp), 1);
+    agxbuf xb = {0};
+    sg = agsubg(g, blockName(&xb, agnameof(g), stp->nComp), 1);
+    agxbfree(&xb);
     agbindrec(sg, "info", sizeof(Agraphinfo_t), true);
     NEXTBLK(sg) = stp->blks;
     stp->blks = sg;