Explorar el Código

implement StringSplit() as we need this to fix the dpkg status-fd output parsing

Michael Vogt hace 13 años
padre
commit
00f4d9ffa3
Se han modificado 3 ficheros con 41 adiciones y 0 borrados
  1. 22 0
      apt-pkg/contrib/strutl.cc
  2. 2 0
      apt-pkg/contrib/strutl.h
  3. 17 0
      test/libapt/strutil_test.cc

+ 22 - 0
apt-pkg/contrib/strutl.cc

@@ -1118,6 +1118,28 @@ vector<string> VectorizeString(string const &haystack, char const &split)
    return exploded;
    return exploded;
 }
 }
 									/*}}}*/
 									/*}}}*/
+// StringSplit - like python string.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> split;
+   size_t start, pos;
+   start = pos = 0;
+   if(sep.size() == 0)
+      return split;
+   
+   do {
+      pos = s.find(sep, start);
+      split.push_back(s.substr(start, pos-start));
+      if(pos != string::npos)
+         start = pos+sep.size();
+   } while (pos != string::npos);
+   return split;
+}
+									/*}}}*/
 // RegexChoice - Simple regex list/list matcher				/*{{{*/
 // RegexChoice - Simple regex list/list matcher				/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */

+ 2 - 0
apt-pkg/contrib/strutl.h

@@ -65,6 +65,8 @@ bool Hex2Num(const std::string &Str,unsigned char *Num,unsigned int Length);
 bool TokSplitString(char Tok,char *Input,char **List,
 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
+std::vector<std::string> StringSplit(std::string const &haystack, std::string const &sep) __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);

+ 17 - 0
test/libapt/strutil_test.cc

@@ -42,5 +42,22 @@ int main(int argc,char *argv[])
    output = DeEscapeString(input);
    output = DeEscapeString(input);
    equals(output, expected);
    equals(output, expected);
 
 
+   // Split
+   input = "status: libnet1:amd64: unpacked";
+   vector<std::string> result = StringSplit(input, ": ");
+   equals(result[0], "status");
+   equals(result[1], "libnet1:amd64");
+   equals(result[2], "unpacked");
+   equals(result.size(), 3);
+
+   input = "status: libnet1:amd64: unpacked";
+   result = StringSplit(input, "xxx");
+   equals(result[0], input);
+   equals(result.size(), 1);
+
+   input = "status: libnet1:amd64: unpacked";
+   result = StringSplit(input, "");
+   equals(result.size(), 0);
+
    return 0;
    return 0;
 }
 }