blob: 3e2420f67760513a0adb341118a083126bcdfd2f [file] [log] [blame]
Chris Lattnerdca358f2003-12-29 05:07:02 +00001//===-- StringExtras.cpp - Implement the StringExtras header --------------===//
Misha Brukman10468d82005-04-21 22:55:34 +00002//
Chris Lattnerdca358f2003-12-29 05:07:02 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman10468d82005-04-21 22:55:34 +00007//
Chris Lattnerdca358f2003-12-29 05:07:02 +00008//===----------------------------------------------------------------------===//
9//
10// This file implements the StringExtras.h header
11//
12//===----------------------------------------------------------------------===//
13
Rafael Espindola7c685492009-11-13 02:18:25 +000014#include "llvm/ADT/SmallVector.h"
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000015#include "llvm/ADT/StringExtras.h"
Chris Lattnerdca358f2003-12-29 05:07:02 +000016using namespace llvm;
17
Benjamin Kramer6bf82402010-01-11 19:45:18 +000018/// StrInStrNoCase - Portable version of strcasestr. Locates the first
19/// occurrence of string 's1' in string 's2', ignoring case. Returns
20/// the offset of s2 in s1 or npos if s2 cannot be found.
21StringRef::size_type llvm::StrInStrNoCase(StringRef s1, StringRef s2) {
22 size_t N = s2.size(), M = s1.size();
23 if (N > M)
24 return StringRef::npos;
25 for (size_t i = 0, e = M - N + 1; i != e; ++i)
26 if (s1.substr(i, N).equals_lower(s2))
27 return i;
28 return StringRef::npos;
29}
30
Chris Lattnerdca358f2003-12-29 05:07:02 +000031/// getToken - This function extracts one token from source, ignoring any
32/// leading characters that appear in the Delimiters string, and ending the
33/// token at any of the characters that appear in the Delimiters string. If
34/// there are no tokens in the source string, an empty string is returned.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000035/// The function returns a pair containing the extracted token and the
36/// remaining tail string.
37std::pair<StringRef, StringRef> llvm::getToken(StringRef Source,
38 StringRef Delimiters) {
Chris Lattnerdca358f2003-12-29 05:07:02 +000039 // Figure out where the token starts.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000040 StringRef::size_type Start = Source.find_first_not_of(Delimiters);
Chris Lattnerdca358f2003-12-29 05:07:02 +000041
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000042 // Find the next occurrence of the delimiter.
43 StringRef::size_type End = Source.find_first_of(Delimiters, Start);
Chris Lattnerdca358f2003-12-29 05:07:02 +000044
Benjamin Kramer608fd2b2010-01-18 12:40:05 +000045 return std::make_pair(Source.slice(Start, End), Source.substr(End));
Chris Lattnerdca358f2003-12-29 05:07:02 +000046}
Chris Lattner10258402006-07-14 22:54:39 +000047
Chris Lattner228bcd32006-11-28 22:32:35 +000048/// SplitString - Split up the specified string according to the specified
49/// delimiters, appending the result fragments to the output list.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000050void llvm::SplitString(StringRef Source,
51 SmallVectorImpl<StringRef> &OutFragments,
52 StringRef Delimiters) {
Chris Lattner5cf753c2011-07-21 06:21:31 +000053 std::pair<StringRef, StringRef> S = getToken(Source, Delimiters);
54 while (!S.first.empty()) {
55 OutFragments.push_back(S.first);
56 S = getToken(S.second, Delimiters);
Chris Lattner228bcd32006-11-28 22:32:35 +000057 }
58}