1872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner//===-- StringExtras.cpp - Implement the StringExtras header --------------===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 3872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner// The LLVM Compiler Infrastructure 4872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 8872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner//===----------------------------------------------------------------------===// 9872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner// 10872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner// This file implements the StringExtras.h header 11872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner// 12872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner//===----------------------------------------------------------------------===// 13872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner 14c78c0c99a0fe1703ae72fc51e440aaa8e4e19e91Rafael Espindola#include "llvm/ADT/SmallVector.h" 15d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer#include "llvm/ADT/STLExtras.h" 16d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer#include "llvm/ADT/StringExtras.h" 17872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattnerusing namespace llvm; 18872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner 197462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer/// StrInStrNoCase - Portable version of strcasestr. Locates the first 207462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer/// occurrence of string 's1' in string 's2', ignoring case. Returns 217462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer/// the offset of s2 in s1 or npos if s2 cannot be found. 227462b5dd99163785480a11a7c999569b349a137cBenjamin KramerStringRef::size_type llvm::StrInStrNoCase(StringRef s1, StringRef s2) { 237462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer size_t N = s2.size(), M = s1.size(); 247462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer if (N > M) 257462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer return StringRef::npos; 267462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer for (size_t i = 0, e = M - N + 1; i != e; ++i) 277462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer if (s1.substr(i, N).equals_lower(s2)) 287462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer return i; 297462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer return StringRef::npos; 307462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer} 317462b5dd99163785480a11a7c999569b349a137cBenjamin Kramer 32872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner/// getToken - This function extracts one token from source, ignoring any 33872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner/// leading characters that appear in the Delimiters string, and ending the 34872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner/// token at any of the characters that appear in the Delimiters string. If 35872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner/// there are no tokens in the source string, an empty string is returned. 36d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer/// The function returns a pair containing the extracted token and the 37d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer/// remaining tail string. 38d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramerstd::pair<StringRef, StringRef> llvm::getToken(StringRef Source, 39d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer StringRef Delimiters) { 40872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner // Figure out where the token starts. 41d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer StringRef::size_type Start = Source.find_first_not_of(Delimiters); 42f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman 43d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer // Find the next occurrence of the delimiter. 44d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer StringRef::size_type End = Source.find_first_of(Delimiters, Start); 45f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman 464e7e2f5a365e55d845843606bd52cf35c8f4e672Benjamin Kramer return std::make_pair(Source.slice(Start, End), Source.substr(End)); 47872ccce0a801930aa370f8d161ceb9d6b1a3bdaeChris Lattner} 4853eca9466f5dc10bba86f94fa1a55a1e8f36baf2Chris Lattner 49d5b58c239e44fe4fa2322900b26c691f5a44bd87Chris Lattner/// SplitString - Split up the specified string according to the specified 50d5b58c239e44fe4fa2322900b26c691f5a44bd87Chris Lattner/// delimiters, appending the result fragments to the output list. 51d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramervoid llvm::SplitString(StringRef Source, 52d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer SmallVectorImpl<StringRef> &OutFragments, 53d4f195999a7774611e5f9e457a86f14d5e257324Benjamin Kramer StringRef Delimiters) { 54c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner std::pair<StringRef, StringRef> S = getToken(Source, Delimiters); 55c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner while (!S.first.empty()) { 56c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner OutFragments.push_back(S.first); 57c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner S = getToken(S.second, Delimiters); 58d5b58c239e44fe4fa2322900b26c691f5a44bd87Chris Lattner } 59d5b58c239e44fe4fa2322900b26c691f5a44bd87Chris Lattner} 60