1e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//===-- StringRef.cpp - Lightweight String References ---------------------===//
2e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//
3e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//                     The LLVM Compiler Infrastructure
4e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//
5e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar// License. See LICENSE.TXT for details.
7e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//
8e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar//===----------------------------------------------------------------------===//
9e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar
10e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar#include "llvm/ADT/StringRef.h"
111e7ad3993d8700488895fa372ecad55443f53485John McCall#include "llvm/ADT/APInt.h"
1213302ec089d56b91f5d4b775910439ab9a74fd41Ted Kremenek#include "llvm/ADT/OwningPtr.h"
13528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth#include "llvm/ADT/Hashing.h"
1401d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain#include "llvm/ADT/edit_distance.h"
15b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
16250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer#include <bitset>
17ad6b6da8aafa88fa3bd002f2595121e1227c4b93Douglas Gregor
18e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbarusing namespace llvm;
19e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar
2077696bebbcb011be861571b105193fc53614c153Daniel Dunbar// MSVC emits references to this into the translation units which reference it.
2177696bebbcb011be861571b105193fc53614c153Daniel Dunbar#ifndef _MSC_VER
22e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbarconst size_t StringRef::npos;
2377696bebbcb011be861571b105193fc53614c153Daniel Dunbar#endif
24cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
2505872ea804cdc9534960b30d28a391928c61481aBenjamin Kramerstatic char ascii_tolower(char x) {
2605872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  if (x >= 'A' && x <= 'Z')
2705872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer    return x - 'A' + 'a';
2805872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  return x;
2905872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer}
3005872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
31589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstatic char ascii_toupper(char x) {
32589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  if (x >= 'a' && x <= 'z')
33589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar    return x - 'a' + 'A';
34589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return x;
35589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
36589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
37160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesenstatic bool ascii_isdigit(char x) {
38160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  return x >= '0' && x <= '9';
39160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen}
40160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen
4105872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer/// compare_lower - Compare strings, ignoring case.
4205872ea804cdc9534960b30d28a391928c61481aBenjamin Kramerint StringRef::compare_lower(StringRef RHS) const {
4358ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
440043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    unsigned char LHC = ascii_tolower(Data[I]);
450043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    unsigned char RHC = ascii_tolower(RHS.Data[I]);
4605872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer    if (LHC != RHC)
4705872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer      return LHC < RHC ? -1 : 1;
4805872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  }
4905872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
5005872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  if (Length == RHS.Length)
510043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    return 0;
5205872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  return Length < RHS.Length ? -1 : 1;
5305872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer}
5405872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
55160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen/// compare_numeric - Compare strings, handle embedded numbers.
56160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesenint StringRef::compare_numeric(StringRef RHS) const {
57160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
587850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen    // Check for sequences of digits.
59160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    if (ascii_isdigit(Data[I]) && ascii_isdigit(RHS.Data[I])) {
607850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // The longer sequence of numbers is considered larger.
617850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // This doesn't really handle prefixed zeros well.
627850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      size_t J;
637850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      for (J = I + 1; J != E + 1; ++J) {
64160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        bool ld = J < Length && ascii_isdigit(Data[J]);
65160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        bool rd = J < RHS.Length && ascii_isdigit(RHS.Data[J]);
66160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        if (ld != rd)
67160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen          return rd ? -1 : 1;
68160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        if (!rd)
69160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen          break;
70160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen      }
717850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // The two number sequences have the same length (J-I), just memcmp them.
727850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      if (int Res = compareMemory(Data + I, RHS.Data + I, J - I))
737850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen        return Res < 0 ? -1 : 1;
747850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // Identical number sequences, continue search after the numbers.
757850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      I = J - 1;
767850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      continue;
77160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    }
787850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen    if (Data[I] != RHS.Data[I])
797850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      return (unsigned char)Data[I] < (unsigned char)RHS.Data[I] ? -1 : 1;
80160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  }
81160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  if (Length == RHS.Length)
820043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    return 0;
83160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  return Length < RHS.Length ? -1 : 1;
84160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen}
85160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen
867e54d5b1562f085c898bf8fcc4ac939ec893444cDouglas Gregor// Compute the edit distance between the two given strings.
87326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencerunsigned StringRef::edit_distance(llvm::StringRef Other,
885ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor                                  bool AllowReplacements,
895ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor                                  unsigned MaxEditDistance) {
9001d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain  return llvm::ComputeEditDistance(
9101d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      llvm::ArrayRef<char>(data(), size()),
9201d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      llvm::ArrayRef<char>(Other.data(), Other.size()),
9301d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      AllowReplacements, MaxEditDistance);
94441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor}
95441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor
9605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
97589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar// String Operations
98589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar//===----------------------------------------------------------------------===//
99589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
100589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstd::string StringRef::lower() const {
101589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  std::string Result(size(), char());
102589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  for (size_type i = 0, e = size(); i != e; ++i) {
103589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar    Result[i] = ascii_tolower(Data[i]);
104589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  }
105589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return Result;
106589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
107589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
108589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstd::string StringRef::upper() const {
109589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  std::string Result(size(), char());
110589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  for (size_type i = 0, e = size(); i != e; ++i) {
111a7b966fc8d63b9b9432e1b33b33d4be6179e1fffBenjamin Kramer    Result[i] = ascii_toupper(Data[i]);
112589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  }
113589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return Result;
114589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
115589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
116589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar//===----------------------------------------------------------------------===//
11705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner// String Searching
11805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
11905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
12005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
12105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// find - Search for the first string \arg Str in the string.
12205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner///
1237a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// \return - The index of the first occurrence of \arg Str, or npos if not
12405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// found.
12564066bd8b593082f622bbc25716938a453363d2fDaniel Dunbarsize_t StringRef::find(StringRef Str, size_t From) const {
12605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
12705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
12805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return npos;
1296e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
1306e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  // For short haystacks or unsupported needles fall back to the naive algorithm
1316e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  if (Length < 16 || N > 255 || N == 0) {
1326e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    for (size_t e = Length - N + 1, i = min(From, e); i != e; ++i)
1336e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer      if (substr(i, N).equals(Str))
1346e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer        return i;
1356e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    return npos;
1366e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  }
1376e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
138e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer  if (From >= Length)
139e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer    return npos;
140e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer
1416e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  // Build the bad char heuristic table, with uint8_t to reduce cache thrashing.
1426e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  uint8_t BadCharSkip[256];
1436e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  std::memset(BadCharSkip, N, 256);
1446e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  for (unsigned i = 0; i != N-1; ++i)
1456e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    BadCharSkip[(uint8_t)Str[i]] = N-1-i;
1466e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
147e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer  unsigned Len = Length-From, Pos = From;
1486e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  while (Len >= N) {
1496e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    if (substr(Pos, N).equals(Str)) // See if this is the correct substring.
1506e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer      return Pos;
1516e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
1526e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    // Otherwise skip the appropriate number of bytes.
153e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer    uint8_t Skip = BadCharSkip[(uint8_t)(*this)[Pos+N-1]];
1546e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    Len -= Skip;
1556e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    Pos += Skip;
1566e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  }
1576e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
15805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
15905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
16005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
16105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// rfind - Search for the last string \arg Str in the string.
16205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner///
1637a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// \return - The index of the last occurrence of \arg Str, or npos if not
16405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// found.
1652928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarsize_t StringRef::rfind(StringRef Str) const {
16605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
16705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
16805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return npos;
16905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  for (size_t i = Length - N + 1, e = 0; i != e;) {
17005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    --i;
17105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    if (substr(i, N).equals(Str))
17205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
17305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  }
17405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
17505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
17605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
17764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// find_first_of - Find the first character in the string that is in \arg
17864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// Chars, or npos if not found.
17964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar///
180250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer/// Note: O(size() + Chars.size())
18164066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_of(StringRef Chars,
18264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar                                              size_t From) const {
183250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  std::bitset<1 << CHAR_BIT> CharBits;
184250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  for (size_type i = 0; i != Chars.size(); ++i)
185250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    CharBits.set((unsigned char)Chars[i]);
186250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer
18758ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
188250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    if (CharBits.test((unsigned char)Data[i]))
18905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
19005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
19105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
19205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
19305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// find_first_not_of - Find the first character in the string that is not
19464066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// \arg C or npos if not found.
19564066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_not_of(char C, size_t From) const {
19658ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
19764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar    if (Data[i] != C)
19864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar      return i;
19964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar  return npos;
20064066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar}
20164066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar
20264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// find_first_not_of - Find the first character in the string that is not
20364066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// in the string \arg Chars, or npos if not found.
20464066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar///
205250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer/// Note: O(size() + Chars.size())
20664066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_not_of(StringRef Chars,
20764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar                                                  size_t From) const {
208250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  std::bitset<1 << CHAR_BIT> CharBits;
209250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  for (size_type i = 0; i != Chars.size(); ++i)
210250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    CharBits.set((unsigned char)Chars[i]);
211250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer
21258ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
213250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    if (!CharBits.test((unsigned char)Data[i]))
21405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
21505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
21605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
21705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
21863c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// find_last_of - Find the last character in the string that is in \arg C,
21963c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// or npos if not found.
22063c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer///
22163c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// Note: O(size() + Chars.size())
22263c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. SpencerStringRef::size_type StringRef::find_last_of(StringRef Chars,
22363c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer                                             size_t From) const {
22463c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  std::bitset<1 << CHAR_BIT> CharBits;
22563c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  for (size_type i = 0; i != Chars.size(); ++i)
22663c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer    CharBits.set((unsigned char)Chars[i]);
22763c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer
22863c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
22963c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer    if (CharBits.test((unsigned char)Data[i]))
23063c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer      return i;
23163c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  return npos;
23263c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer}
23305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
234b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// find_last_not_of - Find the last character in the string that is not
235b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// \arg C, or npos if not found.
236b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. SpencerStringRef::size_type StringRef::find_last_not_of(char C, size_t From) const {
237b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
238b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    if (Data[i] != C)
239b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer      return i;
240b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  return npos;
241b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer}
242b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
243b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// find_last_not_of - Find the last character in the string that is not in
244b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// \arg Chars, or npos if not found.
245b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer///
246b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// Note: O(size() + Chars.size())
247b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. SpencerStringRef::size_type StringRef::find_last_not_of(StringRef Chars,
248b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer                                                 size_t From) const {
249b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  std::bitset<1 << CHAR_BIT> CharBits;
250b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = 0, e = Chars.size(); i != e; ++i)
251b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    CharBits.set((unsigned char)Chars[i]);
252b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
253b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
254b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    if (!CharBits.test((unsigned char)Data[i]))
255b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer      return i;
256b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  return npos;
257b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer}
258b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
259bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sandsvoid StringRef::split(SmallVectorImpl<StringRef> &A,
260bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands                      StringRef Separators, int MaxSplit,
261bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands                      bool KeepEmpty) const {
262bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  StringRef rest = *this;
263bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
264bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // rest.data() is used to distinguish cases like "a," that splits into
265bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // "a" + "" and "a" that splits into "a" + 0.
266bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  for (int splits = 0;
267bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands       rest.data() != NULL && (MaxSplit < 0 || splits < MaxSplit);
268bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands       ++splits) {
269bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    std::pair<StringRef, StringRef> p = rest.split(Separators);
270bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
27137b6e5ae7dff4e50c1c51b64b3459cbbe6b70dafDuncan Sands    if (KeepEmpty || p.first.size() != 0)
272bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands      A.push_back(p.first);
273bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    rest = p.second;
274bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  }
275bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // If we have a tail left, add it.
276bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  if (rest.data() != NULL && (rest.size() != 0 || KeepEmpty))
277bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    A.push_back(rest);
278bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands}
279bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
28005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
28105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner// Helpful Algorithms
28205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
28305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
28405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// count - Return the number of non-overlapped occurrences of \arg Str in
28505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// the string.
2862928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarsize_t StringRef::count(StringRef Str) const {
28705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t Count = 0;
28805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
28905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
29005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return 0;
29105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  for (size_t i = 0, e = Length - N + 1; i != e; ++i)
29205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    if (substr(i, N).equals(Str))
29305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      ++Count;
29405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return Count;
29505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
29605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
2971e7ad3993d8700488895fa372ecad55443f53485John McCallstatic unsigned GetAutoSenseRadix(StringRef &Str) {
2981e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.startswith("0x")) {
2991e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(2);
3001e7ad3993d8700488895fa372ecad55443f53485John McCall    return 16;
3012dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  }
3022dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3032dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0b")) {
3041e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(2);
3051e7ad3993d8700488895fa372ecad55443f53485John McCall    return 2;
3062dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  }
3072dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3082dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0o")) {
3092dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner    Str = Str.substr(2);
3101e7ad3993d8700488895fa372ecad55443f53485John McCall    return 8;
3111e7ad3993d8700488895fa372ecad55443f53485John McCall  }
3122dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3132dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0"))
3142dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner    return 8;
3152dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3162dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  return 10;
3171e7ad3993d8700488895fa372ecad55443f53485John McCall}
3181e7ad3993d8700488895fa372ecad55443f53485John McCall
3191e7ad3993d8700488895fa372ecad55443f53485John McCall
32063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner/// GetAsUnsignedInteger - Workhorse method that converts a integer character
32163c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner/// sequence of radix up to 36 to an unsigned long long value.
3229130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencerbool llvm::getAsUnsignedInteger(StringRef Str, unsigned Radix,
3239130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer                                unsigned long long &Result) {
324cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Autosense radix if not specified.
3251e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Radix == 0)
3261e7ad3993d8700488895fa372ecad55443f53485John McCall    Radix = GetAutoSenseRadix(Str);
327326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
328cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Empty strings (after the radix autosense) are invalid.
329cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  if (Str.empty()) return true;
330326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
331cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Parse all the bytes of the string given this radix.  Watch for overflow.
332cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  Result = 0;
333cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  while (!Str.empty()) {
334cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    unsigned CharVal;
335cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    if (Str[0] >= '0' && Str[0] <= '9')
336cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'0';
337cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else if (Str[0] >= 'a' && Str[0] <= 'z')
338cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'a'+10;
339cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else if (Str[0] >= 'A' && Str[0] <= 'Z')
340cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'A'+10;
341cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else
342cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
343326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
344cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // If the parsed value is larger than the integer radix, the string is
345cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // invalid.
346cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    if (CharVal >= Radix)
347cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
348326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
349cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // Add in this character.
350cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    unsigned long long PrevResult = Result;
351cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    Result = Result*Radix+CharVal;
352326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
353cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // Check for overflow.
354cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    if (Result < PrevResult)
355cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
356cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
357cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    Str = Str.substr(1);
358cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  }
359326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
360cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  return false;
361cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner}
362cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
3639130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencerbool llvm::getAsSignedInteger(StringRef Str, unsigned Radix,
3649130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer                              long long &Result) {
36563c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  unsigned long long ULLVal;
366326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
36763c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  // Handle positive strings first.
3689130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer  if (Str.empty() || Str.front() != '-') {
3699130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer    if (getAsUnsignedInteger(Str, Radix, ULLVal) ||
37063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner        // Check for value so large it overflows a signed value.
37163c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner        (long long)ULLVal < 0)
37263c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      return true;
37363c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    Result = ULLVal;
37463c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    return false;
37563c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  }
376326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
37763c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  // Get the positive part of the value.
3789130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer  if (getAsUnsignedInteger(Str.substr(1), Radix, ULLVal) ||
37963c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // Reject values so large they'd overflow as negative signed, but allow
38063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // "-0".  This negates the unsigned so that the negative isn't undefined
38163c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // on signed overflow.
38263c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      (long long)-ULLVal > 0)
38363c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    return true;
384326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
38563c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  Result = -ULLVal;
38663c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  return false;
38763c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner}
38863c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner
3891e7ad3993d8700488895fa372ecad55443f53485John McCallbool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
3901e7ad3993d8700488895fa372ecad55443f53485John McCall  StringRef Str = *this;
3911e7ad3993d8700488895fa372ecad55443f53485John McCall
3921e7ad3993d8700488895fa372ecad55443f53485John McCall  // Autosense radix if not specified.
3931e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Radix == 0)
3941e7ad3993d8700488895fa372ecad55443f53485John McCall    Radix = GetAutoSenseRadix(Str);
3951e7ad3993d8700488895fa372ecad55443f53485John McCall
3961e7ad3993d8700488895fa372ecad55443f53485John McCall  assert(Radix > 1 && Radix <= 36);
397326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
3981e7ad3993d8700488895fa372ecad55443f53485John McCall  // Empty strings (after the radix autosense) are invalid.
3991e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.empty()) return true;
4001e7ad3993d8700488895fa372ecad55443f53485John McCall
4011e7ad3993d8700488895fa372ecad55443f53485John McCall  // Skip leading zeroes.  This can be a significant improvement if
4021e7ad3993d8700488895fa372ecad55443f53485John McCall  // it means we don't need > 64 bits.
4031e7ad3993d8700488895fa372ecad55443f53485John McCall  while (!Str.empty() && Str.front() == '0')
4041e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(1);
4051e7ad3993d8700488895fa372ecad55443f53485John McCall
4061e7ad3993d8700488895fa372ecad55443f53485John McCall  // If it was nothing but zeroes....
4071e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.empty()) {
4081e7ad3993d8700488895fa372ecad55443f53485John McCall    Result = APInt(64, 0);
4091e7ad3993d8700488895fa372ecad55443f53485John McCall    return false;
4101e7ad3993d8700488895fa372ecad55443f53485John McCall  }
4111e7ad3993d8700488895fa372ecad55443f53485John McCall
4121e7ad3993d8700488895fa372ecad55443f53485John McCall  // (Over-)estimate the required number of bits.
4131e7ad3993d8700488895fa372ecad55443f53485John McCall  unsigned Log2Radix = 0;
4141e7ad3993d8700488895fa372ecad55443f53485John McCall  while ((1U << Log2Radix) < Radix) Log2Radix++;
4151e7ad3993d8700488895fa372ecad55443f53485John McCall  bool IsPowerOf2Radix = ((1U << Log2Radix) == Radix);
4161e7ad3993d8700488895fa372ecad55443f53485John McCall
4171e7ad3993d8700488895fa372ecad55443f53485John McCall  unsigned BitWidth = Log2Radix * Str.size();
4181e7ad3993d8700488895fa372ecad55443f53485John McCall  if (BitWidth < Result.getBitWidth())
4191e7ad3993d8700488895fa372ecad55443f53485John McCall    BitWidth = Result.getBitWidth(); // don't shrink the result
420a9963c648e1646fe6fc1015a61a05b08a62d0aa8Chris Lattner  else if (BitWidth > Result.getBitWidth())
42140f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad    Result = Result.zext(BitWidth);
4221e7ad3993d8700488895fa372ecad55443f53485John McCall
4231e7ad3993d8700488895fa372ecad55443f53485John McCall  APInt RadixAP, CharAP; // unused unless !IsPowerOf2Radix
4241e7ad3993d8700488895fa372ecad55443f53485John McCall  if (!IsPowerOf2Radix) {
4251e7ad3993d8700488895fa372ecad55443f53485John McCall    // These must have the same bit-width as Result.
4261e7ad3993d8700488895fa372ecad55443f53485John McCall    RadixAP = APInt(BitWidth, Radix);
4271e7ad3993d8700488895fa372ecad55443f53485John McCall    CharAP = APInt(BitWidth, 0);
4281e7ad3993d8700488895fa372ecad55443f53485John McCall  }
4291e7ad3993d8700488895fa372ecad55443f53485John McCall
4301e7ad3993d8700488895fa372ecad55443f53485John McCall  // Parse all the bytes of the string given this radix.
4311e7ad3993d8700488895fa372ecad55443f53485John McCall  Result = 0;
4321e7ad3993d8700488895fa372ecad55443f53485John McCall  while (!Str.empty()) {
4331e7ad3993d8700488895fa372ecad55443f53485John McCall    unsigned CharVal;
4341e7ad3993d8700488895fa372ecad55443f53485John McCall    if (Str[0] >= '0' && Str[0] <= '9')
4351e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'0';
4361e7ad3993d8700488895fa372ecad55443f53485John McCall    else if (Str[0] >= 'a' && Str[0] <= 'z')
4371e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'a'+10;
4381e7ad3993d8700488895fa372ecad55443f53485John McCall    else if (Str[0] >= 'A' && Str[0] <= 'Z')
4391e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'A'+10;
4401e7ad3993d8700488895fa372ecad55443f53485John McCall    else
4411e7ad3993d8700488895fa372ecad55443f53485John McCall      return true;
442326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4431e7ad3993d8700488895fa372ecad55443f53485John McCall    // If the parsed value is larger than the integer radix, the string is
4441e7ad3993d8700488895fa372ecad55443f53485John McCall    // invalid.
4451e7ad3993d8700488895fa372ecad55443f53485John McCall    if (CharVal >= Radix)
4461e7ad3993d8700488895fa372ecad55443f53485John McCall      return true;
447326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4481e7ad3993d8700488895fa372ecad55443f53485John McCall    // Add in this character.
4491e7ad3993d8700488895fa372ecad55443f53485John McCall    if (IsPowerOf2Radix) {
4501e7ad3993d8700488895fa372ecad55443f53485John McCall      Result <<= Log2Radix;
4511e7ad3993d8700488895fa372ecad55443f53485John McCall      Result |= CharVal;
4521e7ad3993d8700488895fa372ecad55443f53485John McCall    } else {
4531e7ad3993d8700488895fa372ecad55443f53485John McCall      Result *= RadixAP;
4541e7ad3993d8700488895fa372ecad55443f53485John McCall      CharAP = CharVal;
4551e7ad3993d8700488895fa372ecad55443f53485John McCall      Result += CharAP;
4561e7ad3993d8700488895fa372ecad55443f53485John McCall    }
4571e7ad3993d8700488895fa372ecad55443f53485John McCall
4581e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(1);
4591e7ad3993d8700488895fa372ecad55443f53485John McCall  }
460326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4611e7ad3993d8700488895fa372ecad55443f53485John McCall  return false;
4621e7ad3993d8700488895fa372ecad55443f53485John McCall}
463528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth
464528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth
465528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth// Implementation of StringRef hashing.
466528f0bbe19553dfadedca040df13a389daa7593dChandler Carruthhash_code llvm::hash_value(StringRef S) {
467528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth  return hash_combine_range(S.begin(), S.end());
468528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth}
469