Home | History | Annotate | Download | only in Support
      1 //===-- StringRef.cpp - Lightweight String References ---------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "llvm/ADT/StringRef.h"
     11 #include "llvm/ADT/APInt.h"
     12 #include "llvm/ADT/OwningPtr.h"
     13 #include <bitset>
     14 
     15 using namespace llvm;
     16 
     17 // MSVC emits references to this into the translation units which reference it.
     18 #ifndef _MSC_VER
     19 const size_t StringRef::npos;
     20 #endif
     21 
     22 static char ascii_tolower(char x) {
     23   if (x >= 'A' && x <= 'Z')
     24     return x - 'A' + 'a';
     25   return x;
     26 }
     27 
     28 static bool ascii_isdigit(char x) {
     29   return x >= '0' && x <= '9';
     30 }
     31 
     32 /// compare_lower - Compare strings, ignoring case.
     33 int StringRef::compare_lower(StringRef RHS) const {
     34   for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
     35     unsigned char LHC = ascii_tolower(Data[I]);
     36     unsigned char RHC = ascii_tolower(RHS.Data[I]);
     37     if (LHC != RHC)
     38       return LHC < RHC ? -1 : 1;
     39   }
     40 
     41   if (Length == RHS.Length)
     42     return 0;
     43   return Length < RHS.Length ? -1 : 1;
     44 }
     45 
     46 /// compare_numeric - Compare strings, handle embedded numbers.
     47 int StringRef::compare_numeric(StringRef RHS) const {
     48   for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) {
     49     // Check for sequences of digits.
     50     if (ascii_isdigit(Data[I]) && ascii_isdigit(RHS.Data[I])) {
     51       // The longer sequence of numbers is considered larger.
     52       // This doesn't really handle prefixed zeros well.
     53       size_t J;
     54       for (J = I + 1; J != E + 1; ++J) {
     55         bool ld = J < Length && ascii_isdigit(Data[J]);
     56         bool rd = J < RHS.Length && ascii_isdigit(RHS.Data[J]);
     57         if (ld != rd)
     58           return rd ? -1 : 1;
     59         if (!rd)
     60           break;
     61       }
     62       // The two number sequences have the same length (J-I), just memcmp them.
     63       if (int Res = compareMemory(Data + I, RHS.Data + I, J - I))
     64         return Res < 0 ? -1 : 1;
     65       // Identical number sequences, continue search after the numbers.
     66       I = J - 1;
     67       continue;
     68     }
     69     if (Data[I] != RHS.Data[I])
     70       return (unsigned char)Data[I] < (unsigned char)RHS.Data[I] ? -1 : 1;
     71   }
     72   if (Length == RHS.Length)
     73     return 0;
     74   return Length < RHS.Length ? -1 : 1;
     75 }
     76 
     77 // Compute the edit distance between the two given strings.
     78 unsigned StringRef::edit_distance(llvm::StringRef Other,
     79                                   bool AllowReplacements,
     80                                   unsigned MaxEditDistance) {
     81   // The algorithm implemented below is the "classic"
     82   // dynamic-programming algorithm for computing the Levenshtein
     83   // distance, which is described here:
     84   //
     85   //   http://en.wikipedia.org/wiki/Levenshtein_distance
     86   //
     87   // Although the algorithm is typically described using an m x n
     88   // array, only two rows are used at a time, so this implemenation
     89   // just keeps two separate vectors for those two rows.
     90   size_type m = size();
     91   size_type n = Other.size();
     92 
     93   const unsigned SmallBufferSize = 64;
     94   unsigned SmallBuffer[SmallBufferSize];
     95   llvm::OwningArrayPtr<unsigned> Allocated;
     96   unsigned *previous = SmallBuffer;
     97   if (2*(n + 1) > SmallBufferSize) {
     98     previous = new unsigned [2*(n+1)];
     99     Allocated.reset(previous);
    100   }
    101   unsigned *current = previous + (n + 1);
    102 
    103   for (unsigned i = 0; i <= n; ++i)
    104     previous[i] = i;
    105 
    106   for (size_type y = 1; y <= m; ++y) {
    107     current[0] = y;
    108     unsigned BestThisRow = current[0];
    109 
    110     for (size_type x = 1; x <= n; ++x) {
    111       if (AllowReplacements) {
    112         current[x] = min(previous[x-1] + ((*this)[y-1] == Other[x-1]? 0u:1u),
    113                          min(current[x-1], previous[x])+1);
    114       }
    115       else {
    116         if ((*this)[y-1] == Other[x-1]) current[x] = previous[x-1];
    117         else current[x] = min(current[x-1], previous[x]) + 1;
    118       }
    119       BestThisRow = min(BestThisRow, current[x]);
    120     }
    121 
    122     if (MaxEditDistance && BestThisRow > MaxEditDistance)
    123       return MaxEditDistance + 1;
    124 
    125     unsigned *tmp = current;
    126     current = previous;
    127     previous = tmp;
    128   }
    129 
    130   unsigned Result = previous[n];
    131   return Result;
    132 }
    133 
    134 //===----------------------------------------------------------------------===//
    135 // String Searching
    136 //===----------------------------------------------------------------------===//
    137 
    138 
    139 /// find - Search for the first string \arg Str in the string.
    140 ///
    141 /// \return - The index of the first occurrence of \arg Str, or npos if not
    142 /// found.
    143 size_t StringRef::find(StringRef Str, size_t From) const {
    144   size_t N = Str.size();
    145   if (N > Length)
    146     return npos;
    147 
    148   // For short haystacks or unsupported needles fall back to the naive algorithm
    149   if (Length < 16 || N > 255 || N == 0) {
    150     for (size_t e = Length - N + 1, i = min(From, e); i != e; ++i)
    151       if (substr(i, N).equals(Str))
    152         return i;
    153     return npos;
    154   }
    155 
    156   if (From >= Length)
    157     return npos;
    158 
    159   // Build the bad char heuristic table, with uint8_t to reduce cache thrashing.
    160   uint8_t BadCharSkip[256];
    161   std::memset(BadCharSkip, N, 256);
    162   for (unsigned i = 0; i != N-1; ++i)
    163     BadCharSkip[(uint8_t)Str[i]] = N-1-i;
    164 
    165   unsigned Len = Length-From, Pos = From;
    166   while (Len >= N) {
    167     if (substr(Pos, N).equals(Str)) // See if this is the correct substring.
    168       return Pos;
    169 
    170     // Otherwise skip the appropriate number of bytes.
    171     uint8_t Skip = BadCharSkip[(uint8_t)(*this)[Pos+N-1]];
    172     Len -= Skip;
    173     Pos += Skip;
    174   }
    175 
    176   return npos;
    177 }
    178 
    179 /// rfind - Search for the last string \arg Str in the string.
    180 ///
    181 /// \return - The index of the last occurrence of \arg Str, or npos if not
    182 /// found.
    183 size_t StringRef::rfind(StringRef Str) const {
    184   size_t N = Str.size();
    185   if (N > Length)
    186     return npos;
    187   for (size_t i = Length - N + 1, e = 0; i != e;) {
    188     --i;
    189     if (substr(i, N).equals(Str))
    190       return i;
    191   }
    192   return npos;
    193 }
    194 
    195 /// find_first_of - Find the first character in the string that is in \arg
    196 /// Chars, or npos if not found.
    197 ///
    198 /// Note: O(size() + Chars.size())
    199 StringRef::size_type StringRef::find_first_of(StringRef Chars,
    200                                               size_t From) const {
    201   std::bitset<1 << CHAR_BIT> CharBits;
    202   for (size_type i = 0; i != Chars.size(); ++i)
    203     CharBits.set((unsigned char)Chars[i]);
    204 
    205   for (size_type i = min(From, Length), e = Length; i != e; ++i)
    206     if (CharBits.test((unsigned char)Data[i]))
    207       return i;
    208   return npos;
    209 }
    210 
    211 /// find_first_not_of - Find the first character in the string that is not
    212 /// \arg C or npos if not found.
    213 StringRef::size_type StringRef::find_first_not_of(char C, size_t From) const {
    214   for (size_type i = min(From, Length), e = Length; i != e; ++i)
    215     if (Data[i] != C)
    216       return i;
    217   return npos;
    218 }
    219 
    220 /// find_first_not_of - Find the first character in the string that is not
    221 /// in the string \arg Chars, or npos if not found.
    222 ///
    223 /// Note: O(size() + Chars.size())
    224 StringRef::size_type StringRef::find_first_not_of(StringRef Chars,
    225                                                   size_t From) const {
    226   std::bitset<1 << CHAR_BIT> CharBits;
    227   for (size_type i = 0; i != Chars.size(); ++i)
    228     CharBits.set((unsigned char)Chars[i]);
    229 
    230   for (size_type i = min(From, Length), e = Length; i != e; ++i)
    231     if (!CharBits.test((unsigned char)Data[i]))
    232       return i;
    233   return npos;
    234 }
    235 
    236 /// find_last_of - Find the last character in the string that is in \arg C,
    237 /// or npos if not found.
    238 ///
    239 /// Note: O(size() + Chars.size())
    240 StringRef::size_type StringRef::find_last_of(StringRef Chars,
    241                                              size_t From) const {
    242   std::bitset<1 << CHAR_BIT> CharBits;
    243   for (size_type i = 0; i != Chars.size(); ++i)
    244     CharBits.set((unsigned char)Chars[i]);
    245 
    246   for (size_type i = min(From, Length) - 1, e = -1; i != e; --i)
    247     if (CharBits.test((unsigned char)Data[i]))
    248       return i;
    249   return npos;
    250 }
    251 
    252 //===----------------------------------------------------------------------===//
    253 // Helpful Algorithms
    254 //===----------------------------------------------------------------------===//
    255 
    256 /// count - Return the number of non-overlapped occurrences of \arg Str in
    257 /// the string.
    258 size_t StringRef::count(StringRef Str) const {
    259   size_t Count = 0;
    260   size_t N = Str.size();
    261   if (N > Length)
    262     return 0;
    263   for (size_t i = 0, e = Length - N + 1; i != e; ++i)
    264     if (substr(i, N).equals(Str))
    265       ++Count;
    266   return Count;
    267 }
    268 
    269 static unsigned GetAutoSenseRadix(StringRef &Str) {
    270   if (Str.startswith("0x")) {
    271     Str = Str.substr(2);
    272     return 16;
    273   } else if (Str.startswith("0b")) {
    274     Str = Str.substr(2);
    275     return 2;
    276   } else if (Str.startswith("0")) {
    277     return 8;
    278   } else {
    279     return 10;
    280   }
    281 }
    282 
    283 
    284 /// GetAsUnsignedInteger - Workhorse method that converts a integer character
    285 /// sequence of radix up to 36 to an unsigned long long value.
    286 static bool GetAsUnsignedInteger(StringRef Str, unsigned Radix,
    287                                  unsigned long long &Result) {
    288   // Autosense radix if not specified.
    289   if (Radix == 0)
    290     Radix = GetAutoSenseRadix(Str);
    291 
    292   // Empty strings (after the radix autosense) are invalid.
    293   if (Str.empty()) return true;
    294 
    295   // Parse all the bytes of the string given this radix.  Watch for overflow.
    296   Result = 0;
    297   while (!Str.empty()) {
    298     unsigned CharVal;
    299     if (Str[0] >= '0' && Str[0] <= '9')
    300       CharVal = Str[0]-'0';
    301     else if (Str[0] >= 'a' && Str[0] <= 'z')
    302       CharVal = Str[0]-'a'+10;
    303     else if (Str[0] >= 'A' && Str[0] <= 'Z')
    304       CharVal = Str[0]-'A'+10;
    305     else
    306       return true;
    307 
    308     // If the parsed value is larger than the integer radix, the string is
    309     // invalid.
    310     if (CharVal >= Radix)
    311       return true;
    312 
    313     // Add in this character.
    314     unsigned long long PrevResult = Result;
    315     Result = Result*Radix+CharVal;
    316 
    317     // Check for overflow.
    318     if (Result < PrevResult)
    319       return true;
    320 
    321     Str = Str.substr(1);
    322   }
    323 
    324   return false;
    325 }
    326 
    327 bool StringRef::getAsInteger(unsigned Radix, unsigned long long &Result) const {
    328   return GetAsUnsignedInteger(*this, Radix, Result);
    329 }
    330 
    331 
    332 bool StringRef::getAsInteger(unsigned Radix, long long &Result) const {
    333   unsigned long long ULLVal;
    334 
    335   // Handle positive strings first.
    336   if (empty() || front() != '-') {
    337     if (GetAsUnsignedInteger(*this, Radix, ULLVal) ||
    338         // Check for value so large it overflows a signed value.
    339         (long long)ULLVal < 0)
    340       return true;
    341     Result = ULLVal;
    342     return false;
    343   }
    344 
    345   // Get the positive part of the value.
    346   if (GetAsUnsignedInteger(substr(1), Radix, ULLVal) ||
    347       // Reject values so large they'd overflow as negative signed, but allow
    348       // "-0".  This negates the unsigned so that the negative isn't undefined
    349       // on signed overflow.
    350       (long long)-ULLVal > 0)
    351     return true;
    352 
    353   Result = -ULLVal;
    354   return false;
    355 }
    356 
    357 bool StringRef::getAsInteger(unsigned Radix, int &Result) const {
    358   long long Val;
    359   if (getAsInteger(Radix, Val) ||
    360       (int)Val != Val)
    361     return true;
    362   Result = Val;
    363   return false;
    364 }
    365 
    366 bool StringRef::getAsInteger(unsigned Radix, unsigned &Result) const {
    367   unsigned long long Val;
    368   if (getAsInteger(Radix, Val) ||
    369       (unsigned)Val != Val)
    370     return true;
    371   Result = Val;
    372   return false;
    373 }
    374 
    375 bool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
    376   StringRef Str = *this;
    377 
    378   // Autosense radix if not specified.
    379   if (Radix == 0)
    380     Radix = GetAutoSenseRadix(Str);
    381 
    382   assert(Radix > 1 && Radix <= 36);
    383 
    384   // Empty strings (after the radix autosense) are invalid.
    385   if (Str.empty()) return true;
    386 
    387   // Skip leading zeroes.  This can be a significant improvement if
    388   // it means we don't need > 64 bits.
    389   while (!Str.empty() && Str.front() == '0')
    390     Str = Str.substr(1);
    391 
    392   // If it was nothing but zeroes....
    393   if (Str.empty()) {
    394     Result = APInt(64, 0);
    395     return false;
    396   }
    397 
    398   // (Over-)estimate the required number of bits.
    399   unsigned Log2Radix = 0;
    400   while ((1U << Log2Radix) < Radix) Log2Radix++;
    401   bool IsPowerOf2Radix = ((1U << Log2Radix) == Radix);
    402 
    403   unsigned BitWidth = Log2Radix * Str.size();
    404   if (BitWidth < Result.getBitWidth())
    405     BitWidth = Result.getBitWidth(); // don't shrink the result
    406   else
    407     Result = Result.zext(BitWidth);
    408 
    409   APInt RadixAP, CharAP; // unused unless !IsPowerOf2Radix
    410   if (!IsPowerOf2Radix) {
    411     // These must have the same bit-width as Result.
    412     RadixAP = APInt(BitWidth, Radix);
    413     CharAP = APInt(BitWidth, 0);
    414   }
    415 
    416   // Parse all the bytes of the string given this radix.
    417   Result = 0;
    418   while (!Str.empty()) {
    419     unsigned CharVal;
    420     if (Str[0] >= '0' && Str[0] <= '9')
    421       CharVal = Str[0]-'0';
    422     else if (Str[0] >= 'a' && Str[0] <= 'z')
    423       CharVal = Str[0]-'a'+10;
    424     else if (Str[0] >= 'A' && Str[0] <= 'Z')
    425       CharVal = Str[0]-'A'+10;
    426     else
    427       return true;
    428 
    429     // If the parsed value is larger than the integer radix, the string is
    430     // invalid.
    431     if (CharVal >= Radix)
    432       return true;
    433 
    434     // Add in this character.
    435     if (IsPowerOf2Radix) {
    436       Result <<= Log2Radix;
    437       Result |= CharVal;
    438     } else {
    439       Result *= RadixAP;
    440       CharAP = CharVal;
    441       Result += CharAP;
    442     }
    443 
    444     Str = Str.substr(1);
    445   }
    446 
    447   return false;
    448 }
    449