+
+/** @brief Export the given graph in the GraphViz formatting for visualization */
+void xbt_graph_export_graphviz(xbt_graph_t g, const char *filename,
+ const char *(node_name) (xbt_node_t),
+ const char *(edge_name) (xbt_edge_t))
+{
+ unsigned int cursor = 0;
+ xbt_node_t node = NULL;
+ xbt_edge_t edge = NULL;
+ FILE *file = NULL;
+ const char *name = NULL;
+
+ file = fopen(filename, "w");
+ xbt_assert(file, "Failed to open %s \n", filename);
+
+ if (g->directed)
+ fprintf(file, "digraph test {\n");
+ else
+ fprintf(file, "graph test {\n");
+
+ fprintf(file, " graph [overlap=scale]\n");
+
+ fprintf(file, " node [shape=box, style=filled]\n");
+ fprintf(file,
+ " node [width=.3, height=.3, style=filled, color=skyblue]\n\n");
+
+ xbt_dynar_foreach(g->nodes, cursor, node) {
+ if (node_name){
+ fprintf(file, " \"%s\";\n", node_name(node));
+ }else{
+ fprintf(file, " \"%p\";\n", node);
+ }
+ }
+ xbt_dynar_foreach(g->edges, cursor, edge) {
+ 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");
+ }
+ fprintf(file, "}\n");
+ fclose(file);
+}
+
+/** @brief Export the given graph in the GraphXML format */
+void xbt_graph_export_graphxml(xbt_graph_t g, const char *filename,
+ const char *(node_name) (xbt_node_t),
+ const char *(edge_name) (xbt_edge_t),
+ const char *(node_data_print) (void *),
+ const char *(edge_data_print) (void *))
+{
+ unsigned int cursor = 0;
+ xbt_node_t node = NULL;
+ xbt_edge_t edge = NULL;
+ FILE *file = NULL;
+ const char *name = NULL;
+
+ file = fopen(filename, "w");
+ xbt_assert(file, "Failed to open %s \n", filename);
+
+ fprintf(file, "<?xml version='1.0'?>\n");
+ fprintf(file, "<!DOCTYPE graph SYSTEM \"graphxml.dtd\">\n");
+ if (g->directed)
+ fprintf(file, "<graph isDirected=\"true\">\n");
+ else
+ fprintf(file, "<graph isDirected=\"false\">\n");
+ xbt_dynar_foreach(g->nodes, cursor, node) {
+ fprintf(file, " <node name=\"%p\" ", node);
+ if ((node_name) && ((name = node_name(node))))
+ fprintf(file, "label=\"%s\" ", name);
+ if ((node_data_print) && ((name = node_data_print(node->data))))
+ fprintf(file, "data=\"%s\" ", name);
+ fprintf(file, ">\n");
+ }
+ xbt_dynar_foreach(g->edges, cursor, edge) {
+ fprintf(file, " <edge source=\"%p\" target =\"%p\" ",
+ edge->src, edge->dst);
+ if ((edge_name) && ((name = edge_name(edge))))
+ fprintf(file, "label=\"%s\" ", name);
+ if (edge->length >= 0.0)
+ fprintf(file, "length=\"%g\" ", edge->length);
+ if ((edge_data_print) && ((name = edge_data_print(edge->data))))
+ fprintf(file, "data=\"%s\" ", name);
+ fprintf(file, ">\n");
+ }
+ fprintf(file, "</graph>\n");
+ fclose(file);
+}
+
+/** @brief Load a graph from a file (in the SimGrid Graph format) */
+xbt_graph_t xbt_graph_load (const char *filename)