1 /* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "xbt/sysdep.h"
10 #include "xbt/asserts.h"
12 #include "xbt/dynar.h"
13 #include "xbt/graphxml_parse.h"
15 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graphxml_parse, xbt,
16 "Logging specific to the graphxml parsing module");
21 static xbt_dynar_t xbt_graph_input_buffer_stack = NULL;
22 static xbt_dynar_t xbt_graph_file_to_parse_stack = NULL;
24 static void nil_function(void)
29 void_f_void_t STag_graphxml_graph_fun = nil_function;
30 void_f_void_t ETag_graphxml_graph_fun = nil_function;
31 void_f_void_t STag_graphxml_node_fun = nil_function;
32 void_f_void_t ETag_graphxml_node_fun = nil_function;
33 void_f_void_t STag_graphxml_edge_fun = nil_function;
34 void_f_void_t ETag_graphxml_edge_fun = nil_function;
36 YY_BUFFER_STATE xbt_graph_input_buffer;
37 FILE *xbt_graph_file_to_parse;
39 void xbt_graph_parse_reset_parser(void)
41 STag_graphxml_graph_fun = nil_function;
42 ETag_graphxml_graph_fun = nil_function;
43 STag_graphxml_node_fun = nil_function;
44 ETag_graphxml_node_fun = nil_function;
45 STag_graphxml_edge_fun = nil_function;
46 ETag_graphxml_edge_fun = nil_function;
49 void STag_graphxml_graph(void)
51 (*STag_graphxml_graph_fun) ();
54 void ETag_graphxml_graph(void)
56 (*ETag_graphxml_graph_fun) ();
60 void STag_graphxml_node(void)
62 (*STag_graphxml_node_fun) ();
65 void ETag_graphxml_node(void)
67 (*ETag_graphxml_node_fun) ();
71 void STag_graphxml_edge(void)
73 (*STag_graphxml_edge_fun) ();
76 void ETag_graphxml_edge(void)
78 (*ETag_graphxml_edge_fun) ();
83 void xbt_graph_parse_open(const char *file)
87 ("I hope you know what you're doing... you just gave me a NULL pointer!");
90 if (!xbt_graph_input_buffer_stack)
91 xbt_graph_input_buffer_stack =
92 xbt_dynar_new(sizeof(YY_BUFFER_STATE), NULL);
93 if (!xbt_graph_file_to_parse_stack)
94 xbt_graph_file_to_parse_stack = xbt_dynar_new(sizeof(FILE *), NULL);
96 xbt_graph_file_to_parse = fopen(file, "r"); /* FIXME should use something like surf_fopen */
97 xbt_assert1((xbt_graph_file_to_parse), "Unable to open \"%s\"\n", file);
98 xbt_graph_input_buffer =
99 xbt_graph_parse__create_buffer(xbt_graph_file_to_parse, 10);
100 xbt_graph_parse__switch_to_buffer(xbt_graph_input_buffer);
101 xbt_graph_parse_lineno = 1;
104 void xbt_graph_parse_close(void)
106 if (xbt_graph_input_buffer_stack)
107 xbt_dynar_free(&xbt_graph_input_buffer_stack);
108 if (xbt_graph_file_to_parse_stack)
109 xbt_dynar_free(&xbt_graph_file_to_parse_stack);
111 if (xbt_graph_file_to_parse) {
112 xbt_graph_parse__delete_buffer(xbt_graph_input_buffer);
113 fclose(xbt_graph_file_to_parse);
118 static int _xbt_graph_parse(void)
120 return xbt_graph_parse_lex();
123 int_f_void_t xbt_graph_parse = _xbt_graph_parse;
125 void xbt_graph_parse_get_double(double *value, const char *string)
129 ret = sscanf(string, "%lg", value);
130 xbt_assert2((ret == 1), "Parse error line %d : %s not a number",
131 xbt_graph_parse_lineno, string);