| version 1.9 | version 1.10 |
|---|
| |
| /// -*- c++ -*- | |
| | |
| #include <sstream> | #include <sstream> |
| #include <iostream> | #include <iostream> |
| |
| | |
| // definition of single-value keyword parsers | // definition of single-value keyword parsers |
| | |
| #define _get_keyval_scalar_string_(TYPE) \ | template<typename TYPE> bool colvarparse::_get_keyval_scalar_(std::string const &conf, |
| \ | char const *key, |
| bool colvarparse::get_keyval(std::string const &conf, \ | TYPE &value, |
| char const *key, \ | TYPE const &def_value, |
| TYPE &value, \ | Parse_Mode const parse_mode) |
| TYPE const &def_value, \ | { |
| Parse_Mode const parse_mode) \ | std::string data; |
| { \ | bool b_found = false, b_found_any = false; |
| std::string data; \ | size_t save_pos = 0, found_count = 0; |
| bool b_found = false, b_found_any = false; \ | |
| size_t save_pos = 0, found_count = 0; \ | do { |
| \ | std::string data_this = ""; |
| do { \ | b_found = key_lookup(conf, key, data_this, save_pos); |
| std::string data_this = ""; \ | if (b_found) { |
| b_found = key_lookup(conf, key, data_this, save_pos); \ | if (!b_found_any) |
| if (b_found) { \ | b_found_any = true; |
| if (!b_found_any) \ | found_count++; |
| b_found_any = true; \ | data = data_this; |
| found_count++; \ | |
| data = data_this; \ | |
| } \ | |
| } while (b_found); \ | |
| \ | |
| if (found_count > 1) \ | |
| cvm::log("Warning: found more than one instance of \""+ \ | |
| std::string(key)+"\".\n"); \ | |
| \ | |
| if (data.size()) { \ | |
| std::istringstream is(data); \ | |
| TYPE x(def_value); \ | |
| if (is >> x) { \ | |
| value = x; \ | |
| } else { \ | |
| cvm::error("Error: in parsing \""+ \ | |
| std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = "+ \ | |
| cvm::to_str(value)+"\n"); \ | |
| } \ | |
| } else { \ | |
| \ | |
| if (b_found_any) { \ | |
| cvm::error("Error: improper or missing value " \ | |
| "for \""+std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| value = def_value; \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = \""+ \ | |
| cvm::to_str(def_value)+"\" [default]\n"); \ | |
| } \ | |
| } \ | |
| \ | |
| return b_found_any; \ | |
| } | |
| | |
| | |
| #define _get_keyval_scalar_(TYPE) \ | |
| \ | |
| bool colvarparse::get_keyval(std::string const &conf, \ | |
| char const *key, \ | |
| TYPE &value, \ | |
| TYPE const &def_value, \ | |
| Parse_Mode const parse_mode) \ | |
| { \ | |
| std::string data; \ | |
| bool b_found = false, b_found_any = false; \ | |
| size_t save_pos = 0, found_count = 0; \ | |
| \ | |
| do { \ | |
| std::string data_this = ""; \ | |
| b_found = key_lookup(conf, key, data_this, save_pos); \ | |
| if (b_found) { \ | |
| if (!b_found_any) \ | |
| b_found_any = true; \ | |
| found_count++; \ | |
| data = data_this; \ | |
| } \ | |
| } while (b_found); \ | |
| \ | |
| if (found_count > 1) \ | |
| cvm::log("Warning: found more than one instance of \""+ \ | |
| std::string(key)+"\".\n"); \ | |
| \ | |
| if (data.size()) { \ | |
| std::istringstream is(data); \ | |
| size_t data_count = 0; \ | |
| TYPE x(def_value); \ | |
| while (is >> x) { \ | |
| value = x; \ | |
| data_count++; \ | |
| } \ | |
| if (data_count == 0) \ | |
| cvm::fatal_error("Error: in parsing \""+ \ | |
| std::string(key)+"\".\n"); \ | |
| if (data_count > 1) { \ | |
| cvm::error("Error: multiple values " \ | |
| "are not allowed for keyword \""+ \ | |
| std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = "+ \ | |
| cvm::to_str(value)+"\n"); \ | |
| } \ | |
| } else { \ | |
| \ | |
| if (b_found_any) { \ | |
| cvm::error("Error: improper or missing value " \ | |
| "for \""+std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| value = def_value; \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = "+ \ | |
| cvm::to_str(def_value)+" [default]\n"); \ | |
| } \ | |
| } \ | |
| \ | |
| return b_found_any; \ | |
| } | |
| | |
| | |
| // definition of multiple-value keyword parsers | |
| | |
| #define _get_keyval_vector_(TYPE) \ | |
| \ | |
| bool colvarparse::get_keyval(std::string const &conf, \ | |
| char const *key, \ | |
| std::vector<TYPE> &values, \ | |
| std::vector<TYPE> const &def_values, \ | |
| Parse_Mode const parse_mode) \ | |
| { \ | |
| std::string data; \ | |
| bool b_found = false, b_found_any = false; \ | |
| size_t save_pos = 0, found_count = 0; \ | |
| \ | |
| do { \ | |
| std::string data_this = ""; \ | |
| b_found = key_lookup(conf, key, data_this, save_pos); \ | |
| if (b_found) { \ | |
| if (!b_found_any) \ | |
| b_found_any = true; \ | |
| found_count++; \ | |
| data = data_this; \ | |
| } \ | |
| } while (b_found); \ | |
| \ | |
| if (found_count > 1) \ | |
| cvm::log("Warning: found more than one instance of \""+ \ | |
| std::string(key)+"\".\n"); \ | |
| \ | |
| if (data.size()) { \ | |
| std::istringstream is(data); \ | |
| \ | |
| if (values.size() == 0) { \ | |
| \ | |
| std::vector<TYPE> x; \ | |
| if (def_values.size()) \ | |
| x = def_values; \ | |
| else \ | |
| x.assign(1, TYPE()); \ | |
| \ | |
| for (size_t i = 0; \ | |
| ( is >> x[ ((i<x.size()) ? i : x.size()-1) ] ); \ | |
| i++) { \ | |
| values.push_back(x[ ((i<x.size()) ? i : x.size()-1) ]); \ | |
| } \ | |
| \ | |
| } else { \ | |
| \ | |
| size_t i = 0; \ | |
| for ( ; i < values.size(); i++) { \ | |
| TYPE x(values[i]); \ | |
| if (is >> x) { \ | |
| values[i] = x; \ | |
| } else { \ | |
| cvm::error("Error: in parsing \""+ \ | |
| std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| } \ | |
| } \ | |
| \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = "+ \ | |
| cvm::to_str(values)+"\n"); \ | |
| } \ | |
| \ | |
| } else { \ | |
| \ | |
| if (b_found_any) { \ | |
| cvm::error("Error: improper or missing values for \""+ \ | |
| std::string(key)+"\".\n", INPUT_ERROR); \ | |
| } \ | |
| \ | |
| for (size_t i = 0; i < values.size(); i++) \ | |
| values[i] = def_values[ (i > def_values.size()) ? 0 : i ]; \ | |
| \ | |
| if (parse_mode != parse_silent) { \ | |
| cvm::log("# "+std::string(key)+" = "+ \ | |
| cvm::to_str(def_values)+" [default]\n"); \ | |
| } \ | |
| } \ | |
| \ | |
| return b_found_any; \ | |
| } | } |
| | } while (b_found); |
| | |
| | if (found_count > 1) |
| | cvm::log("Warning: found more than one instance of \""+ |
| | std::string(key)+"\".\n"); |
| | |
| // single-value keyword parsers | if (data.size()) { |
| | std::istringstream is(data); |
| | TYPE x(def_value); |
| | if (is >> x) { |
| | value = x; |
| | } else { |
| | cvm::error("Error: in parsing \""+ |
| | std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = "+ |
| | cvm::to_str(value)+"\n"); |
| | } |
| | } else { |
| | |
| | if (b_found_any) { |
| | cvm::error("Error: improper or missing value " |
| | "for \""+std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | value = def_value; |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = "+ |
| | cvm::to_str(def_value)+" [default]\n"); |
| | } |
| | } |
| | |
| _get_keyval_scalar_(int); | return b_found_any; |
| _get_keyval_scalar_(size_t); | } |
| _get_keyval_scalar_(long); | |
| _get_keyval_scalar_string_(std::string); | |
| _get_keyval_scalar_(cvm::real); | bool colvarparse::_get_keyval_scalar_string_(std::string const &conf, |
| _get_keyval_scalar_(cvm::rvector); | char const *key, |
| _get_keyval_scalar_(cvm::quaternion); | std::string &value, |
| _get_keyval_scalar_(colvarvalue); | std::string const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | std::string data; |
| | bool b_found = false, b_found_any = false; |
| | size_t save_pos = 0, found_count = 0; |
| | |
| | do { |
| | std::string data_this = ""; |
| | b_found = key_lookup(conf, key, data_this, save_pos); |
| | if (b_found) { |
| | if (!b_found_any) |
| | b_found_any = true; |
| | found_count++; |
| | data = data_this; |
| | } |
| | } while (b_found); |
| | |
| | if (found_count > 1) |
| | cvm::log("Warning: found more than one instance of \""+ |
| | std::string(key)+"\".\n"); |
| | |
| | if (data.size()) { |
| | std::istringstream is(data); |
| | size_t data_count = 0; |
| | std::string x(def_value); |
| | while (is >> x) { |
| | value = x; |
| | data_count++; |
| | } |
| | if (data_count == 0) |
| | cvm::error("Error: in parsing \""+ |
| | std::string(key)+"\".\n", INPUT_ERROR); |
| | if (data_count > 1) { |
| | cvm::error("Error: multiple values " |
| | "are not allowed for keyword \""+ |
| | std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = \""+ |
| | cvm::to_str(value)+"\"\n"); |
| | } |
| | } else { |
| | |
| | if (b_found_any) { |
| | cvm::error("Error: improper or missing value " |
| | "for \""+std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | value = def_value; |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = \""+ |
| | cvm::to_str(def_value)+"\" [default]\n"); |
| | } |
| | } |
| | |
| | return b_found_any; |
| | } |
| | |
| | |
| // multiple-value keyword parsers | // multiple-value keyword parsers |
| | |
| _get_keyval_vector_(int); | template<typename TYPE> bool colvarparse::_get_keyval_vector_(std::string const &conf, |
| _get_keyval_vector_(size_t); | char const *key, |
| _get_keyval_vector_(long); | std::vector<TYPE> &values, |
| _get_keyval_vector_(std::string); | std::vector<TYPE> const &def_values, |
| _get_keyval_vector_(cvm::real); | Parse_Mode const parse_mode) |
| _get_keyval_vector_(cvm::rvector); | { |
| _get_keyval_vector_(cvm::quaternion); | std::string data; |
| _get_keyval_vector_(colvarvalue); | bool b_found = false, b_found_any = false; |
| | size_t save_pos = 0, found_count = 0; |
| | |
| | do { |
| | std::string data_this = ""; |
| | b_found = key_lookup(conf, key, data_this, save_pos); |
| | if (b_found) { |
| | if (!b_found_any) |
| | b_found_any = true; |
| | found_count++; |
| | data = data_this; |
| | } |
| | } while (b_found); |
| | |
| | if (found_count > 1) |
| | cvm::log("Warning: found more than one instance of \""+ |
| | std::string(key)+"\".\n"); |
| | |
| | if (data.size()) { |
| | std::istringstream is(data); |
| | |
| | if (values.size() == 0) { |
| | |
| | std::vector<TYPE> x; |
| | if (def_values.size()) |
| | x = def_values; |
| | else |
| | x.assign(1, TYPE()); |
| | |
| | for (size_t i = 0; |
| | ( is >> x[ ((i<x.size()) ? i : x.size()-1) ] ); |
| | i++) { |
| | values.push_back(x[ ((i<x.size()) ? i : x.size()-1) ]); |
| | } |
| | |
| | } else { |
| | |
| | size_t i = 0; |
| | for ( ; i < values.size(); i++) { |
| | TYPE x(values[i]); |
| | if (is >> x) { |
| | values[i] = x; |
| | } else { |
| | cvm::error("Error: in parsing \""+ |
| | std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | } |
| | } |
| | |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = "+ |
| | cvm::to_str(values)+"\n"); |
| | } |
| | |
| | } else { |
| | |
| | if (b_found_any) { |
| | cvm::error("Error: improper or missing values for \""+ |
| | std::string(key)+"\".\n", INPUT_ERROR); |
| | } |
| | |
| | for (size_t i = 0; i < values.size(); i++) |
| | values[i] = def_values[ (i > def_values.size()) ? 0 : i ]; |
| | |
| | if (parse_mode != parse_silent) { |
| | cvm::log("# "+std::string(key)+" = "+ |
| | cvm::to_str(def_values)+" [default]\n"); |
| | } |
| | } |
| | |
| | return b_found_any; |
| | } |
| | |
| | |
| | // single-value keyword parsers |
| | |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | int &value, |
| | int const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<int>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | size_t &value, |
| | size_t const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<size_t>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | long &value, |
| | long const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<long>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::string &value, |
| | std::string const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_string_(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | cvm::real &value, |
| | cvm::real const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<cvm::real>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | cvm::rvector &value, |
| | cvm::rvector const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<cvm::rvector>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | cvm::quaternion &value, |
| | cvm::quaternion const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<cvm::quaternion>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | colvarvalue &value, |
| | colvarvalue const &def_value, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_scalar_<colvarvalue>(conf, key, value, def_value, parse_mode); |
| | } |
| | |
| | |
| bool colvarparse::get_keyval(std::string const &conf, | bool colvarparse::get_keyval(std::string const &conf, |
| |
| (data == std::string("false")) ) { | (data == std::string("false")) ) { |
| value = false; | value = false; |
| } else | } else |
| cvm::fatal_error("Error: boolean values only are allowed " | cvm::error("Error: boolean values only are allowed " |
| "for \""+std::string(key)+"\".\n"); | "for \""+std::string(key)+"\".\n", INPUT_ERROR); |
| if (parse_mode != parse_silent) { | if (parse_mode != parse_silent) { |
| cvm::log("# "+std::string(key)+" = "+ | cvm::log("# "+std::string(key)+" = "+ |
| (value ? "on" : "off")+"\n"); | (value ? "on" : "off")+"\n"); |
| |
| } | } |
| | |
| | |
| | // multiple-value keyword parsers |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<int> &values, |
| | std::vector<int> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<int>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<size_t> &values, |
| | std::vector<size_t> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<size_t>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<long> &values, |
| | std::vector<long> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<long>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<std::string> &values, |
| | std::vector<std::string> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<std::string>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<cvm::real> &values, |
| | std::vector<cvm::real> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<cvm::real>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<cvm::rvector> &values, |
| | std::vector<cvm::rvector> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<cvm::rvector>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<cvm::quaternion> &values, |
| | std::vector<cvm::quaternion> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<cvm::quaternion>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | bool colvarparse::get_keyval(std::string const &conf, |
| | char const *key, |
| | std::vector<colvarvalue> &values, |
| | std::vector<colvarvalue> const &def_values, |
| | Parse_Mode const parse_mode) |
| | { |
| | return _get_keyval_vector_<colvarvalue>(conf, key, values, def_values, parse_mode); |
| | } |
| | |
| | |
| void colvarparse::add_keyword(char const *key) | void colvarparse::add_keyword(char const *key) |
| { | { |
| for (std::list<std::string>::iterator ki = allowed_keywords.begin(); | for (std::list<std::string>::iterator ki = allowed_keywords.begin(); |
| |
| } | } |
| } | } |
| if (!found_keyword) { | if (!found_keyword) { |
| cvm::log("Error: keyword \""+uk+"\" is not supported, " | cvm::error("Error: keyword \""+uk+"\" is not supported, " |
| "or not recognized in this context.\n"); | "or not recognized in this context.\n", INPUT_ERROR); |
| cvm::set_error_bits(INPUT_ERROR); | return INPUT_ERROR; |
| return COLVARS_ERROR; | |
| } | } |
| } | } |
| | |
| |
| std::string &data, | std::string &data, |
| size_t &save_pos) | size_t &save_pos) |
| { | { |
| | if (cvm::debug()) { |
| | cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); |
| | } |
| | |
| // add this keyword to the register (in its camelCase version) | // add this keyword to the register (in its camelCase version) |
| add_keyword(key_in); | add_keyword(key_in); |
| | |
| |
| // start from the first occurrence of key | // start from the first occurrence of key |
| size_t pos = conf_lower.find(key, save_pos); | size_t pos = conf_lower.find(key, save_pos); |
| | |
| // iterate over all instances until it finds the isolated keyword | // iterate over all instances of the substring until it finds it as isolated keyword |
| while (true) { | while (true) { |
| | |
| if (pos == std::string::npos) { | if (pos == std::string::npos) { |
| // no valid instance of the keyword has been found | // no valid instance of the keyword has been found |
| | if (cvm::debug()) { |
| | cvm::log("Keyword \""+std::string(key_in)+"\" not found.\n"); |
| | } |
| return false; | return false; |
| } | } |
| | |
| |
| size_t data_begin = (to_lower_cppstr(line)).find(key) + key.size(); | size_t data_begin = (to_lower_cppstr(line)).find(key) + key.size(); |
| data_begin = line.find_first_not_of(white_space, data_begin+1); | data_begin = line.find_first_not_of(white_space, data_begin+1); |
| | |
| // size_t data_begin_absolute = data_begin + line_begin; | |
| // size_t data_end_absolute = data_begin; | |
| | |
| if (data_begin != std::string::npos) { | if (data_begin != std::string::npos) { |
| | |
| size_t data_end = line.find_last_not_of(white_space) + 1; | size_t data_end = line.find_last_not_of(white_space) + 1; |
| data_end = (data_end == std::string::npos) ? line.size() : data_end; | data_end = (data_end == std::string::npos) ? line.size() : data_end; |
| // data_end_absolute = data_end + line_begin; | |
| | |
| if (line.find('{', data_begin) != std::string::npos) { | size_t brace = line.find('{', data_begin); // look for an opening brace |
| | size_t brace_last = brace; |
| | |
| size_t brace_count = 1; | if (brace != std::string::npos) { |
| size_t brace = line.find('{', data_begin); // start from the first opening brace | |
| | // find the matching closing brace |
| | |
| | if (cvm::debug()) { |
| | cvm::log("Multi-line value, config is now \""+line+"\".\n"); |
| | } |
| | |
| | int brace_count = 1; |
| | |
| while (brace_count > 0) { | while (brace_count > 0) { |
| | |
| // find the matching closing brace | brace = line.find_first_of("{}", brace_last+1); |
| | // find all braces within this line |
| | while (brace < std::string::npos) { |
| | brace_last = brace; |
| | if (line[brace] == '{') brace_count++; |
| | if (line[brace] == '}') brace_count--; |
| | if (brace_count == 0) { |
| | data_end = brace+1; |
| | break; |
| | } |
| brace = line.find_first_of("{}", brace+1); | brace = line.find_first_of("{}", brace+1); |
| while (brace == std::string::npos) { | } |
| | |
| | if (brace_count == 0) { |
| | data_end = brace+1; |
| | break; |
| | } |
| | |
| | if (brace == std::string::npos) { |
| | |
| // add a new line | // add a new line |
| if (line_end >= conf.size()) { | if (line_end >= conf.size()) { |
| cvm::fatal_error("Parse error: reached the end while " | cvm::error("Parse error: reached the end while " |
| "looking for closing brace; until now " | "looking for closing brace; until now " |
| "the following was parsed: \"\n"+ | "the following was parsed: \"\n"+ |
| line+"\".\n"); | line+"\".\n", INPUT_ERROR); |
| return false; | return false; |
| } | } |
| size_t const old_end = line.size(); | |
| // data_end_absolute += old_end+1; | |
| | |
| line_begin = line_end; | line_begin = line_end; |
| nl = conf.find('\n', line_begin+1); | nl = conf.find('\n', line_begin+1); |
| |
| line_end = nl; | line_end = nl; |
| line.append(conf, line_begin, (line_end-line_begin)); | line.append(conf, line_begin, (line_end-line_begin)); |
| | |
| brace = line.find_first_of("{}", old_end); | if (cvm::debug()) { |
| | cvm::log("Added a new line, config is now \""+line+"\".\n"); |
| | } |
| } | } |
| | |
| if (line[brace] == '{') brace_count++; | if (brace_count < 0) { |
| if (line[brace] == '}') brace_count--; | cvm::error("Error: found closing brace without opening brace.\n", INPUT_ERROR); |
| | } |
| } | } |
| | |
| // set data_begin after the opening brace | // strip the leading and trailing braces |
| data_begin = line.find_first_of('{', data_begin) + 1; | data_begin = line.find_first_of('{') + 1; |
| data_begin = line.find_first_not_of(white_space, | data_begin = line.find_first_not_of(white_space, |
| data_begin); | data_begin); |
| // set data_end before the closing brace | |
| data_end = brace; | |
| data_end = line.find_last_not_of(white_space+"}", | |
| data_end) + 1; | |
| // data_end_absolute = line_end; | |
| | |
| if (data_end > line.size()) | data_end = line.find_last_of('}', line.size()) - 1; |
| data_end = line.size(); | data_end = line.find_last_not_of(white_space, |
| | data_end) + 1; |
| } | } |
| | |
| data.append(line, data_begin, (data_end-data_begin)); | data.append(line, data_begin, (data_end-data_begin)); |
| | |
| | if (cvm::debug()) { |
| | cvm::log("Keyword value = \""+data+"\".\n"); |
| | } |
| | |
| if (data.size() && save_delimiters) { | if (data.size() && save_delimiters) { |
| data_begin_pos.push_back(conf.find(data, pos+key.size())); | data_begin_pos.push_back(conf.find(data, pos+key.size())); |
| data_end_pos.push_back(data_begin_pos.back()+data.size()); | data_end_pos.push_back(data_begin_pos.back()+data.size()); |
| // std::cerr << "key = " << key << ", data = \"" | |
| // << data << "\", data_begin, data_end = " | |
| // << data_begin_pos.back() << ", " << data_end_pos.back() | |
| // << "\n"; | |
| } | } |
| } | } |
| | |