1*cb14a3feSDimitry Andric //===- Utils.cpp ----------------------------------------------------------===//
2*cb14a3feSDimitry Andric //
3*cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*cb14a3feSDimitry Andric //
7*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===//
8*cb14a3feSDimitry Andric //
9*cb14a3feSDimitry Andric // Implements utility functions for TextAPI Darwin operations.
10*cb14a3feSDimitry Andric //
11*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===//
12*cb14a3feSDimitry Andric 
13*cb14a3feSDimitry Andric #include "llvm/TextAPI/Utils.h"
14*cb14a3feSDimitry Andric 
15*cb14a3feSDimitry Andric using namespace llvm;
16*cb14a3feSDimitry Andric using namespace llvm::MachO;
17*cb14a3feSDimitry Andric 
replace_extension(SmallVectorImpl<char> & Path,const Twine & Extension)18*cb14a3feSDimitry Andric void llvm::MachO::replace_extension(SmallVectorImpl<char> &Path,
19*cb14a3feSDimitry Andric                                     const Twine &Extension) {
20*cb14a3feSDimitry Andric   StringRef P(Path.begin(), Path.size());
21*cb14a3feSDimitry Andric   auto ParentPath = sys::path::parent_path(P);
22*cb14a3feSDimitry Andric   auto Filename = sys::path::filename(P);
23*cb14a3feSDimitry Andric 
24*cb14a3feSDimitry Andric   if (!ParentPath.ends_with(Filename.str() + ".framework")) {
25*cb14a3feSDimitry Andric     sys::path::replace_extension(Path, Extension);
26*cb14a3feSDimitry Andric     return;
27*cb14a3feSDimitry Andric   }
28*cb14a3feSDimitry Andric   // Framework dylibs do not have a file extension, in those cases the new
29*cb14a3feSDimitry Andric   // extension is appended. e.g. given Path: "Foo.framework/Foo" and Extension:
30*cb14a3feSDimitry Andric   // "tbd", the result is "Foo.framework/Foo.tbd".
31*cb14a3feSDimitry Andric   SmallString<8> Storage;
32*cb14a3feSDimitry Andric   StringRef Ext = Extension.toStringRef(Storage);
33*cb14a3feSDimitry Andric 
34*cb14a3feSDimitry Andric   // Append '.' if needed.
35*cb14a3feSDimitry Andric   if (!Ext.empty() && Ext[0] != '.')
36*cb14a3feSDimitry Andric     Path.push_back('.');
37*cb14a3feSDimitry Andric 
38*cb14a3feSDimitry Andric   // Append extension.
39*cb14a3feSDimitry Andric   Path.append(Ext.begin(), Ext.end());
40*cb14a3feSDimitry Andric }
41