diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2016-09-07 04:05:07 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2016-09-07 04:05:07 +0000 |
| commit | 1eb5e8dcd17d84959a46a2d837ae719fc8eb3516 (patch) | |
| tree | fb78e60a3278d4727ecf74874698cb21275ee0e9 /lib/graph.c | |
| parent | 7a6ded40965d341456cdd5882c61ca4e22913c2b (diff) | |
lib: Continue matching system refactor
Most things back to working, all CLI units refactored
to use improved graph implementation.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib/graph.c')
| -rw-r--r-- | lib/graph.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/lib/graph.c b/lib/graph.c index 891851b301..be7d5aef38 100644 --- a/lib/graph.c +++ b/lib/graph.c @@ -22,18 +22,26 @@ * 02111-1307, USA. */ #include <zebra.h> -#include "command_graph.h" +#include "graph.h" #include "memory.h" +struct graph * +graph_new () +{ + struct graph *graph = XCALLOC (MTYPE_GRAPH, sizeof(struct graph)); + graph->nodes = vector_init (VECTOR_MIN_SIZE); + + return graph; +} struct graph_node * graph_new_node (struct graph *graph, void *data, void (*del) (void*)) { struct graph_node *node = - XCALLOC(MTYPE_CMD_TOKENS, sizeof(struct graph_node)); + XCALLOC(MTYPE_GRAPH_NODE, sizeof(struct graph_node)); - node->from = vector_init(VECTOR_MIN_SIZE); - node->to = vector_init(VECTOR_MIN_SIZE); + node->from = vector_init (VECTOR_MIN_SIZE); + node->to = vector_init (VECTOR_MIN_SIZE); node->data = data; node->del = del; @@ -51,10 +59,10 @@ graph_delete_node (struct graph *graph, struct graph_node *node) struct graph_node *adj; // for all nodes that have an edge to us, remove us from their ->to - for (int i = 0; i < vector_active (node->from); i++) + for (unsigned int i = 0; i < vector_active (node->from); i++) { adj = vector_slot (node->from, i); - for (int j = 0; j < vector_active (adj->to); j++) + for (unsigned int j = 0; j < vector_active (adj->to); j++) if (vector_slot (adj->to, j) == node) vector_unset (adj->to, j); @@ -62,14 +70,14 @@ graph_delete_node (struct graph *graph, struct graph_node *node) if (vector_active (adj->to) == 0 && vector_active (adj->from) == 0 && adj != node) - graph_delete_node (adj); + graph_delete_node (graph, adj); } // for all nodes that we have an edge to, remove us from their ->from - for (int i = 0; i < vector_active (node->to); i++) + for (unsigned int i = 0; i < vector_active (node->to); i++) { adj = vector_slot (node->to, i); - for (int j = 0; j < vector_active (adj->from); j++) + for (unsigned int j = 0; j < vector_active (adj->from); j++) if (vector_slot (adj->from, j) == node) vector_unset (adj->from, j); @@ -77,7 +85,7 @@ graph_delete_node (struct graph *graph, struct graph_node *node) if (vector_active (adj->to) == 0 && vector_active (adj->from) == 0 && adj != node) - graph_delete_node (adj); + graph_delete_node (graph, adj); } // if there is a deletion callback, call it! @@ -89,12 +97,12 @@ graph_delete_node (struct graph *graph, struct graph_node *node) vector_free (node->from); // remove node from graph->nodes - for (int i = 0; i < vector_active (graph->nodes); i++) + for (unsigned int i = 0; i < vector_active (graph->nodes); i++) if (vector_slot (graph->nodes, i) == node) vector_unset (graph->nodes, i); // free the node itself - free (node); + XFREE (MTYPE_GRAPH_NODE, node); } struct graph_node * @@ -109,9 +117,9 @@ void graph_delete_graph (struct graph *graph) { // delete each node in the graph - for (int i = 0; i < vector_active (graph->nodes); i++) - graph_delete_node (vector_slot (graph->nodes, i)); + for (unsigned int i = 0; i < vector_active (graph->nodes); i++) + graph_delete_node (graph, vector_slot (graph->nodes, i)); vector_free (graph->nodes); - free (graph); + XFREE (MTYPE_GRAPH, graph); } |
