diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-05 16:39:38 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-05 16:39:38 +0000 |
commit | 61d6f739a8bb22ffeeaa5e99147af24de41efd8b (patch) | |
tree | bd84594ce0b9d3a9b1e1490e9d17259b215c623b /llvm/lib/Support/PathV2.cpp | |
parent | 98879d7641353d1821a6af7c9c231cfd3574b1df (diff) | |
download | bcm5719-llvm-61d6f739a8bb22ffeeaa5e99147af24de41efd8b.tar.gz bcm5719-llvm-61d6f739a8bb22ffeeaa5e99147af24de41efd8b.zip |
Support/PathV2: Implement remove_all.
llvm-svn: 122884
Diffstat (limited to 'llvm/lib/Support/PathV2.cpp')
-rw-r--r-- | llvm/lib/Support/PathV2.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/lib/Support/PathV2.cpp b/llvm/lib/Support/PathV2.cpp index 481a0387786..3b232abf7d0 100644 --- a/llvm/lib/Support/PathV2.cpp +++ b/llvm/lib/Support/PathV2.cpp @@ -697,6 +697,43 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result) { return success; } +namespace { +error_code remove_all_r(StringRef path, file_type ft, uint32_t &count) { + if (ft == file_type::directory_file) { + // This code would be a lot better with exceptions ;/. + error_code ec; + for (directory_iterator i(path, ec), e; i != e; i.increment(ec)) { + if (ec) return ec; + file_status st; + if (error_code ec = i->status(st)) return ec; + if (error_code ec = remove_all_r(i->path(), st.type(), count)) return ec; + } + bool obviously_this_exists; + if (error_code ec = remove(path, obviously_this_exists)) return ec; + assert(obviously_this_exists); + ++count; // Include the directory itself in the items removed. + } else { + bool obviously_this_exists; + if (error_code ec = remove(path, obviously_this_exists)) return ec; + assert(obviously_this_exists); + ++count; + } + + return success; +} +} + +error_code remove_all(const Twine &path, uint32_t &num_removed) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + file_status fs; + if (error_code ec = status(path, fs)) + return ec; + num_removed = 0; + return remove_all_r(p, fs.type(), num_removed); +} + error_code directory_entry::status(file_status &result) const { return fs::status(Path, result); } |