Index: base/file_path.cc |
diff --git a/base/file_path.cc b/base/file_path.cc |
index a00659ed2c78e738cf679e61224a9d0a87b17367..e3dfbbd194be413b9137db7aac0edd140b81a227 100644 |
--- a/base/file_path.cc |
+++ b/base/file_path.cc |
@@ -61,6 +61,16 @@ bool IsPathAbsolute(const FilePath::StringType& path) { |
#endif // FILE_PATH_USES_DRIVE_LETTERS |
} |
+bool AreAllSeparators(FilePath::StringType input) { |
+ for (FilePath::StringType::const_iterator it = input.begin(); |
+ it != input.end(); ++it) { |
+ if (!FilePath::IsSeparator(*it)) |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
} // namespace |
bool FilePath::IsSeparator(CharType character) { |
@@ -73,6 +83,68 @@ bool FilePath::IsSeparator(CharType character) { |
return false; |
} |
+void FilePath::GetComponents(std::vector<FilePath::StringType>* components) |
+ const { |
+ DCHECK(components); |
+ if (!components) |
+ return; |
+ components->clear(); |
+ if (value().empty()) |
+ return; |
+ |
+ std::vector<FilePath::StringType> ret_val; |
+ FilePath current = *this; |
+ FilePath base; |
+ |
+ // Capture path components. |
+ while (current != current.DirName()) { |
+ base = current.BaseName(); |
+ if (!AreAllSeparators(base.value())) |
+ ret_val.push_back(base.value()); |
+ current = current.DirName(); |
+ } |
+ |
+ // Capture root, if any. |
+ base = current.BaseName(); |
+ if (!base.value().empty() && base.value() != kCurrentDirectory) |
+ ret_val.push_back(current.BaseName().value()); |
+ |
+ // Capture drive letter, if any. |
+ FilePath dir = current.DirName(); |
+ StringType::size_type letter = FindDriveLetter(dir.value()); |
+ if (letter != FilePath::StringType::npos) { |
+ ret_val.push_back(FilePath::StringType(dir.value(), 0, letter + 1)); |
+ } |
+ |
+ *components = std::vector<FilePath::StringType>(ret_val.rbegin(), |
+ ret_val.rend()); |
+} |
+ |
+bool FilePath::IsParent(const FilePath& child) const { |
+ std::vector<FilePath::StringType> parent_components; |
+ std::vector<FilePath::StringType> child_components; |
+ GetComponents(&parent_components); |
+ child.GetComponents(&child_components); |
+ |
+ if (parent_components.size() >= child_components.size()) |
+ return false; |
+ if (parent_components.size() == 0) |
+ return false; |
+ |
+ std::vector<FilePath::StringType>::const_iterator parent_comp = |
+ parent_components.begin(); |
+ std::vector<FilePath::StringType>::const_iterator child_comp = |
+ child_components.begin(); |
+ while (parent_comp != parent_components.end()) { |
+ if (*parent_comp != *child_comp) |
+ return false; |
+ ++parent_comp; |
+ ++child_comp; |
+ } |
+ |
+ return true; |
+} |
+ |
// libgen's dirname and basename aren't guaranteed to be thread-safe and aren't |
// guaranteed to not modify their input strings, and in fact are implemented |
// differently in this regard on different platforms. Don't use them, but |