]> granicus.if.org Git - graphviz/commitdiff
prune: return list by value from 'new_generic_list'
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 5 Nov 2022 16:12:07 +0000 (09:12 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 10 Nov 2022 04:47:29 +0000 (20:47 -0800)
The list type is exposed in the header, so we can stack allocate these, removing
some heap pressure and failure paths.

contrib/prune/generic_list.c
contrib/prune/generic_list.h
contrib/prune/prune.c

index f75d3705e0693e84f4871d70f3d1810118402da5..3707c3608bd92f0c1d980c66197fc5817afcc2db 100644 (file)
 
 #define DFLT_SIZE 100
 
-generic_list_t *new_generic_list(uint64_t size)
+generic_list_t new_generic_list(uint64_t size)
 {
-    generic_list_t *list = gv_alloc(sizeof(generic_list_t));
+    generic_list_t list = {0};
     if (size != 0) {
-       list->data = gv_calloc(size, sizeof(gl_data));
+       list.data = gv_calloc(size, sizeof(gl_data));
     }
-    list->size = size;
+    list.size = size;
     return list;
 }
 
@@ -31,7 +31,6 @@ void free_generic_list(generic_list_t * list)
     if (list->size > 0) {
        free(list->data);
     }
-    free(list);
 }
 
 void add_to_generic_list(generic_list_t *list, gl_data element) {
index 9eb5c3690342f90960721b49144d61e9f4a92982..39c2ed183b58bc810633a0e7197937e269a20ab7 100644 (file)
@@ -18,7 +18,7 @@
        gl_data *data;          /* pointer to first element */
     } generic_list_t;
 
-    extern generic_list_t *new_generic_list(uint64_t size);
+    extern generic_list_t new_generic_list(uint64_t size);
     extern void add_to_generic_list(generic_list_t * list,
                                               gl_data element);
     extern void free_generic_list(generic_list_t * list);
index 32b312ee6a28731fa2be6bd41674b1420ceef331..e22a645b53ef7d66880252ed05c472753e46a7d6 100644 (file)
@@ -67,9 +67,6 @@ int main(int argc, char **argv)
 
     char **files;
 
-    generic_list_t *attr_list;
-    generic_list_t *node_list;
-
     unsigned long i, j;
 
     opterr = 0;
@@ -81,16 +78,16 @@ int main(int argc, char **argv)
        progname++;             /* character after last '/' */
     }
 
-    attr_list = new_generic_list(16);
-    node_list = new_generic_list(16);
+    generic_list_t attr_list = new_generic_list(16);
+    generic_list_t node_list = new_generic_list(16);
 
     while ((c = getopt(argc, argv, "hvn:N:")) != -1) {
        switch (c) {
        case 'N':
-               addattr(attr_list, optarg);
+               addattr(&attr_list, optarg);
                break;
        case 'n':
-               addnode(node_list, optarg);
+               addnode(&node_list, optarg);
                break;
        case 'h':
                help_message(progname);
@@ -138,17 +135,16 @@ int main(int argc, char **argv)
        aginit(graph, AGNODE, NDNAME, sizeof(ndata), 1);
 
        /* prune all nodes specified on the commandline */
-       for (i = 0; i < node_list->used; i++) {
+       for (i = 0; i < node_list.used; i++) {
            if (verbose == 1)
-               fprintf(stderr, "Pruning node %s\n",
-                       (char *) node_list->data[i]);
+               fprintf(stderr, "Pruning node %s\n", (char*)node_list.data[i]);
 
            /* check whether a node of that name exists at all */
-           node = agnode(graph, (char *) node_list->data[i], 0);
+           node = agnode(graph, (char*)node_list.data[i], 0);
            if (node == NULL) {
                fprintf(stderr,
                        "*** Warning: No such node: %s -- gracefully skipping this one\n",
-                       (char *) node_list->data[i]);
+                       (char*)node_list.data[i]);
            } else {
                MARK(node);     /* Avoid cycles */
                /* Iterate over all outgoing edges */
@@ -165,26 +161,24 @@ int main(int argc, char **argv)
                UNMARK(node);   /* Unmark so that it can be removed in later passes */
 
                /* Change attribute (e.g. border style) to show that node has been pruneed */
-               for (j = 0; j < attr_list->used; j++) {
+               for (j = 0; j < attr_list.used; j++) {
                    /* create attribute if it doesn't exist and set it */
                    attr =
-                       agattr(graph, AGNODE,
-                              ((strattr_t *) attr_list->data[j])->n, "");
+                       agattr(graph, AGNODE, ((strattr_t*)attr_list.data[j])->n, "");
                    if (attr == NULL) {
                        fprintf(stderr, "Couldn't create attribute: %s\n",
-                               ((strattr_t *) attr_list->data[j])->n);
+                               ((strattr_t*)attr_list.data[j])->n);
                        graphviz_exit(EXIT_FAILURE);
                    }
-                   agxset(node, attr,
-                          ((strattr_t *) attr_list->data[j])->v);
+                   agxset(node, attr, ((strattr_t*)attr_list.data[j])->v);
                }
            }
        }
        agwrite(graph, stdout);
        agclose(graph);
     }
-    free_generic_list(attr_list);
-    free_generic_list(node_list);
+    free_generic_list(&attr_list);
+    free_generic_list(&node_list);
     graphviz_exit(EXIT_SUCCESS);
 }