diff options
Diffstat (limited to 'lib/Support/StringRef.cpp')
| -rw-r--r-- | lib/Support/StringRef.cpp | 31 | 
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/Support/StringRef.cpp b/lib/Support/StringRef.cpp index d7a0bfa41005..bfae7543625e 100644 --- a/lib/Support/StringRef.cpp +++ b/lib/Support/StringRef.cpp @@ -37,20 +37,39 @@ static bool ascii_isdigit(char x) {    return x >= '0' && x <= '9';  } -/// compare_lower - Compare strings, ignoring case. -int StringRef::compare_lower(StringRef RHS) const { -  for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) { -    unsigned char LHC = ascii_tolower(Data[I]); -    unsigned char RHC = ascii_tolower(RHS.Data[I]); +// strncasecmp() is not available on non-POSIX systems, so define an +// alternative function here. +static int ascii_strncasecmp(const char *LHS, const char *RHS, size_t Length) { +  for (size_t I = 0; I < Length; ++I) { +    unsigned char LHC = ascii_tolower(LHS[I]); +    unsigned char RHC = ascii_tolower(RHS[I]);      if (LHC != RHC)        return LHC < RHC ? -1 : 1;    } +  return 0; +} +/// compare_lower - Compare strings, ignoring case. +int StringRef::compare_lower(StringRef RHS) const { +  if (int Res = ascii_strncasecmp(Data, RHS.Data, min(Length, RHS.Length))) +    return Res;    if (Length == RHS.Length)      return 0;    return Length < RHS.Length ? -1 : 1;  } +/// Check if this string starts with the given \p Prefix, ignoring case. +bool StringRef::startswith_lower(StringRef Prefix) const { +  return Length >= Prefix.Length && +      ascii_strncasecmp(Data, Prefix.Data, Prefix.Length) == 0; +} + +/// Check if this string ends with the given \p Suffix, ignoring case. +bool StringRef::endswith_lower(StringRef Suffix) const { +  return Length >= Suffix.Length && +      ascii_strncasecmp(end() - Suffix.Length, Suffix.Data, Suffix.Length) == 0; +} +  /// compare_numeric - Compare strings, handle embedded numbers.  int StringRef::compare_numeric(StringRef RHS) const {    for (size_t I = 0, E = min(Length, RHS.Length); I != E; ++I) { @@ -85,7 +104,7 @@ int StringRef::compare_numeric(StringRef RHS) const {  // Compute the edit distance between the two given strings.  unsigned StringRef::edit_distance(llvm::StringRef Other,                                    bool AllowReplacements, -                                  unsigned MaxEditDistance) { +                                  unsigned MaxEditDistance) const {    return llvm::ComputeEditDistance(        llvm::ArrayRef<char>(data(), size()),        llvm::ArrayRef<char>(Other.data(), Other.size()),  | 
