From ee271d8758c8493f2cadf5b9c0ec57431565891b Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Tue, 7 Dec 2010 03:57:17 +0000 Subject: [PATCH] Support/PathV2: Move make_absolute from path to fs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121108 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/FileSystem.h | 13 ++++ include/llvm/Support/PathV2.h | 13 ---- lib/Support/PathV2.cpp | 112 +++++++++++++++--------------- unittests/Support/Path.cpp | 2 +- 4 files changed, 71 insertions(+), 69 deletions(-) diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 5b8e2eab8ef..121e77066ee 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -104,6 +104,19 @@ public: /// @name Physical Operators /// @{ +/// @brief Make \a path an absolute path. +/// +/// Makes \a path absolute using the current directory if it is not already. An +/// empty \a path will result in the current directory. +/// +/// /absolute/path => /absolute/path +/// relative/../path => /relative/../path +/// +/// @param path A path that is modified to be an absolute path. +/// @returns errc::success if \a path has been made absolute, otherwise a +/// platform specific error_code. +error_code make_absolute(SmallVectorImpl &path); + /// @brief Copy the file at \a from to the path \a to. /// /// @param from The path to copy the file from. diff --git a/include/llvm/Support/PathV2.h b/include/llvm/Support/PathV2.h index 79760d1db50..e2006fe2662 100644 --- a/include/llvm/Support/PathV2.h +++ b/include/llvm/Support/PathV2.h @@ -117,19 +117,6 @@ inline reverse_iterator rend(const StringRef &path) { /// @name Lexical Modifiers /// @{ -/// @brief Make \a path an absolute path. -/// -/// Makes \a path absolute using the current directory if it is not already. An -/// empty \a path will result in the current directory. -/// -/// /absolute/path => /absolute/path -/// relative/../path => /relative/../path -/// -/// @param path A path that is modified to be an absolute path. -/// @returns errc::success if \a path has been made absolute, otherwise a -/// platform specific error_code. -error_code make_absolute(SmallVectorImpl &path); - /// @brief Remove the last component from \a path unless it is the root dir. /// /// directory/filename.cpp => directory/ diff --git a/lib/Support/PathV2.cpp b/lib/Support/PathV2.cpp index 7b99287e1e3..9f522cf0040 100644 --- a/lib/Support/PathV2.cpp +++ b/lib/Support/PathV2.cpp @@ -424,61 +424,6 @@ error_code append(SmallVectorImpl &path, const Twine &a, return success; } -error_code make_absolute(SmallVectorImpl &path) { - StringRef p(path.data(), path.size()); - - bool rootName = false, rootDirectory = false; - if (error_code ec = has_root_name(p, rootName)) return ec; - if (error_code ec = has_root_directory(p, rootDirectory)) return ec; - - // Already absolute. - if (rootName && rootDirectory) - return success; - - // All of the following conditions will need the current directory. - SmallString<128> current_dir; - if (error_code ec = fs::current_path(current_dir)) return ec; - - // Relative path. Prepend the current directory. - if (!rootName && !rootDirectory) { - // Append path to the current directory. - if (error_code ec = append(current_dir, p)) return ec; - // Set path to the result. - path.swap(current_dir); - return success; - } - - if (!rootName && rootDirectory) { - StringRef cdrn; - if (error_code ec = root_name(current_dir, cdrn)) return ec; - SmallString<128> curDirRootName(cdrn.begin(), cdrn.end()); - if (error_code ec = append(curDirRootName, p)) return ec; - // Set path to the result. - path.swap(curDirRootName); - return success; - } - - if (rootName && !rootDirectory) { - StringRef pRootName; - StringRef bRootDirectory; - StringRef bRelativePath; - StringRef pRelativePath; - if (error_code ec = root_name(p, pRootName)) return ec; - if (error_code ec = root_directory(current_dir, bRootDirectory)) return ec; - if (error_code ec = relative_path(current_dir, bRelativePath)) return ec; - if (error_code ec = relative_path(p, pRelativePath)) return ec; - - SmallString<128> res; - if (error_code ec = append(res, pRootName, bRootDirectory, - bRelativePath, pRelativePath)) return ec; - path.swap(res); - return success; - } - - llvm_unreachable("All rootName and rootDirectory combinations should have " - "occurred above!"); -} - error_code parent_path(const StringRef &path, StringRef &result) { size_t end_pos = parent_path_end(path); if (end_pos == StringRef::npos) @@ -673,6 +618,63 @@ error_code is_relative(const Twine &path, bool &result) { namespace fs { +error_code make_absolute(SmallVectorImpl &path) { + StringRef p(path.data(), path.size()); + + bool rootName = false, rootDirectory = false; + if (error_code ec = path::has_root_name(p, rootName)) return ec; + if (error_code ec = path::has_root_directory(p, rootDirectory)) return ec; + + // Already absolute. + if (rootName && rootDirectory) + return success; + + // All of the following conditions will need the current directory. + SmallString<128> current_dir; + if (error_code ec = current_path(current_dir)) return ec; + + // Relative path. Prepend the current directory. + if (!rootName && !rootDirectory) { + // Append path to the current directory. + if (error_code ec = path::append(current_dir, p)) return ec; + // Set path to the result. + path.swap(current_dir); + return success; + } + + if (!rootName && rootDirectory) { + StringRef cdrn; + if (error_code ec = path::root_name(current_dir, cdrn)) return ec; + SmallString<128> curDirRootName(cdrn.begin(), cdrn.end()); + if (error_code ec = path::append(curDirRootName, p)) return ec; + // Set path to the result. + path.swap(curDirRootName); + return success; + } + + if (rootName && !rootDirectory) { + StringRef pRootName; + StringRef bRootDirectory; + StringRef bRelativePath; + StringRef pRelativePath; + if (error_code ec = path::root_name(p, pRootName)) return ec; + if (error_code ec = path::root_directory(current_dir, bRootDirectory)) + return ec; + if (error_code ec = path::relative_path(current_dir, bRelativePath)) + return ec; + if (error_code ec = path::relative_path(p, pRelativePath)) return ec; + + SmallString<128> res; + if (error_code ec = path::append(res, pRootName, bRootDirectory, + bRelativePath, pRelativePath)) return ec; + path.swap(res); + return success; + } + + llvm_unreachable("All rootName and rootDirectory combinations should have " + "occurred above!"); +} + error_code create_directories(const Twine &path, bool &existed) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index 76a16a351c8..cd44bbe5b9f 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -104,7 +104,7 @@ TEST(Support, Path) { SmallString<16> temp_store; temp_store = *i; - ASSERT_FALSE(path::make_absolute(temp_store)); + ASSERT_FALSE(fs::make_absolute(temp_store)); temp_store = *i; ASSERT_FALSE(path::remove_filename(temp_store)); -- 2.34.1