Просмотр исходного кода

add maxsplit parameter to StringSplit

Michael Vogt лет назад: 13
Родитель
Сommit
85bf001994
3 измененных файлов с 20 добавлено и 6 удалено
  1. 13 5
      apt-pkg/contrib/strutl.cc
  2. 1 1
      apt-pkg/contrib/strutl.h
  3. 6 0
      test/libapt/strutil_test.cc

+ 13 - 5
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
 /* This can be used to split a given string up into a vector of strings
  * The seperator is a string
  * 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;
    vector<string> split;
    size_t start, pos;
    size_t start, pos;
-   start = pos = 0;
+
    if(sep.size() == 0)
    if(sep.size() == 0)
       return split;
       return split;
-   
+
+   start = pos = 0;
    do {
    do {
       pos = s.find(sep, start);
       pos = s.find(sep, start);
       split.push_back(s.substr(start, pos-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);
    } while (pos != string::npos);
    return split;
    return split;
 }
 }

+ 1 - 1
apt-pkg/contrib/strutl.h

@@ -66,7 +66,7 @@ bool TokSplitString(char Tok,char *Input,char **List,
 		    unsigned long ListMax);
 		    unsigned long ListMax);
 std::vector<std::string> VectorizeString(std::string const &haystack, char const &split) __attrib_const;
 std::vector<std::string> VectorizeString(std::string const &haystack, char const &split) __attrib_const;
 // like python string.split
 // 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 ioprintf(std::ostream &out,const char *format,...) __like_printf(2);
 void strprintf(std::string &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);
 char *safe_snprintf(char *Buffer,char *End,const char *Format,...) __like_printf(3);

+ 6 - 0
test/libapt/strutil_test.cc

@@ -59,5 +59,11 @@ int main(int argc,char *argv[])
    result = StringSplit(input, "");
    result = StringSplit(input, "");
    equals(result.size(), 0);
    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;
    return 0;
 }
 }