X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FPathV2.cpp;h=6d2ca4eecd066fffeff06b23da2f6cf46ba8d202;hb=3ce88c92905c173e39e9ae29c53d0755504a76f6;hp=2c1d92dbcac4e0f70af582e3b0bce0843e5928b4;hpb=a6091be84c0ee838fb117b9cfb8eb9c156d44fad;p=oota-llvm.git diff --git a/lib/Support/PathV2.cpp b/lib/Support/PathV2.cpp index 2c1d92dbcac..6d2ca4eecd0 100644 --- a/lib/Support/PathV2.cpp +++ b/lib/Support/PathV2.cpp @@ -31,7 +31,7 @@ namespace { #ifdef LLVM_ON_WIN32 const StringRef separators = "\\/"; - const char prefered_separator = '\\'; + const char prefered_separator = '\\'; #else const StringRef separators = "/"; const char prefered_separator = '/'; @@ -39,7 +39,7 @@ namespace { const llvm::error_code success; - StringRef find_first_component(const StringRef &path) { + StringRef find_first_component(StringRef path) { // Look for this first component in the following order. // * empty (in this case we return an empty string) // * either C: or {//,\\}net. @@ -50,46 +50,41 @@ namespace { if (path.empty()) return path; +#ifdef LLVM_ON_WIN32 // C: if (path.size() >= 2 && std::isalpha(path[0]) && path[1] == ':') - return StringRef(path.begin(), 2); + return path.substr(0, 2); +#endif // //net if ((path.size() > 2) && - (path.startswith("\\\\") || path.startswith("//")) && - (path[2] != '\\' && path[2] != '/')) { + is_separator(path[0]) && + path[0] == path[1] && + !is_separator(path[2])) { // Find the next directory separator. - size_t end = path.find_first_of("\\/", 2); - if (end == StringRef::npos) - return path; - else - return StringRef(path.begin(), end); + size_t end = path.find_first_of(separators, 2); + return path.substr(0, end); } // {/,\} - if (path[0] == '\\' || path[0] == '/') - return StringRef(path.begin(), 1); + if (is_separator(path[0])) + return path.substr(0, 1); if (path.startswith("..")) - return StringRef(path.begin(), 2); + return path.substr(0, 2); if (path[0] == '.') - return StringRef(path.begin(), 1); + return path.substr(0, 1); // * {file,directory}name - size_t end = path.find_first_of("\\/", 2); - if (end == StringRef::npos) - return path; - else - return StringRef(path.begin(), end); - - return StringRef(); + size_t end = path.find_first_of(separators, 2); + return path.substr(0, end); } - size_t filename_pos(const StringRef &str) { + size_t filename_pos(StringRef str) { if (str.size() == 2 && is_separator(str[0]) && - is_separator(str[1])) + str[0] == str[1]) return 0; if (str.size() > 0 && is_separator(str[str.size() - 1])) @@ -109,7 +104,7 @@ namespace { return pos + 1; } - size_t root_dir_start(const StringRef &str) { + size_t root_dir_start(StringRef str) { // case "c:/" #ifdef LLVM_ON_WIN32 if (str.size() > 2 && @@ -139,13 +134,13 @@ namespace { return StringRef::npos; } - size_t parent_path_end(const StringRef &path) { + size_t parent_path_end(StringRef path) { size_t end_pos = filename_pos(path); bool filename_was_sep = path.size() > 0 && is_separator(path[end_pos]); // Skip separators except for root dir. - size_t root_dir_pos = root_dir_start(StringRef(path.begin(), end_pos)); + size_t root_dir_pos = root_dir_start(path.substr(0, end_pos)); while(end_pos > 0 && (end_pos - 1) != root_dir_pos && @@ -163,7 +158,7 @@ namespace llvm { namespace sys { namespace path { -const_iterator begin(const StringRef &path) { +const_iterator begin(StringRef path) { const_iterator i; i.Path = path; i.Component = find_first_component(path); @@ -171,7 +166,7 @@ const_iterator begin(const StringRef &path) { return i; } -const_iterator end(const StringRef &path) { +const_iterator end(StringRef path) { const_iterator i; i.Path = path; i.Position = path.size(); @@ -206,7 +201,7 @@ const_iterator &const_iterator::operator++() { || Component.endswith(":") #endif ) { - Component = StringRef(Path.begin() + Position, 1); + Component = Path.substr(Position, 1); return *this; } @@ -226,9 +221,7 @@ const_iterator &const_iterator::operator++() { // Find next component. size_t end_pos = Path.find_first_of(separators, Position); - if (end_pos == StringRef::npos) - end_pos = Path.size(); - Component = StringRef(Path.begin() + Position, end_pos - Position); + Component = Path.slice(Position, end_pos); return *this; } @@ -257,8 +250,8 @@ const_iterator &const_iterator::operator--() { --end_pos; // Find next separator. - size_t start_pos = filename_pos(StringRef(Path.begin(), end_pos)); - Component = StringRef(Path.begin() + start_pos, end_pos - start_pos); + size_t start_pos = filename_pos(Path.substr(0, end_pos)); + Component = Path.slice(start_pos, end_pos); Position = start_pos; return *this; } @@ -276,7 +269,7 @@ ptrdiff_t const_iterator::operator-(const const_iterator &RHS) const { return Position - RHS.Position; } -error_code root_path(const StringRef &path, StringRef &result) { +const StringRef root_path(StringRef path) { const_iterator b = begin(path), pos = b, e = end(path); @@ -292,32 +285,23 @@ error_code root_path(const StringRef &path, StringRef &result) { if (has_net || has_drive) { if ((++pos != e) && is_separator((*pos)[0])) { // {C:/,//net/}, so get the first two components. - result = StringRef(path.begin(), b->size() + pos->size()); - return success; + return path.substr(0, b->size() + pos->size()); } else { // just {C:,//net}, return the first component. - result = *b; - return success; + return *b; } } // POSIX style root directory. if (is_separator((*b)[0])) { - result = *b; - return success; + return *b; } - - // No root_path. - result = StringRef(); - return success; } - // No path :(. - result = StringRef(); - return success; + return StringRef(); } -error_code root_name(const StringRef &path, StringRef &result) { +const StringRef root_name(StringRef path) { const_iterator b = begin(path), e = end(path); if (b != e) { @@ -331,17 +315,15 @@ error_code root_name(const StringRef &path, StringRef &result) { if (has_net || has_drive) { // just {C:,//net}, return the first component. - result = *b; - return success; + return *b; } } // No path or no name. - result = StringRef(); - return success; + return StringRef(); } -error_code root_directory(const StringRef &path, StringRef &result) { +const StringRef root_directory(StringRef path) { const_iterator b = begin(path), pos = b, e = end(path); @@ -357,33 +339,28 @@ error_code root_directory(const StringRef &path, StringRef &result) { if ((has_net || has_drive) && // {C:,//net}, skip to the next component. (++pos != e) && is_separator((*pos)[0])) { - result = *pos; - return success; + return *pos; } // POSIX style root directory. if (!has_net && is_separator((*b)[0])) { - result = *b; - return success; + return *b; } } // No path or no root. - result = StringRef(); - return success; + return StringRef(); } -error_code relative_path(const StringRef &path, StringRef &result) { - StringRef root; - if (error_code ec = root_path(path, root)) return ec; - result = StringRef(path.begin() + root.size(), path.size() - root.size()); - return success; +const StringRef relative_path(StringRef path) { + StringRef root = root_path(path); + return root.substr(root.size()); } -error_code append(SmallVectorImpl &path, const Twine &a, - const Twine &b, - const Twine &c, - const Twine &d) { +void append(SmallVectorImpl &path, const Twine &a, + const Twine &b, + const Twine &c, + const Twine &d) { SmallString<32> a_storage; SmallString<32> b_storage; SmallString<32> c_storage; @@ -400,104 +377,42 @@ error_code append(SmallVectorImpl &path, const Twine &a, i != e; ++i) { bool path_has_sep = !path.empty() && is_separator(path[path.size() - 1]); bool component_has_sep = !i->empty() && is_separator((*i)[0]); - bool is_root_name = false; - if (error_code ec = has_root_name(*i, is_root_name)) return ec; + bool is_root_name = has_root_name(*i); if (path_has_sep) { // Strip separators from beginning of component. size_t loc = i->find_first_not_of(separators); - StringRef c = StringRef(i->begin() + loc, i->size() - loc); + StringRef c = i->substr(loc); // Append it. path.append(c.begin(), c.end()); continue; } - if (!component_has_sep && !(path.empty() && is_root_name)) { + if (!component_has_sep && !(path.empty() || is_root_name)) { // Add a separator. path.push_back(prefered_separator); } path.append(i->begin(), i->end()); } - - 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 = 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) { +const StringRef parent_path(StringRef path) { size_t end_pos = parent_path_end(path); if (end_pos == StringRef::npos) - result = StringRef(); + return StringRef(); else - result = StringRef(path.data(), end_pos); - return success; + return path.substr(0, end_pos); } -error_code remove_filename(SmallVectorImpl &path) { +void remove_filename(SmallVectorImpl &path) { size_t end_pos = parent_path_end(StringRef(path.begin(), path.size())); - if (end_pos == StringRef::npos) - return success; - path.set_size(end_pos); - return success; + if (end_pos != StringRef::npos) + path.set_size(end_pos); } -error_code replace_extension(SmallVectorImpl &path, - const Twine &extension) { +void replace_extension(SmallVectorImpl &path, const Twine &extension) { StringRef p(path.begin(), path.size()); SmallString<32> ext_storage; StringRef ext = extension.toStringRef(ext_storage); @@ -513,12 +428,11 @@ error_code replace_extension(SmallVectorImpl &path, // Append extension. path.append(ext.begin(), ext.end()); - return success; } -error_code native(const Twine &path, SmallVectorImpl &result) { +void native(const Twine &path, SmallVectorImpl &result) { // Clear result. - result.set_size(0); + result.clear(); #ifdef LLVM_ON_WIN32 SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); @@ -535,151 +449,164 @@ error_code native(const Twine &path, SmallVectorImpl &result) { #else path.toVector(result); #endif - return success; } -error_code filename(const StringRef &path, StringRef &result) { - result = *(--end(path)); - return success; +const StringRef filename(StringRef path) { + return *(--end(path)); } -error_code stem(const StringRef &path, StringRef &result) { - StringRef fname; - if (error_code ec = filename(path, fname)) return ec; +const StringRef stem(StringRef path) { + StringRef fname = filename(path); size_t pos = fname.find_last_of('.'); if (pos == StringRef::npos) - result = fname; + return fname; else if ((fname.size() == 1 && fname == ".") || (fname.size() == 2 && fname == "..")) - result = fname; + return fname; else - result = StringRef(fname.begin(), pos); - - return success; + return fname.substr(0, pos); } -error_code extension(const StringRef &path, StringRef &result) { - StringRef fname; - if (error_code ec = filename(path, fname)) return ec; +const StringRef extension(StringRef path) { + StringRef fname = filename(path); size_t pos = fname.find_last_of('.'); if (pos == StringRef::npos) - result = StringRef(); + return StringRef(); else if ((fname.size() == 1 && fname == ".") || (fname.size() == 2 && fname == "..")) - result = StringRef(); + return StringRef(); else - result = StringRef(fname.begin() + pos, fname.size() - pos); - - return success; + return fname.substr(pos); } -error_code has_root_name(const Twine &path, bool &result) { +bool has_root_name(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = root_name(p, p)) return ec; - - result = !p.empty(); - return success; + return !root_name(p).empty(); } -error_code has_root_directory(const Twine &path, bool &result) { +bool has_root_directory(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = root_directory(p, p)) return ec; - - result = !p.empty(); - return success; + return !root_directory(p).empty(); } -error_code has_root_path(const Twine &path, bool &result) { +bool has_root_path(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = root_path(p, p)) return ec; - - result = !p.empty(); - return success; + return !root_path(p).empty(); } -error_code has_filename(const Twine &path, bool &result) { +bool has_filename(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = filename(p, p)) return ec; - - result = !p.empty(); - return success; + return !filename(p).empty(); } -error_code has_parent_path(const Twine &path, bool &result) { +bool has_parent_path(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = parent_path(p, p)) return ec; - - result = !p.empty(); - return success; + return !parent_path(p).empty(); } -error_code has_stem(const Twine &path, bool &result) { +bool has_stem(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = stem(p, p)) return ec; - - result = !p.empty(); - return success; + return !stem(p).empty(); } -error_code has_extension(const Twine &path, bool &result) { +bool has_extension(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - if (error_code ec = extension(p, p)) return ec; - - result = !p.empty(); - return success; + return !extension(p).empty(); } -error_code is_absolute(const Twine &path, bool &result) { +bool is_absolute(const Twine &path) { SmallString<128> path_storage; StringRef p = path.toStringRef(path_storage); - bool rootDir = false, - rootName = false; - if (error_code ec = has_root_directory(p, rootDir)) return ec; + bool rootDir = has_root_directory(p), #ifdef LLVM_ON_WIN32 - if (error_code ec = has_root_name(p, rootName)) return ec; + rootName = has_root_name(p); #else - rootName = true; + rootName = true; #endif - result = rootDir && rootName; - return success; + return rootDir && rootName; } -error_code is_relative(const Twine &path, bool &result) { - bool res; - error_code ec = is_absolute(path, res); - result = !res; - return ec; +bool is_relative(const Twine &path) { + return !is_absolute(path); } } // end namespace path namespace fs { +error_code make_absolute(SmallVectorImpl &path) { + StringRef p(path.data(), path.size()); + + bool rootName = path::has_root_name(p), + rootDirectory = path::has_root_directory(p); + + // 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. + path::append(current_dir, p); + // Set path to the result. + path.swap(current_dir); + return success; + } + + if (!rootName && rootDirectory) { + StringRef cdrn = path::root_name(current_dir); + SmallString<128> curDirRootName(cdrn.begin(), cdrn.end()); + path::append(curDirRootName, p); + // Set path to the result. + path.swap(curDirRootName); + return success; + } + + if (rootName && !rootDirectory) { + StringRef pRootName = path::root_name(p); + StringRef bRootDirectory = path::root_directory(current_dir); + StringRef bRelativePath = path::relative_path(current_dir); + StringRef pRelativePath = path::relative_path(p); + + SmallString<128> res; + path::append(res, pRootName, bRootDirectory, bRelativePath, pRelativePath); + 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); - StringRef parent; + StringRef parent = path::parent_path(p); bool parent_exists; - if (error_code ec = path::parent_path(p, parent)) return ec; + if (error_code ec = fs::exists(parent, parent_exists)) return ec; if (!parent_exists) @@ -688,6 +615,43 @@ error_code create_directories(const Twine &path, bool &existed) { return create_directory(p, existed); } +bool exists(file_status status) { + return status_known(status) && status.type() != file_type::file_not_found; +} + +bool status_known(file_status s) { + return s.type() != file_type::status_error; +} + +bool is_directory(file_status status) { + return status.type() == file_type::directory_file; +} + +bool is_regular_file(file_status status) { + return status.type() == file_type::regular_file; +} + +bool is_symlink(file_status status) { + return status.type() == file_type::symlink_file; +} + +bool is_other(file_status status) { + return exists(status) && + !is_regular_file(status) && + !is_directory(status) && + !is_symlink(status); +} + +void directory_entry::replace_filename(const Twine &filename, file_status st, + file_status symlink_st) { + SmallString<128> path(Path.begin(), Path.end()); + path::remove_filename(path); + path::append(path, filename); + Path = path.str(); + Status = st; + SymlinkStatus = symlink_st; +} + } // end namespace fs } // end namespace sys } // end namespace llvm