27 std::string delimiters;
28 std::string opening_brackets;
29 std::map<char,char> brackets;
31 bool preserve_numeric_ranges;
32 bool isnumeric (
char c);
33 bool part_of_numeric_range (
const std::string& s, std::string::size_type pos);
41 void add_bracket (
char open,
char close);
44 void set_delimiters (
const std::string& d) { delimiters = d; }
47 void set_preserve_numeric_ranges (
bool f) { preserve_numeric_ranges = f; }
49 template<
typename Container>
50 void separate (std::string text, Container& container);
53template<
typename Container>
54void Separator::separate (std::string text, Container& container)
57 std::cerr <<
"Separator::separate"
58 " delimiters=\"" << delimiters <<
"\""
59 " opening brackets=\"" << opening_brackets <<
"\"" << std::endl;
61 std::string opener = delimiters + opening_brackets;
74 std::string::size_type end = 0;
76 while ( (end = text.find_first_of (opener, end) ) != std::string::npos )
78 if ( opening_brackets.find (text[end]) != std::string::npos )
81 std::cerr <<
"Separator::separate '" << text[end] <<
"'"
82 " is an opening bracket" << std::endl;
84 end = text.find (brackets[text[end]], end+1);
87 else if (preserve_numeric_ranges && part_of_numeric_range (text, end))
90 std::cerr <<
"Separator::separate '" << text[end] <<
"'"
91 " is part of a numeric range" << std::endl;
98 std::cerr <<
"Separator::separate '" << text[end] <<
"'"
99 " is naked" << std::endl;
106 std::string token = text.substr (0, end);
108 std::string::size_type length = token.length();
111 std::cerr <<
"Separator::separate token='" << token <<
"'" << std::endl;
114 if ( (token[0] ==
'"' && token[length-1] ==
'"') ||
115 (token[0] ==
'\'' && token[length-1] ==
'\'') )
117 token = token.substr (1, length-2);
119 std::cerr <<
"Separator::separate quotation stripped token ='" << token <<
"'" << std::endl;
123 container.push_back (token);
125 end = text.find_first_not_of (delimiters, end);
129 std::cerr <<
"Separator::separate text='" << text <<
"'" << std::endl;