Author: Martin Storsjö Date: 2021-01-07T10:02:47+02:00 New Revision: f4485240a2182050d6417947a407fe4c551e2011
URL: https://github.com/llvm/llvm-project/commit/f4485240a2182050d6417947a407fe4c551e2011 DIFF: https://github.com/llvm/llvm-project/commit/f4485240a2182050d6417947a407fe4c551e2011.diff LOG: [libcxx] Handle backslash as path separator on windows Differential Revision: https://reviews.llvm.org/D91138 Added: Modified: libcxx/include/filesystem libcxx/src/filesystem/operations.cpp Removed: ################################################################################ diff --git a/libcxx/include/filesystem b/libcxx/include/filesystem index e39790c50955..c60020a3e893 100644 --- a/libcxx/include/filesystem +++ b/libcxx/include/filesystem @@ -1116,7 +1116,12 @@ public: _LIBCPP_INLINE_VISIBILITY void clear() noexcept { __pn_.clear(); } - path& make_preferred() { return *this; } + path& make_preferred() { +#if defined(_LIBCPP_WIN32API) + _VSTD::replace(__pn_.begin(), __pn_.end(), L'/', L'\\'); +#endif + return *this; + } _LIBCPP_INLINE_VISIBILITY path& remove_filename() { diff --git a/libcxx/src/filesystem/operations.cpp b/libcxx/src/filesystem/operations.cpp index 4d585af78f98..7db2d1ff0074 100644 --- a/libcxx/src/filesystem/operations.cpp +++ b/libcxx/src/filesystem/operations.cpp @@ -51,6 +51,17 @@ _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM namespace { + +bool isSeparator(path::value_type C) { + if (C == '/') + return true; +#if defined(_LIBCPP_WIN32API) + if (C == '\\') + return true; +#endif + return false; +} + namespace parser { using string_view_t = path::__string_view; @@ -271,21 +282,21 @@ struct PathParser { } PosPtr consumeSeparator(PosPtr P, PosPtr End) const noexcept { - if (P == End || *P != '/') + if (P == End || !isSeparator(*P)) return nullptr; const int Inc = P < End ? 1 : -1; P += Inc; - while (P != End && *P == '/') + while (P != End && isSeparator(*P)) P += Inc; return P; } PosPtr consumeName(PosPtr P, PosPtr End) const noexcept { - if (P == End || *P == '/') + if (P == End || isSeparator(*P)) return nullptr; const int Inc = P < End ? 1 : -1; P += Inc; - while (P != End && *P != '/') + while (P != End && !isSeparator(*P)) P += Inc; return P; } @@ -1393,7 +1404,7 @@ string_view_t path::__root_path_raw() const { auto PP = PathParser::CreateBegin(__pn_); if (PP.State == PathParser::PS_InRootName) { auto NextCh = PP.peek(); - if (NextCh && *NextCh == '/') { + if (NextCh && isSeparator(*NextCh)) { ++PP; return createView(__pn_.data(), &PP.RawEntry.back()); } @@ -1491,6 +1502,10 @@ static PathPartKind ClassifyPathPart(string_view_t Part) { return PK_DotDot; if (Part == PS("/")) return PK_RootSep; +#if defined(_LIBCPP_WIN32API) + if (Part == PS("\\")) + return PK_RootSep; +#endif return PK_Filename; } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits