blob: 386d74a4798353d52e80a8e98c99b4a39ada71b9 [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
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000014#include "llvm/ADT/StringExtras.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000015#include "llvm/ADT/SmallVector.h"
Francis Visoiu Mistrih26d6fc12017-11-28 14:22:27 +000016#include "llvm/Support/raw_ostream.h"
Chris Lattnerdca358f2003-12-29 05:07:02 +000017using namespace llvm;
18
Benjamin Kramer6bf82402010-01-11 19:45:18 +000019/// StrInStrNoCase - Portable version of strcasestr. Locates the first
20/// occurrence of string 's1' in string 's2', ignoring case. Returns
21/// the offset of s2 in s1 or npos if s2 cannot be found.
22StringRef::size_type llvm::StrInStrNoCase(StringRef s1, StringRef s2) {
23 size_t N = s2.size(), M = s1.size();
24 if (N > M)
25 return StringRef::npos;
26 for (size_t i = 0, e = M - N + 1; i != e; ++i)
27 if (s1.substr(i, N).equals_lower(s2))
28 return i;
29 return StringRef::npos;
30}
31
Chris Lattnerdca358f2003-12-29 05:07:02 +000032/// getToken - This function extracts one token from source, ignoring any
33/// leading characters that appear in the Delimiters string, and ending the
34/// token at any of the characters that appear in the Delimiters string. If
35/// there are no tokens in the source string, an empty string is returned.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000036/// The function returns a pair containing the extracted token and the
37/// remaining tail string.
38std::pair<StringRef, StringRef> llvm::getToken(StringRef Source,
39 StringRef Delimiters) {
Chris Lattnerdca358f2003-12-29 05:07:02 +000040 // Figure out where the token starts.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000041 StringRef::size_type Start = Source.find_first_not_of(Delimiters);
Chris Lattnerdca358f2003-12-29 05:07:02 +000042
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000043 // Find the next occurrence of the delimiter.
44 StringRef::size_type End = Source.find_first_of(Delimiters, Start);
Chris Lattnerdca358f2003-12-29 05:07:02 +000045
Benjamin Kramer608fd2b2010-01-18 12:40:05 +000046 return std::make_pair(Source.slice(Start, End), Source.substr(End));
Chris Lattnerdca358f2003-12-29 05:07:02 +000047}
Chris Lattner10258402006-07-14 22:54:39 +000048
Chris Lattner228bcd32006-11-28 22:32:35 +000049/// SplitString - Split up the specified string according to the specified
50/// delimiters, appending the result fragments to the output list.
Benjamin Kramerc6fe3c32010-01-11 18:03:24 +000051void llvm::SplitString(StringRef Source,
52 SmallVectorImpl<StringRef> &OutFragments,
53 StringRef Delimiters) {
Chris Lattner5cf753c2011-07-21 06:21:31 +000054 std::pair<StringRef, StringRef> S = getToken(Source, Delimiters);
55 while (!S.first.empty()) {
56 OutFragments.push_back(S.first);
57 S = getToken(S.second, Delimiters);
Chris Lattner228bcd32006-11-28 22:32:35 +000058 }
59}
Francis Visoiu Mistrih26d6fc12017-11-28 14:22:27 +000060
Jonas Devlieghere745918ff2018-05-31 17:01:42 +000061void llvm::printEscapedString(StringRef Name, raw_ostream &Out) {
Benjamin Kramerd15b2892018-01-26 20:21:02 +000062 for (unsigned i = 0, e = Name.size(); i != e; ++i) {
63 unsigned char C = Name[i];
Michael Kruse6f1da6e2018-07-26 15:31:41 +000064 if (isPrint(C) && C != '\\' && C != '"')
Benjamin Kramerd15b2892018-01-26 20:21:02 +000065 Out << C;
66 else
67 Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
68 }
69}
70
Jonas Devlieghere745918ff2018-05-31 17:01:42 +000071void llvm::printHTMLEscaped(StringRef String, raw_ostream &Out) {
Jonas Devliegheref4ce54a2018-05-30 17:47:11 +000072 for (char C : String) {
73 if (C == '&')
74 Out << "&amp;";
75 else if (C == '<')
76 Out << "&lt;";
77 else if (C == '>')
78 Out << "&gt;";
79 else if (C == '\"')
80 Out << "&quot;";
81 else if (C == '\'')
82 Out << "&apos;";
83 else
84 Out << C;
85 }
86}
87
Francis Visoiu Mistrih26d6fc12017-11-28 14:22:27 +000088void llvm::printLowerCase(StringRef String, raw_ostream &Out) {
89 for (const char C : String)
90 Out << toLower(C);
91}