using namespace std;
+namespace {
+
+template<bool long_sep, bool allow_empty>
+vector<string> do_split(const string &str, const string &sep, int max_split)
+{
+ vector<string> result;
+
+ unsigned start=0;
+ while(start<str.size())
+ {
+ unsigned end=long_sep ? str.find(sep, start) : str.find_first_of(sep, start);
+ if(end!=start || allow_empty)
+ {
+ if(max_split>=0 && result.size()==static_cast<unsigned>(max_split))
+ {
+ result.push_back(str.substr(start));
+ break;
+ }
+ else
+ result.push_back(str.substr(start, end-start));
+ }
+
+ if(end>str.size())
+ break;
+
+ start=end+(long_sep ? sep.size() : 1);
+
+ if(allow_empty && start==str.size())
+ result.push_back(string());
+ }
+
+ return result;
+}
+
+}
+
namespace Msp {
/**
return result;
}
+vector<string> split_fields(const string &str, const string &sep, int max_split)
+{
+ return do_split<true, true>(str, sep, max_split);
+}
+
+vector<string> split_fields(const string &str, char sep, int max_split)
+{
+ return split_fields(str, string(1, sep), max_split);
+}
+
+vector<string> split_long(const string &str, const string &sep, int max_split)
+{
+ return do_split<true, false>(str, sep, max_split);
+}
+
+vector<string> split(const string &str, const string &sep, int max_split)
+{
+ return do_split<false, false>(str, sep, max_split);
+}
+
+vector<string> split(const string &str, char sep, int max_split)
+{
+ return split(str, string(1, sep), max_split);
+}
+
/**
Splits a string to parts.
string strip(const string &s)
{
string result=s;
- if(!result.erase(0, result.find_first_not_of(" \t\n")).empty())
- result.erase(result.find_last_not_of(" \t\n")+1);
+ if(!result.erase(0, result.find_first_not_of(" \t\r\n")).empty())
+ result.erase(result.find_last_not_of(" \t\r\n")+1);
return result;
}
int strcasecmp(const std::string &, const std::string &);
std::string tolower(const std::string &);
std::string toupper(const std::string &);
-std::vector<std::string> split(const std::string &, const std::string & =" \t\r\n", bool =false);
-std::vector<std::string> split(const std::string &, char, bool =false);
+
+std::vector<std::string> split_fields(const std::string &, const std::string &, int =-1);
+std::vector<std::string> split_fields(const std::string &, char, int =-1);
+std::vector<std::string> split_long(const std::string &, const std::string &, int =-1);
+std::vector<std::string> split(const std::string &, const std::string & =" \t\r\n", int =-1);
+std::vector<std::string> split(const std::string &, char, int =-1);
+
template<typename T>
std::string join(const T &, const std::string & =" ");
std::string strip(const std::string &);