summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@debian.org>2013-09-07 13:12:50 +0200
committerMichael Vogt <mvo@debian.org>2013-09-07 13:12:50 +0200
commit85bf001994fa59ca979293af3abb89d3486e0afb (patch)
tree9ede8d92d8b143506eecb2287f7891876ca2bd77
parent00f4d9ffa3468e899abf8fbda8db71fc3143b8e5 (diff)
add maxsplit parameter to StringSplit
-rw-r--r--apt-pkg/contrib/strutl.cc18
-rw-r--r--apt-pkg/contrib/strutl.h2
-rw-r--r--test/libapt/strutil_test.cc6
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;
}