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