- /* Copyright (c) 2006-2015. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2006-2017. The SimGrid Team. 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/log.h"
#include "xbt/misc.h"
#include "xbt/str.h"
-#include <string>
#include "src/surf/xml/platf_private.hpp"
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/classification.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <string>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module");
static std::vector<int>* explodesRadical(const char* radicals)
{
std::vector<int>* exploded = new std::vector<int>();
- char* groups;
- unsigned int iter;
// Make all hosts
- xbt_dynar_t radical_elements = xbt_str_split(radicals, ",");
- xbt_dynar_foreach (radical_elements, iter, groups) {
-
- xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
- int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
+ std::vector<std::string> radical_elements;
+ boost::split(radical_elements, radicals, boost::is_any_of(","));
+ for (auto group : radical_elements) {
+ std::vector<std::string> radical_ends;
+ boost::split(radical_ends, group, boost::is_any_of("-"));
+ int start = surf_parse_get_int((radical_ends.front()).c_str());
int end = 0;
- switch (xbt_dynar_length(radical_ends)) {
+ switch (radical_ends.size()) {
case 1:
end = start;
break;
case 2:
- end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char*));
+ end = surf_parse_get_int((radical_ends.back()).c_str());
break;
default:
- surf_parse_error("Malformed radical: %s", groups);
+ surf_parse_error("Malformed radical: %s", group.c_str());
break;
}
-
for (int i = start; i <= end; i++)
exploded->push_back(i);
-
- xbt_dynar_free(&radical_ends);
}
- xbt_dynar_free(&radical_elements);
return exploded;
}
double speed = surf_parse_get_speed(speeds, entity_kind, id);
speed_per_pstate.push_back(speed);
} else {
- xbt_dynar_t pstate_list = xbt_str_split(speeds, ",");
- unsigned int i;
- char* speed_str;
- xbt_dynar_foreach(pstate_list, i, speed_str) {
- xbt_str_trim(speed_str, nullptr);
- double speed = surf_parse_get_speed(speed_str,entity_kind, id);
+ std::vector<std::string> pstate_list;
+ boost::split(pstate_list, speeds, boost::is_any_of(","));
+ for (auto speed_str : pstate_list) {
+ boost::trim(speed_str);
+ double speed = surf_parse_get_speed(speed_str.c_str(), entity_kind, id);
speed_per_pstate.push_back(speed);
XBT_DEBUG("Speed value: %f", speed);
}
- xbt_dynar_free(&pstate_list);
}
return speed_per_pstate;
}
/*
* Stuff relative to the <include> tag
*/
-static xbt_dynar_t surf_input_buffer_stack = nullptr;
-static xbt_dynar_t surf_file_to_parse_stack = nullptr;
-static xbt_dynar_t surf_parsed_filename_stack = nullptr;
+static std::vector<YY_BUFFER_STATE> surf_input_buffer_stack;
+static std::vector<FILE*> surf_file_to_parse_stack;
+static std::vector<char*> surf_parsed_filename_stack;
void STag_surfxml_include()
{
parse_after_config();
XBT_DEBUG("STag_surfxml_include '%s'",A_surfxml_include_file);
- xbt_dynar_push(surf_parsed_filename_stack,&surf_parsed_filename); // save old file name
+ surf_parsed_filename_stack.push_back(surf_parsed_filename); // save old file name
surf_parsed_filename = xbt_strdup(A_surfxml_include_file);
- xbt_dynar_push(surf_file_to_parse_stack, &surf_file_to_parse); //save old file descriptor
+ surf_file_to_parse_stack.push_back(surf_file_to_parse); // save old file descriptor
surf_file_to_parse = surf_fopen(A_surfxml_include_file, "r"); // read new file descriptor
xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", A_surfxml_include_file);
- xbt_dynar_push(surf_input_buffer_stack,&surf_input_buffer);
+ surf_input_buffer_stack.push_back(surf_input_buffer);
surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE);
surf_parse_push_buffer_state(surf_input_buffer);
fflush(nullptr);
XBT_DEBUG("ETag_surfxml_include_state '%s'",A_surfxml_include_file);
- if(xbt_dynar_is_empty(surf_input_buffer_stack)) // nope, that's a true premature EOF. Let the parser die verbosely.
+ if (surf_input_buffer_stack.empty()) // nope, that's a true premature EOF. Let the parser die verbosely.
return 0;
// Yeah, we were in an <include> Restore state and proceed.
fclose(surf_file_to_parse);
- xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse);
+ surf_file_to_parse_stack.pop_back();
surf_parse_pop_buffer_state();
- xbt_dynar_pop(surf_input_buffer_stack,&surf_input_buffer);
+ surf_input_buffer_stack.pop_back();
// Restore the filename for error messages
free(surf_parsed_filename);
- xbt_dynar_pop(surf_parsed_filename_stack,&surf_parsed_filename);
+ surf_parsed_filename_stack.pop_back();
return 1;
}
void STag_surfxml_link___ctn(){
- simgrid::surf::LinkImpl* link;
+ simgrid::surf::LinkImpl* link = nullptr;
char *link_name=nullptr;
switch (A_surfxml_link___ctn_direction) {
case AU_surfxml_link___ctn_direction:
}
xbt_free(link_name); // no-op if it's already nullptr
- surf_parse_assert(link!=nullptr,"No such link: '%s'%s", A_surfxml_link___ctn_id,
- A_surfxml_link___ctn_direction==A_surfxml_link___ctn_direction_UP?" (upward)":
- ( A_surfxml_link___ctn_direction==A_surfxml_link___ctn_direction_DOWN?" (downward)":
- ""));
+ const char* dirname = "";
+ switch (A_surfxml_link___ctn_direction) {
+ case A_surfxml_link___ctn_direction_UP:
+ dirname = " (upward)";
+ break;
+ case A_surfxml_link___ctn_direction_DOWN:
+ dirname = " (downward)";
+ break;
+ default:
+ dirname = "";
+ }
+ surf_parse_assert(link != nullptr, "No such link: '%s'%s", A_surfxml_link___ctn_id, dirname);
parsed_link_list.push_back(link);
}
{
xbt_assert(file, "Cannot parse the nullptr file. Bypassing the parser is strongly deprecated nowadays.");
- if (!surf_input_buffer_stack)
- surf_input_buffer_stack = xbt_dynar_new(sizeof(YY_BUFFER_STATE), nullptr);
- if (!surf_file_to_parse_stack)
- surf_file_to_parse_stack = xbt_dynar_new(sizeof(FILE *), nullptr);
-
- if (!surf_parsed_filename_stack)
- surf_parsed_filename_stack = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
-
surf_parsed_filename = xbt_strdup(file);
- char *dir = xbt_dirname(file);
- xbt_dynar_push(surf_path, &dir);
+ char* dir = xbt_dirname(file);
+ surf_path.push_back(std::string(dir));
+ xbt_free(dir);
surf_file_to_parse = surf_fopen(file, "r");
xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", file);
void surf_parse_close()
{
- xbt_dynar_free(&surf_input_buffer_stack);
- xbt_dynar_free(&surf_file_to_parse_stack);
- xbt_dynar_free(&surf_parsed_filename_stack);
if (surf_parsed_filename) {
- char *dir = nullptr;
- xbt_dynar_pop(surf_path, &dir);
- free(dir);
+ surf_path.pop_back();
}
free(surf_parsed_filename);