X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/edde8f7fbc1b74a81551bf9eb7bac1935b999296..ef57f86ce57e5fc8e0a9fb0da96f32da4516ce5d:/src/xbt/graph.c diff --git a/src/xbt/graph.c b/src/xbt/graph.c index a56d008f66..61b83645f5 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -81,6 +81,7 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, return edge; } +/** @brief Get the edge connecting src and dst */ xbt_edge_t xbt_graph_get_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst) { @@ -102,21 +103,25 @@ xbt_edge_t xbt_graph_get_edge(xbt_graph_t g, xbt_node_t src, return NULL; } +/** @brief Get the user data associated to a node */ void *xbt_graph_node_get_data(xbt_node_t node) { return node->data; } +/** @brief Set the user data associated to a node */ void xbt_graph_node_set_data(xbt_node_t node, void *data) { node->data = data; } +/** @brief Get the user data associated to a edge */ void *xbt_graph_edge_get_data(xbt_edge_t edge) { return edge->data; } +/** @brief Set the user data associated to a edge */ void xbt_graph_edge_set_data(xbt_edge_t edge, void *data) { edge->data = data; @@ -135,39 +140,34 @@ void xbt_graph_free_graph(xbt_graph_t g, void_f_pvoid_t edge_free_function, void_f_pvoid_t graph_free_function) { - unsigned int cursor = 0; - xbt_node_t node = NULL; - xbt_edge_t edge = NULL; + unsigned int cursor; + xbt_node_t node; + xbt_edge_t edge; + xbt_dynar_foreach(g->edges, cursor, edge) { + if (edge_free_function) + edge_free_function(edge->data); + free(edge); + } + xbt_dynar_free(&(g->edges)); xbt_dynar_foreach(g->nodes, cursor, node) { xbt_dynar_free(&(node->out)); xbt_dynar_free(&(node->in)); if (node_free_function) node_free_function(node->data); + free(node); } - - xbt_dynar_foreach(g->edges, cursor, edge) { - if (edge_free_function) - edge_free_function(edge->data); - } - - xbt_dynar_foreach(g->nodes, cursor, node) - free(node); xbt_dynar_free(&(g->nodes)); - xbt_dynar_foreach(g->edges, cursor, edge) - free(edge); - xbt_dynar_free(&(g->edges)); if (graph_free_function) graph_free_function(g->data); free(g); xbt_graph_parse_lex_destroy(); - return; } -/** @brief remove the given node from the given graph */ +/** @brief remove the given node from the given graph */ void xbt_graph_free_node(xbt_graph_t g, xbt_node_t n, void_f_pvoid_t node_free_function, void_f_pvoid_t edge_free_function) @@ -205,7 +205,7 @@ void xbt_graph_free_node(xbt_graph_t g, xbt_node_t n, return; } -/** @brief remove the given edge from the given graph */ +/** @brief remove the given edge from the given graph */ void xbt_graph_free_edge(xbt_graph_t g, xbt_edge_t e, void_f_pvoid_t free_function) { @@ -286,9 +286,10 @@ void xbt_graph_edge_set_length(xbt_edge_t e, double length) } -double xbt_graph_edge_get_length(xbt_edge_t e) +/** @brief Get the length of a edge */ +double xbt_graph_edge_get_length(xbt_edge_t edge) { - return e->length; + return edge->length; } @@ -561,7 +562,7 @@ static void __parse_graph_begin(void) else parsed_graph = xbt_graph_new_graph(0, NULL); - parsed_nodes = xbt_dict_new(); + parsed_nodes = xbt_dict_new_homogeneous(NULL); } static void __parse_graph_end(void) @@ -664,16 +665,30 @@ void xbt_graph_export_graphviz(xbt_graph_t g, const char *filename, " node [width=.3, height=.3, style=filled, color=skyblue]\n\n"); xbt_dynar_foreach(g->nodes, cursor, node) { - fprintf(file, " \"%p\" ", node); - if ((node_name) && ((name = node_name(node)))) - fprintf(file, "[label=\"%s\"]", name); - fprintf(file, ";\n"); + if (node_name){ + fprintf(file, " \"%s\";\n", node_name(node)); + }else{ + fprintf(file, " \"%p\";\n", node); + } } xbt_dynar_foreach(g->edges, cursor, edge) { - if (g->directed) - fprintf(file, " \"%p\" -> \"%p\"", edge->src, edge->dst); - else - fprintf(file, " \"%p\" -- \"%p\"", edge->src, edge->dst); + const char *c; + const char *c_dir = "->"; + const char *c_ndir = "--"; + if (g->directed){ + c = c_dir; + }else{ + c = c_ndir; + } + const char *src_name, *dst_name; + if (node_name){ + src_name = node_name(edge->src); + dst_name = node_name(edge->dst); + fprintf(file, " \"%s\" %s \"%s\"", src_name, c, dst_name); + }else{ + fprintf(file, " \"%p\" %s \"%p\"", edge->src, c, edge->dst); + } + if ((edge_name) && ((name = edge_name(edge)))) fprintf(file, "[label=\"%s\"]", name); fprintf(file, ";\n"); @@ -735,7 +750,7 @@ xbt_graph_t xbt_graph_load (const char *filename) file = fopen (filename, "r"); xbt_assert(file, "Failed to open %s \n", filename); - xbt_dict_t nodes_dict = xbt_dict_new (); + xbt_dict_t nodes_dict = xbt_dict_new_homogeneous(NULL); xbt_graph_t ret = xbt_graph_new_graph (0, NULL); //read the number of nodes @@ -803,7 +818,7 @@ void xbt_graph_save (xbt_graph_t span, xbt_dynar_t edges = xbt_graph_get_edges (span); unsigned int cpt; xbt_node_t node; - fprintf (file, "%ld\n", xbt_dynar_length (nodes)); + fprintf (file, "%lu\n", xbt_dynar_length (nodes)); xbt_dynar_foreach (nodes, cpt, node) { if (nname){ fprintf (file, "%s\n", nname(node)); @@ -811,7 +826,7 @@ void xbt_graph_save (xbt_graph_t span, fprintf (file, "%p\n", node); } } - fprintf (file, "%ld\n", xbt_dynar_length (edges)); + fprintf (file, "%lu\n", xbt_dynar_length (edges)); xbt_edge_t edge; xbt_dynar_foreach (edges, cpt, edge) { xbt_node_t source = xbt_graph_edge_get_source (edge);