diff options
author | Michael Vogt <mvo@debian.org> | 2013-09-07 13:12:50 +0200 |
---|---|---|
committer | Michael Vogt <mvo@debian.org> | 2013-09-07 13:12:50 +0200 |
commit | 85bf001994fa59ca979293af3abb89d3486e0afb (patch) | |
tree | 9ede8d92d8b143506eecb2287f7891876ca2bd77 | |
parent | 00f4d9ffa3468e899abf8fbda8db71fc3143b8e5 (diff) |
add maxsplit parameter to StringSplit
-rw-r--r-- | apt-pkg/contrib/strutl.cc | 18 | ||||
-rw-r--r-- | apt-pkg/contrib/strutl.h | 2 | ||||
-rw-r--r-- | test/libapt/strutil_test.cc | 6 |
3 files changed, 20 insertions, 6 deletions
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 819d50de0..508af8922 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -1123,19 +1123,27 @@ vector<string> VectorizeString(string const &haystack, char const &split) /* This can be used to split a given string up into a vector of strings * The seperator is a string */ -vector<string> StringSplit(string const &s, std::string const &sep) +vector<string> StringSplit(string const &s, std::string const &sep, + unsigned int maxsplit) { vector<string> split; size_t start, pos; - start = pos = 0; + if(sep.size() == 0) return split; - + + start = pos = 0; do { pos = s.find(sep, start); split.push_back(s.substr(start, pos-start)); - if(pos != string::npos) - start = pos+sep.size(); + + // deal with the max-split + if(maxsplit > 0 && split.size() >= maxsplit) + { + split[split.size()-1] = s.substr(start); + break; + } + start = pos+sep.size(); } while (pos != string::npos); return split; } diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index c97246c90..944f91403 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -66,7 +66,7 @@ bool TokSplitString(char Tok,char *Input,char **List, unsigned long ListMax); std::vector<std::string> VectorizeString(std::string const &haystack, char const &split) __attrib_const; // like python string.split -std::vector<std::string> StringSplit(std::string const &haystack, std::string const &sep) __attrib_const; +std::vector<std::string> StringSplit(std::string const &haystack, std::string const &sep, unsigned int maxsplit=0) __attrib_const; void ioprintf(std::ostream &out,const char *format,...) __like_printf(2); void strprintf(std::string &out,const char *format,...) __like_printf(2); char *safe_snprintf(char *Buffer,char *End,const char *Format,...) __like_printf(3); diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc index bac9dd2f1..b044b7f34 100644 --- a/test/libapt/strutil_test.cc +++ b/test/libapt/strutil_test.cc @@ -59,5 +59,11 @@ int main(int argc,char *argv[]) result = StringSplit(input, ""); equals(result.size(), 0); + input = "x:y:z"; + result = StringSplit(input, ":", 2); + equals(result.size(), 2); + equals(result[0], "x"); + equals(result[1], "y:z"); + return 0; } |