]> git.tdb.fi Git - libs/core.git/commitdiff
Revamp the split functions to allow a max_split argument and splitting by longer...
authorMikko Rasa <tdb@tdb.fi>
Fri, 3 Aug 2007 09:47:32 +0000 (09:47 +0000)
committerMikko Rasa <tdb@tdb.fi>
Fri, 3 Aug 2007 09:47:32 +0000 (09:47 +0000)
Add \r to strip

source/utils.cpp
source/utils.h

index 1feb08659bff1a54d0360ca196287af04919821b..244055b232cb81df6347f9200d315683d372aff3 100644 (file)
@@ -10,6 +10,42 @@ Distributed under the LGPL
 
 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 {
 
 /**
@@ -55,6 +91,31 @@ string toupper(const string &str)
        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.
 
@@ -127,8 +188,8 @@ removed.
 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;
 }
 
index 39b330bc9eaed20915de6cc70f8d2fdd52bc0fc5..d0d8a171ba29740ecc406bc5b96f2889c45f5056 100644 (file)
@@ -16,8 +16,13 @@ namespace Msp {
 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 &);