diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-05-27 15:15:58 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-05-27 15:15:58 +0000 | 
| commit | abdf259d487163e72081a8cf4991b1617206b41e (patch) | |
| tree | 9fad9a5d5dd8c4ff54af48edad9c8cc26dd5fda1 /lib/Support/StringRef.cpp | |
| parent | 59161dfae3225dd9151afbc76ca9074598c0c605 (diff) | |
Notes
Diffstat (limited to 'lib/Support/StringRef.cpp')
| -rw-r--r-- | lib/Support/StringRef.cpp | 28 | 
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Support/StringRef.cpp b/lib/Support/StringRef.cpp index 2b262dcd3fa7..ca0f518a88b6 100644 --- a/lib/Support/StringRef.cpp +++ b/lib/Support/StringRef.cpp @@ -23,6 +23,10 @@ static char ascii_tolower(char x) {    return x;  } +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) { @@ -37,6 +41,30 @@ int StringRef::compare_lower(StringRef RHS) const {    return Length < RHS.Length ? -1 : 1;  } +/// 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) { +    if (Data[I] == RHS.Data[I]) +      continue; +    if (ascii_isdigit(Data[I]) && ascii_isdigit(RHS.Data[I])) { +      // The longer sequence of numbers is larger. This doesn't really handle +      // prefixed zeros well. +      for (size_t J = I+1; J != E+1; ++J) { +        bool ld = J < Length && ascii_isdigit(Data[J]); +        bool rd = J < RHS.Length && ascii_isdigit(RHS.Data[J]); +        if (ld != rd) +          return rd ? -1 : 1; +        if (!rd) +          break; +      } +    } +    return Data[I] < RHS.Data[I] ? -1 : 1; +  } +  if (Length == RHS.Length) +        return 0; +  return Length < RHS.Length ? -1 : 1; +} +  // Compute the edit distance between the two given strings.  unsigned StringRef::edit_distance(llvm::StringRef Other,                                     bool AllowReplacements) {  | 
