| //===- OptionStrCmp.cpp - Option String Comparison --------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Support/OptionStrCmp.h" |
| #include "llvm/ADT/STLExtras.h" |
| |
| using namespace llvm; |
| |
| // Comparison function for Option strings (option names & prefixes). |
| // The ordering is *almost* case-insensitive lexicographic, with an exception. |
| // '\0' comes at the end of the alphabet instead of the beginning (thus options |
| // precede any other options which prefix them). Additionally, if two options |
| // are identical ignoring case, they are ordered according to case sensitive |
| // ordering if `FallbackCaseSensitive` is true. |
| int llvm::StrCmpOptionName(StringRef A, StringRef B, |
| bool FallbackCaseSensitive) { |
| size_t MinSize = std::min(A.size(), B.size()); |
| if (int Res = A.substr(0, MinSize).compare_insensitive(B.substr(0, MinSize))) |
| return Res; |
| |
| // If they are identical ignoring case, use case sensitive ordering. |
| if (A.size() == B.size()) |
| return FallbackCaseSensitive ? A.compare(B) : 0; |
| |
| return (A.size() == MinSize) ? 1 /* A is a prefix of B. */ |
| : -1 /* B is a prefix of A */; |
| } |
| |
| // Comparison function for Option prefixes. |
| int llvm::StrCmpOptionPrefixes(ArrayRef<StringRef> APrefixes, |
| ArrayRef<StringRef> BPrefixes) { |
| for (const auto &[APre, BPre] : zip(APrefixes, BPrefixes)) { |
| if (int Cmp = StrCmpOptionName(APre, BPre)) |
| return Cmp; |
| } |
| // Both prefixes are identical. |
| return 0; |
| } |