std::string makeAbsolutePath()

in facebook-clang-plugins/libtooling/FileUtils.cpp [22:67]


std::string makeAbsolutePath(const std::string &currentWorkingDirectory,
                             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());
}