Distinguish "a," from "a". The first one splits into "a" + "" and the second one...
[oota-llvm.git] / lib / Support / StringExtras.cpp
index 05ba34b2e7b08cfe7ac689daa1d66ed1b981224e..1b233ab200ae703b79b273d59d37cdf2c3509a21 100644 (file)
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/SmallVector.h"
 #include <cstring>
 using namespace llvm;
 
@@ -57,13 +58,15 @@ void llvm::SplitString(const std::string &Source,
   }
 }
 
-void llvm::StringRef::split(std::vector<StringRef> &A,
-                            StringRef Separators, unsigned MaxSplit,
+void llvm::StringRef::split(SmallVectorImpl<StringRef> &A,
+                            StringRef Separators, int MaxSplit,
                             bool KeepEmpty) const {
   StringRef rest = *this;
 
-  for (unsigned splits = 0;
-       rest.size() != 0 && (MaxSplit < 0 || splits < MaxSplit);
+  // rest.data() is used to distinguish cases like "a," that splits into
+  // "a" + "" and "a" that splits into "a" + 0.
+  for (int splits = 0;
+       rest.data() != NULL && (MaxSplit < 0 || splits < MaxSplit);
        ++splits) {
     std::pair<llvm::StringRef, llvm::StringRef> p = rest.split(Separators);
 
@@ -71,7 +74,7 @@ void llvm::StringRef::split(std::vector<StringRef> &A,
       A.push_back(p.first);
     rest = p.second;
   }
-
-  if (rest.size() != 0 || KeepEmpty)
+  // If we have a tail left, add it.
+  if (rest.data() != NULL && (rest.size() != 0 || KeepEmpty))
     A.push_back(rest);
 }