Define sys::path::convert_to_slash

This patch moves convertToUnixPathSeparator from LLD to LLVM.

Differential Revision: https://reviews.llvm.org/D28444

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291414 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rui Ueyama 2017-01-09 01:47:15 +00:00
parent 8839e0c240
commit d9a8ccc226
3 changed files with 20 additions and 10 deletions

View File

@ -207,6 +207,14 @@ void native(const Twine &path, SmallVectorImpl<char> &result);
/// @param path A path that is transformed to native format.
void native(SmallVectorImpl<char> &path);
/// @brief Replaces backslashes with slashes if Windows.
///
/// @param path processed path
/// @result The result of replacing backslashes with forward slashes if Windows.
/// On Unix, this function is a no-op because backslashes are valid path
/// chracters.
std::string convert_to_slash(StringRef path);
/// @}
/// @name Lexical Observers
/// @{

View File

@ -571,6 +571,16 @@ void native(SmallVectorImpl<char> &Path) {
#endif
}
std::string convert_to_slash(StringRef path) {
#ifdef LLVM_ON_WIN32
std::string s = path.str();
std::replace(s.begin(), s.end(), '\\', '/');
return s;
#else
return path;
#endif
}
StringRef filename(StringRef path) {
return *rbegin(path);
}

View File

@ -26,6 +26,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Path.h"
using namespace llvm;
@ -147,15 +148,6 @@ static void writeUstarHeader(raw_fd_ostream &OS, StringRef Path, size_t Size) {
OS << StringRef(reinterpret_cast<char *>(&Hdr), sizeof(Hdr));
}
// We want to use '/' as a path separator even on Windows.
// This function canonicalizes a given path.
static std::string canonicalize(std::string S) {
#ifdef LLVM_ON_WIN32
std::replace(S.begin(), S.end(), '\\', '/');
#endif
return S;
}
// Creates a TarWriter instance and returns it.
Expected<std::unique_ptr<TarWriter>> TarWriter::create(StringRef OutputPath,
StringRef BaseDir) {
@ -171,7 +163,7 @@ TarWriter::TarWriter(int FD, StringRef BaseDir)
// Append a given file to an archive.
void TarWriter::append(StringRef Path, StringRef Data) {
// Write Path and Data.
std::string S = BaseDir + "/" + canonicalize(Path) + "\0";
std::string S = BaseDir + "/" + sys::path::convert_to_slash(Path) + "\0";
if (fitsInUstar(S)) {
writeUstarHeader(OS, S, Data.size());
} else {