X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FStringExtras.cpp;h=d77ad7f55a18e11cea396d59990dd01d557531a2;hb=3f0e8837be1414981558186f9688c4ff35dc1815;hp=2363ad60d1789ff6c63fde3e4f41f71d86882770;hpb=c30837d6c1ee814ba62e32848e1d2cbfb7385953;p=oota-llvm.git diff --git a/lib/Support/StringExtras.cpp b/lib/Support/StringExtras.cpp index 2363ad60d17..d77ad7f55a1 100644 --- a/lib/Support/StringExtras.cpp +++ b/lib/Support/StringExtras.cpp @@ -16,6 +16,19 @@ #include "llvm/ADT/StringExtras.h" using namespace llvm; +/// StrInStrNoCase - Portable version of strcasestr. Locates the first +/// occurrence of string 's1' in string 's2', ignoring case. Returns +/// the offset of s2 in s1 or npos if s2 cannot be found. +StringRef::size_type llvm::StrInStrNoCase(StringRef s1, StringRef s2) { + size_t N = s2.size(), M = s1.size(); + if (N > M) + return StringRef::npos; + for (size_t i = 0, e = M - N + 1; i != e; ++i) + if (s1.substr(i, N).equals_lower(s2)) + return i; + return StringRef::npos; +} + /// getToken - This function extracts one token from source, ignoring any /// leading characters that appear in the Delimiters string, and ending the /// token at any of the characters that appear in the Delimiters string. If @@ -26,13 +39,11 @@ std::pair llvm::getToken(StringRef Source, StringRef Delimiters) { // Figure out where the token starts. StringRef::size_type Start = Source.find_first_not_of(Delimiters); - if (Start == StringRef::npos) Start = Source.size(); // Find the next occurrence of the delimiter. StringRef::size_type End = Source.find_first_of(Delimiters, Start); - if (End == StringRef::npos) End = Source.size(); - return std::make_pair(Source.substr(Start, End), Source.substr(End)); + return std::make_pair(Source.slice(Start, End), Source.substr(End)); } /// SplitString - Split up the specified string according to the specified @@ -40,43 +51,9 @@ std::pair llvm::getToken(StringRef Source, void llvm::SplitString(StringRef Source, SmallVectorImpl &OutFragments, StringRef Delimiters) { - StringRef S2, S; - tie(S2, S) = getToken(Source, Delimiters); - while (!S2.empty()) { - OutFragments.push_back(S2); - tie(S2, S) = getToken(S, Delimiters); - } -} - -// FIXME: remove when llvm-gcc doesn't use this anymore -void llvm::SplitString(StringRef Source, - std::vector &OutFragments, - StringRef Delimiters) { - StringRef S2, S; - tie(S2, S) = getToken(Source, Delimiters); - while (!S2.empty()) { - OutFragments.push_back(S2); - tie(S2, S) = getToken(S, Delimiters); - } -} - -void llvm::StringRef::split(SmallVectorImpl &A, - StringRef Separators, int MaxSplit, - bool KeepEmpty) const { - StringRef rest = *this; - - // 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 p = rest.split(Separators); - - if (p.first.size() != 0 || KeepEmpty) - A.push_back(p.first); - rest = p.second; + std::pair S = getToken(Source, Delimiters); + while (!S.first.empty()) { + OutFragments.push_back(S.first); + S = getToken(S.second, Delimiters); } - // If we have a tail left, add it. - if (rest.data() != NULL && (rest.size() != 0 || KeepEmpty)) - A.push_back(rest); }