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"
12528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth#include "llvm/ADT/Hashing.h"
13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/OwningPtr.h"
1401d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain#include "llvm/ADT/edit_distance.h"
15250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer#include <bitset>
16ad6b6da8aafa88fa3bd002f2595121e1227c4b93Douglas Gregor
17e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbarusing namespace llvm;
18e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar
1977696bebbcb011be861571b105193fc53614c153Daniel Dunbar// MSVC emits references to this into the translation units which reference it.
2077696bebbcb011be861571b105193fc53614c153Daniel Dunbar#ifndef _MSC_VER
21e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbarconst size_t StringRef::npos;
2277696bebbcb011be861571b105193fc53614c153Daniel Dunbar#endif
23cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
2405872ea804cdc9534960b30d28a391928c61481aBenjamin Kramerstatic char ascii_tolower(char x) {
2505872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  if (x >= 'A' && x <= 'Z')
2605872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer    return x - 'A' + 'a';
2705872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  return x;
2805872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer}
2905872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
30589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstatic char ascii_toupper(char x) {
31589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  if (x >= 'a' && x <= 'z')
32589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar    return x - 'a' + 'A';
33589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return x;
34589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
35589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
36160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesenstatic bool ascii_isdigit(char x) {
37160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  return x >= '0' && x <= '9';
38160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen}
39160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen
4005872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer/// compare_lower - Compare strings, ignoring case.
4105872ea804cdc9534960b30d28a391928c61481aBenjamin Kramerint StringRef::compare_lower(StringRef RHS) const {
4258ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
430043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    unsigned char LHC = ascii_tolower(Data[I]);
440043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    unsigned char RHC = ascii_tolower(RHS.Data[I]);
4505872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer    if (LHC != RHC)
4605872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer      return LHC < RHC ? -1 : 1;
4705872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  }
4805872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
4905872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  if (Length == RHS.Length)
500043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    return 0;
5105872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer  return Length < RHS.Length ? -1 : 1;
5205872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer}
5305872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer
54160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen/// compare_numeric - Compare strings, handle embedded numbers.
55160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesenint StringRef::compare_numeric(StringRef RHS) const {
56160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
577850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen    // Check for sequences of digits.
58160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    if (ascii_isdigit(Data[I]) && ascii_isdigit(RHS.Data[I])) {
597850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // The longer sequence of numbers is considered larger.
607850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // This doesn't really handle prefixed zeros well.
617850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      size_t J;
627850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      for (J = I + 1; J != E + 1; ++J) {
63160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        bool ld = J < Length && ascii_isdigit(Data[J]);
64160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        bool rd = J < RHS.Length && ascii_isdigit(RHS.Data[J]);
65160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        if (ld != rd)
66160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen          return rd ? -1 : 1;
67160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen        if (!rd)
68160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen          break;
69160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen      }
707850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // The two number sequences have the same length (J-I), just memcmp them.
717850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      if (int Res = compareMemory(Data + I, RHS.Data + I, J - I))
727850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen        return Res < 0 ? -1 : 1;
737850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      // Identical number sequences, continue search after the numbers.
747850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      I = J - 1;
757850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      continue;
76160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    }
777850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen    if (Data[I] != RHS.Data[I])
787850dd0f25ccc5da6df54999a907e1277ed055d6Jakob Stoklund Olesen      return (unsigned char)Data[I] < (unsigned char)RHS.Data[I] ? -1 : 1;
79160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  }
80160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  if (Length == RHS.Length)
810043e35b8261af607d6cf0695b79b1d6584e67acBenjamin Kramer    return 0;
82160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen  return Length < RHS.Length ? -1 : 1;
83160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen}
84160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen
857e54d5b1562f085c898bf8fcc4ac939ec893444cDouglas Gregor// Compute the edit distance between the two given strings.
86326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencerunsigned StringRef::edit_distance(llvm::StringRef Other,
875ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor                                  bool AllowReplacements,
885ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor                                  unsigned MaxEditDistance) {
8901d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain  return llvm::ComputeEditDistance(
9001d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      llvm::ArrayRef<char>(data(), size()),
9101d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      llvm::ArrayRef<char>(Other.data(), Other.size()),
9201d53ec176a6be4585df1f43af11151988ca4b35Kaelyn Uhrain      AllowReplacements, MaxEditDistance);
93441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor}
94441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor
9505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
96589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar// String Operations
97589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar//===----------------------------------------------------------------------===//
98589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
99589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstd::string StringRef::lower() const {
100589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  std::string Result(size(), char());
101589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  for (size_type i = 0, e = size(); i != e; ++i) {
102589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar    Result[i] = ascii_tolower(Data[i]);
103589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  }
104589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return Result;
105589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
106589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
107589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbarstd::string StringRef::upper() const {
108589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  std::string Result(size(), char());
109589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  for (size_type i = 0, e = size(); i != e; ++i) {
110a7b966fc8d63b9b9432e1b33b33d4be6179e1fffBenjamin Kramer    Result[i] = ascii_toupper(Data[i]);
111589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  }
112589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar  return Result;
113589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar}
114589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar
115589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar//===----------------------------------------------------------------------===//
11605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner// String Searching
11705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
11805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
11905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
12005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// find - Search for the first string \arg Str in the string.
12105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner///
1227a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// \return - The index of the first occurrence of \arg Str, or npos if not
12305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// found.
12464066bd8b593082f622bbc25716938a453363d2fDaniel Dunbarsize_t StringRef::find(StringRef Str, size_t From) const {
12505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
12605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
12705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return npos;
1286e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
1296e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  // For short haystacks or unsupported needles fall back to the naive algorithm
1306e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  if (Length < 16 || N > 255 || N == 0) {
1316e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    for (size_t e = Length - N + 1, i = min(From, e); i != e; ++i)
1326e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer      if (substr(i, N).equals(Str))
1336e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer        return i;
1346e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    return npos;
1356e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  }
1366e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
137e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer  if (From >= Length)
138e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer    return npos;
139e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer
1406e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  // Build the bad char heuristic table, with uint8_t to reduce cache thrashing.
1416e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  uint8_t BadCharSkip[256];
1426e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  std::memset(BadCharSkip, N, 256);
1436e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  for (unsigned i = 0; i != N-1; ++i)
1446e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    BadCharSkip[(uint8_t)Str[i]] = N-1-i;
1456e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
146e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer  unsigned Len = Length-From, Pos = From;
1476e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  while (Len >= N) {
1486e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    if (substr(Pos, N).equals(Str)) // See if this is the correct substring.
1496e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer      return Pos;
1506e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
1516e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    // Otherwise skip the appropriate number of bytes.
152e7a0719161ebc3600d3f584901ab8e2276acdb59Benjamin Kramer    uint8_t Skip = BadCharSkip[(uint8_t)(*this)[Pos+N-1]];
1536e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    Len -= Skip;
1546e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer    Pos += Skip;
1556e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer  }
1566e6a558ebce556476d8fd659b419a2760f2ab154Benjamin Kramer
15705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
15805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
15905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
16005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// rfind - Search for the last string \arg Str in the string.
16105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner///
1627a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner/// \return - The index of the last occurrence of \arg Str, or npos if not
16305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// found.
1642928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarsize_t StringRef::rfind(StringRef Str) const {
16505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
16605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
16705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return npos;
16805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  for (size_t i = Length - N + 1, e = 0; i != e;) {
16905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    --i;
17005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    if (substr(i, N).equals(Str))
17105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
17205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  }
17305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
17405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
17505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
17664066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// find_first_of - Find the first character in the string that is in \arg
17764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// Chars, or npos if not found.
17864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar///
179250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer/// Note: O(size() + Chars.size())
18064066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_of(StringRef Chars,
18164066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar                                              size_t From) const {
182250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  std::bitset<1 << CHAR_BIT> CharBits;
183250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  for (size_type i = 0; i != Chars.size(); ++i)
184250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    CharBits.set((unsigned char)Chars[i]);
185250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer
18658ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
187250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    if (CharBits.test((unsigned char)Data[i]))
18805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
18905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
19005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
19105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
19205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// find_first_not_of - Find the first character in the string that is not
19364066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// \arg C or npos if not found.
19464066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_not_of(char C, size_t From) const {
19558ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
19664066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar    if (Data[i] != C)
19764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar      return i;
19864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar  return npos;
19964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar}
20064066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar
20164066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// find_first_not_of - Find the first character in the string that is not
20264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar/// in the string \arg Chars, or npos if not found.
20364066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar///
204250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer/// Note: O(size() + Chars.size())
20564066bd8b593082f622bbc25716938a453363d2fDaniel DunbarStringRef::size_type StringRef::find_first_not_of(StringRef Chars,
20664066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar                                                  size_t From) const {
207250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  std::bitset<1 << CHAR_BIT> CharBits;
208250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer  for (size_type i = 0; i != Chars.size(); ++i)
209250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    CharBits.set((unsigned char)Chars[i]);
210250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer
21158ce7acb4f87c3caf0f473f89220950919fba7bcDaniel Dunbar  for (size_type i = min(From, Length), e = Length; i != e; ++i)
212250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer    if (!CharBits.test((unsigned char)Data[i]))
21305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      return i;
21405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return npos;
21505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
21605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
21763c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// find_last_of - Find the last character in the string that is in \arg C,
21863c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// or npos if not found.
21963c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer///
22063c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer/// Note: O(size() + Chars.size())
22163c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. SpencerStringRef::size_type StringRef::find_last_of(StringRef Chars,
22263c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer                                             size_t From) const {
22363c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  std::bitset<1 << CHAR_BIT> CharBits;
22463c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  for (size_type i = 0; i != Chars.size(); ++i)
22563c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer    CharBits.set((unsigned char)Chars[i]);
22663c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer
22763c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
22863c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer    if (CharBits.test((unsigned char)Data[i]))
22963c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer      return i;
23063c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer  return npos;
23163c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer}
23205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
233b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// find_last_not_of - Find the last character in the string that is not
234b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// \arg C, or npos if not found.
235b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. SpencerStringRef::size_type StringRef::find_last_not_of(char C, size_t From) const {
236b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
237b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    if (Data[i] != C)
238b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer      return i;
239b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  return npos;
240b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer}
241b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
242b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// find_last_not_of - Find the last character in the string that is not in
243b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// \arg Chars, or npos if not found.
244b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer///
245b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer/// Note: O(size() + Chars.size())
246b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. SpencerStringRef::size_type StringRef::find_last_not_of(StringRef Chars,
247b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer                                                 size_t From) const {
248b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  std::bitset<1 << CHAR_BIT> CharBits;
249b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = 0, e = Chars.size(); i != e; ++i)
250b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    CharBits.set((unsigned char)Chars[i]);
251b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
252b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
253b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer    if (!CharBits.test((unsigned char)Data[i]))
254b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer      return i;
255b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer  return npos;
256b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer}
257b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer
258bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sandsvoid StringRef::split(SmallVectorImpl<StringRef> &A,
259bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands                      StringRef Separators, int MaxSplit,
260bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands                      bool KeepEmpty) const {
261bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  StringRef rest = *this;
262bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
263bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // rest.data() is used to distinguish cases like "a," that splits into
264bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // "a" + "" and "a" that splits into "a" + 0.
265bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  for (int splits = 0;
266bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands       rest.data() != NULL && (MaxSplit < 0 || splits < MaxSplit);
267bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands       ++splits) {
268bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    std::pair<StringRef, StringRef> p = rest.split(Separators);
269bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
27037b6e5ae7dff4e50c1c51b64b3459cbbe6b70dafDuncan Sands    if (KeepEmpty || p.first.size() != 0)
271bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands      A.push_back(p.first);
272bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    rest = p.second;
273bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  }
274bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  // If we have a tail left, add it.
275bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands  if (rest.data() != NULL && (rest.size() != 0 || KeepEmpty))
276bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands    A.push_back(rest);
277bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands}
278bf8653ff3b70d2a1bb059a958d7612954408d998Duncan Sands
27905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
28005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner// Helpful Algorithms
28105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner//===----------------------------------------------------------------------===//
28205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
28305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// count - Return the number of non-overlapped occurrences of \arg Str in
28405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner/// the string.
2852928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarsize_t StringRef::count(StringRef Str) const {
28605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t Count = 0;
28705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  size_t N = Str.size();
28805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  if (N > Length)
28905a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    return 0;
29005a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  for (size_t i = 0, e = Length - N + 1; i != e; ++i)
29105a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner    if (substr(i, N).equals(Str))
29205a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner      ++Count;
29305a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner  return Count;
29405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner}
29505a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner
2961e7ad3993d8700488895fa372ecad55443f53485John McCallstatic unsigned GetAutoSenseRadix(StringRef &Str) {
2971e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.startswith("0x")) {
2981e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(2);
2991e7ad3993d8700488895fa372ecad55443f53485John McCall    return 16;
3002dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  }
3012dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3022dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0b")) {
3031e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(2);
3041e7ad3993d8700488895fa372ecad55443f53485John McCall    return 2;
3052dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  }
3062dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3072dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0o")) {
3082dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner    Str = Str.substr(2);
3091e7ad3993d8700488895fa372ecad55443f53485John McCall    return 8;
3101e7ad3993d8700488895fa372ecad55443f53485John McCall  }
3112dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3122dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  if (Str.startswith("0"))
3132dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner    return 8;
3142dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner
3152dbd7844e831caa107c6c9c57889f3d89b843ef3Chris Lattner  return 10;
3161e7ad3993d8700488895fa372ecad55443f53485John McCall}
3171e7ad3993d8700488895fa372ecad55443f53485John McCall
3181e7ad3993d8700488895fa372ecad55443f53485John McCall
31963c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner/// GetAsUnsignedInteger - Workhorse method that converts a integer character
32063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner/// sequence of radix up to 36 to an unsigned long long value.
3219130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencerbool llvm::getAsUnsignedInteger(StringRef Str, unsigned Radix,
3229130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer                                unsigned long long &Result) {
323cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Autosense radix if not specified.
3241e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Radix == 0)
3251e7ad3993d8700488895fa372ecad55443f53485John McCall    Radix = GetAutoSenseRadix(Str);
326326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
327cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Empty strings (after the radix autosense) are invalid.
328cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  if (Str.empty()) return true;
329326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
330cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  // Parse all the bytes of the string given this radix.  Watch for overflow.
331cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  Result = 0;
332cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  while (!Str.empty()) {
333cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    unsigned CharVal;
334cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    if (Str[0] >= '0' && Str[0] <= '9')
335cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'0';
336cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else if (Str[0] >= 'a' && Str[0] <= 'z')
337cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'a'+10;
338cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else if (Str[0] >= 'A' && Str[0] <= 'Z')
339cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      CharVal = Str[0]-'A'+10;
340cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    else
341cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
342326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
343cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // If the parsed value is larger than the integer radix, the string is
344cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // invalid.
345cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    if (CharVal >= Radix)
346cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
347326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
348cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    // Add in this character.
349cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    unsigned long long PrevResult = Result;
350cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    Result = Result*Radix+CharVal;
351326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
3526e033d6dcd374634a64825692342c555d2eff38fNick Kledzik    // Check for overflow by shifting back and seeing if bits were lost.
3536e033d6dcd374634a64825692342c555d2eff38fNick Kledzik    if (Result/Radix < PrevResult)
354cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner      return true;
355cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
356cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner    Str = Str.substr(1);
357cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  }
358326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
359cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner  return false;
360cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner}
361cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner
3629130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencerbool llvm::getAsSignedInteger(StringRef Str, unsigned Radix,
3639130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer                              long long &Result) {
36463c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  unsigned long long ULLVal;
365326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
36663c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  // Handle positive strings first.
3679130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer  if (Str.empty() || Str.front() != '-') {
3689130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer    if (getAsUnsignedInteger(Str, Radix, ULLVal) ||
36963c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner        // Check for value so large it overflows a signed value.
37063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner        (long long)ULLVal < 0)
37163c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      return true;
37263c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    Result = ULLVal;
37363c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    return false;
37463c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  }
375326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
37663c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  // Get the positive part of the value.
3779130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer  if (getAsUnsignedInteger(Str.substr(1), Radix, ULLVal) ||
37863c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // Reject values so large they'd overflow as negative signed, but allow
37963c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // "-0".  This negates the unsigned so that the negative isn't undefined
38063c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      // on signed overflow.
38163c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner      (long long)-ULLVal > 0)
38263c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner    return true;
383326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
38463c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  Result = -ULLVal;
38563c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner  return false;
38663c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner}
38763c6b7dc67f0061340c0701f3d5b1de142f58cecChris Lattner
3881e7ad3993d8700488895fa372ecad55443f53485John McCallbool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
3891e7ad3993d8700488895fa372ecad55443f53485John McCall  StringRef Str = *this;
3901e7ad3993d8700488895fa372ecad55443f53485John McCall
3911e7ad3993d8700488895fa372ecad55443f53485John McCall  // Autosense radix if not specified.
3921e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Radix == 0)
3931e7ad3993d8700488895fa372ecad55443f53485John McCall    Radix = GetAutoSenseRadix(Str);
3941e7ad3993d8700488895fa372ecad55443f53485John McCall
3951e7ad3993d8700488895fa372ecad55443f53485John McCall  assert(Radix > 1 && Radix <= 36);
396326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
3971e7ad3993d8700488895fa372ecad55443f53485John McCall  // Empty strings (after the radix autosense) are invalid.
3981e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.empty()) return true;
3991e7ad3993d8700488895fa372ecad55443f53485John McCall
4001e7ad3993d8700488895fa372ecad55443f53485John McCall  // Skip leading zeroes.  This can be a significant improvement if
4011e7ad3993d8700488895fa372ecad55443f53485John McCall  // it means we don't need > 64 bits.
4021e7ad3993d8700488895fa372ecad55443f53485John McCall  while (!Str.empty() && Str.front() == '0')
4031e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(1);
4041e7ad3993d8700488895fa372ecad55443f53485John McCall
4051e7ad3993d8700488895fa372ecad55443f53485John McCall  // If it was nothing but zeroes....
4061e7ad3993d8700488895fa372ecad55443f53485John McCall  if (Str.empty()) {
4071e7ad3993d8700488895fa372ecad55443f53485John McCall    Result = APInt(64, 0);
4081e7ad3993d8700488895fa372ecad55443f53485John McCall    return false;
4091e7ad3993d8700488895fa372ecad55443f53485John McCall  }
4101e7ad3993d8700488895fa372ecad55443f53485John McCall
4111e7ad3993d8700488895fa372ecad55443f53485John McCall  // (Over-)estimate the required number of bits.
4121e7ad3993d8700488895fa372ecad55443f53485John McCall  unsigned Log2Radix = 0;
4131e7ad3993d8700488895fa372ecad55443f53485John McCall  while ((1U << Log2Radix) < Radix) Log2Radix++;
4141e7ad3993d8700488895fa372ecad55443f53485John McCall  bool IsPowerOf2Radix = ((1U << Log2Radix) == Radix);
4151e7ad3993d8700488895fa372ecad55443f53485John McCall
4161e7ad3993d8700488895fa372ecad55443f53485John McCall  unsigned BitWidth = Log2Radix * Str.size();
4171e7ad3993d8700488895fa372ecad55443f53485John McCall  if (BitWidth < Result.getBitWidth())
4181e7ad3993d8700488895fa372ecad55443f53485John McCall    BitWidth = Result.getBitWidth(); // don't shrink the result
419a9963c648e1646fe6fc1015a61a05b08a62d0aa8Chris Lattner  else if (BitWidth > Result.getBitWidth())
42040f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad    Result = Result.zext(BitWidth);
4211e7ad3993d8700488895fa372ecad55443f53485John McCall
4221e7ad3993d8700488895fa372ecad55443f53485John McCall  APInt RadixAP, CharAP; // unused unless !IsPowerOf2Radix
4231e7ad3993d8700488895fa372ecad55443f53485John McCall  if (!IsPowerOf2Radix) {
4241e7ad3993d8700488895fa372ecad55443f53485John McCall    // These must have the same bit-width as Result.
4251e7ad3993d8700488895fa372ecad55443f53485John McCall    RadixAP = APInt(BitWidth, Radix);
4261e7ad3993d8700488895fa372ecad55443f53485John McCall    CharAP = APInt(BitWidth, 0);
4271e7ad3993d8700488895fa372ecad55443f53485John McCall  }
4281e7ad3993d8700488895fa372ecad55443f53485John McCall
4291e7ad3993d8700488895fa372ecad55443f53485John McCall  // Parse all the bytes of the string given this radix.
4301e7ad3993d8700488895fa372ecad55443f53485John McCall  Result = 0;
4311e7ad3993d8700488895fa372ecad55443f53485John McCall  while (!Str.empty()) {
4321e7ad3993d8700488895fa372ecad55443f53485John McCall    unsigned CharVal;
4331e7ad3993d8700488895fa372ecad55443f53485John McCall    if (Str[0] >= '0' && Str[0] <= '9')
4341e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'0';
4351e7ad3993d8700488895fa372ecad55443f53485John McCall    else if (Str[0] >= 'a' && Str[0] <= 'z')
4361e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'a'+10;
4371e7ad3993d8700488895fa372ecad55443f53485John McCall    else if (Str[0] >= 'A' && Str[0] <= 'Z')
4381e7ad3993d8700488895fa372ecad55443f53485John McCall      CharVal = Str[0]-'A'+10;
4391e7ad3993d8700488895fa372ecad55443f53485John McCall    else
4401e7ad3993d8700488895fa372ecad55443f53485John McCall      return true;
441326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4421e7ad3993d8700488895fa372ecad55443f53485John McCall    // If the parsed value is larger than the integer radix, the string is
4431e7ad3993d8700488895fa372ecad55443f53485John McCall    // invalid.
4441e7ad3993d8700488895fa372ecad55443f53485John McCall    if (CharVal >= Radix)
4451e7ad3993d8700488895fa372ecad55443f53485John McCall      return true;
446326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4471e7ad3993d8700488895fa372ecad55443f53485John McCall    // Add in this character.
4481e7ad3993d8700488895fa372ecad55443f53485John McCall    if (IsPowerOf2Radix) {
4491e7ad3993d8700488895fa372ecad55443f53485John McCall      Result <<= Log2Radix;
4501e7ad3993d8700488895fa372ecad55443f53485John McCall      Result |= CharVal;
4511e7ad3993d8700488895fa372ecad55443f53485John McCall    } else {
4521e7ad3993d8700488895fa372ecad55443f53485John McCall      Result *= RadixAP;
4531e7ad3993d8700488895fa372ecad55443f53485John McCall      CharAP = CharVal;
4541e7ad3993d8700488895fa372ecad55443f53485John McCall      Result += CharAP;
4551e7ad3993d8700488895fa372ecad55443f53485John McCall    }
4561e7ad3993d8700488895fa372ecad55443f53485John McCall
4571e7ad3993d8700488895fa372ecad55443f53485John McCall    Str = Str.substr(1);
4581e7ad3993d8700488895fa372ecad55443f53485John McCall  }
459326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer
4601e7ad3993d8700488895fa372ecad55443f53485John McCall  return false;
4611e7ad3993d8700488895fa372ecad55443f53485John McCall}
462528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth
463528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth
464528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth// Implementation of StringRef hashing.
465528f0bbe19553dfadedca040df13a389daa7593dChandler Carruthhash_code llvm::hash_value(StringRef S) {
466528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth  return hash_combine_range(S.begin(), S.end());
467528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth}
468