xref: /src/contrib/llvm-project/clang/lib/InstallAPI/Library.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1ac9a064cSDimitry Andric //===- Library.cpp --------------------------------------------------------===//
2ac9a064cSDimitry Andric //
3ac9a064cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ac9a064cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5ac9a064cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac9a064cSDimitry Andric //
7ac9a064cSDimitry Andric //===----------------------------------------------------------------------===//
8ac9a064cSDimitry Andric 
9ac9a064cSDimitry Andric #include "clang/InstallAPI/Library.h"
10ac9a064cSDimitry Andric 
11ac9a064cSDimitry Andric using namespace llvm;
12ac9a064cSDimitry Andric namespace clang::installapi {
13ac9a064cSDimitry Andric 
14ac9a064cSDimitry Andric const Regex Rule("(.+)/(.+)\\.framework/");
getFrameworkNameFromInstallName(StringRef InstallName)15ac9a064cSDimitry Andric StringRef Library::getFrameworkNameFromInstallName(StringRef InstallName) {
16ac9a064cSDimitry Andric   assert(InstallName.contains(".framework") && "expected a framework");
17ac9a064cSDimitry Andric   SmallVector<StringRef, 3> Match;
18ac9a064cSDimitry Andric   Rule.match(InstallName, &Match);
19ac9a064cSDimitry Andric   if (Match.empty())
20ac9a064cSDimitry Andric     return "";
21ac9a064cSDimitry Andric   return Match.back();
22ac9a064cSDimitry Andric }
23ac9a064cSDimitry Andric 
getName() const24ac9a064cSDimitry Andric StringRef Library::getName() const {
25ac9a064cSDimitry Andric   assert(!IsUnwrappedDylib && "expected a framework");
26ac9a064cSDimitry Andric   StringRef Path = BaseDirectory;
27ac9a064cSDimitry Andric 
28ac9a064cSDimitry Andric   // Return the framework name extracted from path.
29ac9a064cSDimitry Andric   while (!Path.empty()) {
30ac9a064cSDimitry Andric     if (Path.ends_with(".framework"))
31ac9a064cSDimitry Andric       return sys::path::filename(Path);
32ac9a064cSDimitry Andric     Path = sys::path::parent_path(Path);
33ac9a064cSDimitry Andric   }
34ac9a064cSDimitry Andric 
35ac9a064cSDimitry Andric   // Otherwise, return the name of the BaseDirectory.
36ac9a064cSDimitry Andric   Path = BaseDirectory;
37ac9a064cSDimitry Andric   return sys::path::filename(Path.rtrim("/"));
38ac9a064cSDimitry Andric }
39ac9a064cSDimitry Andric 
40ac9a064cSDimitry Andric } // namespace clang::installapi
41