Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Adding basic parsing functions to the graph library
[simgrid.git] / src / xbt / graph.c
index f740315..6247605 100644 (file)
@@ -1,15 +1,25 @@
+/*     $Id$     */
+
+/* a generic graph library.                                                 */
+
+/* Copyright (c) 2006 Darina Dimitrova, Arnaud Legrand. 
+   All rights reserved.                  */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/graph.h"
 #include "graph_private.h"
+#include "xbt/graphxml_parse.h"
 
-/* XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph,xbt,"GRAPH"); */
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph,xbt,"Graph");
 
 /** Constructor
  * \return a new graph
  */
-xbt_graph_t xbt_graph_new_graph(const char *name, unsigned short int directed,
-                              void *data)
+xbt_graph_t xbt_graph_new_graph(unsigned short int directed, void *data)
 {
   xbt_graph_t graph=NULL;
   graph=xbt_new0(struct xbt_graph,1);
@@ -21,7 +31,7 @@ xbt_graph_t xbt_graph_new_graph(const char *name, unsigned short int directed,
   return graph;
 }
 
-xbt_node_t xbt_graph_new_node(xbt_graph_t g,const char *name, void *data)
+xbt_node_t xbt_graph_new_node(xbt_graph_t g, void *data)
 {
   xbt_node_t node=NULL;
   node=xbt_new0(struct xbt_node,1);
@@ -34,7 +44,7 @@ xbt_node_t xbt_graph_new_node(xbt_graph_t g,const char *name, void *data)
 }
 
 
-xbt_edge_t xbt_graph_new_edge(xbt_graph_t g,const char *name,
+xbt_edge_t xbt_graph_new_edge(xbt_graph_t g,
                             xbt_node_t src, xbt_node_t dst, void *data)
 {
   xbt_edge_t edge=NULL;
@@ -73,7 +83,8 @@ void xbt_graph_free_graph(xbt_graph_t g,
   xbt_dynar_foreach(g->nodes,cursor,node)
     xbt_graph_remove_node(g,node,node_free_function);
 
-  /* if xbt_dynar_size(g->edges)>0 SCREAM! */
+  xbt_assert0(!xbt_dynar_length(g->edges),
+             "Damnit, there are some remaining edges!");
 
   xbt_dynar_foreach(g->edges,cursor,edge)
       xbt_graph_remove_edge(g,edge,edge_free_function); 
@@ -141,3 +152,40 @@ void xbt_graph_remove_edge(xbt_graph_t g, xbt_edge_t e, void free_function(void
        }
    
 }
+
+static xbt_graph_t parsed_graph=NULL;
+
+static void  __parse_graph_begin(void) {
+  DEBUG0("<graph>");
+}
+static void  __parse_graph_end(void) {
+  DEBUG0("</graph>");
+}
+static void __parse_node(void) {
+  DEBUG1("<node label=\"%s\"/>",A_node_name);
+}
+static void __parse_edge(void) {
+  DEBUG2("<edge source=\"%s\" target=\"%s\"/>",A_edge_source,A_edge_target);
+}
+
+xbt_graph_t xbt_graph_read(const char *filename)
+{
+  xbt_graph_t graph = xbt_graph_new_graph(1,NULL);
+
+  parsed_graph = graph;
+
+  xbt_graph_parse_reset_parser();
+  
+  STag_graph_fun = __parse_graph_begin;
+  ETag_graph_fun = __parse_graph_end;
+  ETag_node_fun = __parse_node;
+  ETag_edge_fun = __parse_edge;
+
+  xbt_graph_parse_open(filename);
+  xbt_assert1((!xbt_graph_parse()),"Parse error in %s",filename);
+  xbt_graph_parse_close();
+
+  parsed_graph = NULL;
+  
+  return graph;
+}