in facebook-clang-plugins/libtooling/FileUtils.cpp [22:67]
std::string makeAbsolutePath(const std::string ¤tWorkingDirectory,
std::string path) {
llvm::SmallVector<char, 16> result;
std::vector<std::string> elements;
int skip = 0;
if (llvm::sys::path::is_relative(path)) {
// Prepend currentWorkingDirectory to path (unless currentWorkingDirectory
// is empty).
llvm::SmallVector<char, 16> vec(currentWorkingDirectory.begin(),
currentWorkingDirectory.end());
llvm::sys::path::append(vec, path);
path = std::string(vec.begin(), vec.end());
} else {
// Else copy the separator to maintain an absolute path.
result.append(1, path.front());
}
elements.push_back(llvm::sys::path::filename(path).str());
while (llvm::sys::path::has_parent_path(path)) {
path = llvm::sys::path::parent_path(path).str();
const std::string &element(llvm::sys::path::filename(path).str());
if (element == ".") {
continue;
}
if (element == "..") {
skip++;
continue;
}
if (skip > 0) {
skip--;
continue;
}
elements.push_back(element);
}
while (skip > 0) {
elements.push_back("..");
skip--;
}
for (auto I = elements.rbegin(), E = elements.rend(); I != E; I++) {
llvm::sys::path::append(result, *I);
}
return std::string(result.begin(), result.end());
}