diff options
-rw-r--r-- | src/utils/SkOSPath.cpp | 17 | ||||
-rw-r--r-- | tests/OSPathTest.cpp | 17 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/utils/SkOSPath.cpp b/src/utils/SkOSPath.cpp index d9a5ac53f3..7898fb1e46 100644 --- a/src/utils/SkOSPath.cpp +++ b/src/utils/SkOSPath.cpp @@ -9,7 +9,8 @@ SkString SkOSPath::Join(const char *rootPath, const char *relativePath) { SkString result(rootPath); - if (!result.endsWith(SEPARATOR) && !result.isEmpty()) { + if (!result.endsWith(SEPARATOR) && ('\\' != SEPARATOR || !result.endsWith('/')) && + !result.isEmpty()) { result.appendUnichar(SEPARATOR); } result.append(relativePath); @@ -21,6 +22,12 @@ SkString SkOSPath::Basename(const char* fullPath) { return SkString(); } const char* filename = strrchr(fullPath, SEPARATOR); + if ('\\' == SEPARATOR) { + const char* alternate = strrchr(fullPath, '/'); + if (filename < alternate) { + filename = alternate; + } + } if (nullptr == filename) { filename = fullPath; } else { @@ -34,11 +41,17 @@ SkString SkOSPath::Dirname(const char* fullPath) { return SkString(); } const char* end = strrchr(fullPath, SEPARATOR); + if ('\\' == SEPARATOR) { + const char* alternate = strrchr(fullPath, '/'); + if (end < alternate) { + end = alternate; + } + } if (nullptr == end) { return SkString(); } if (end == fullPath) { - SkASSERT(fullPath[0] == SEPARATOR); + SkASSERT(fullPath[0] == SEPARATOR || ('\\' == SEPARATOR && fullPath[0] == '/')); ++end; } return SkString(fullPath, end - fullPath); diff --git a/tests/OSPathTest.cpp b/tests/OSPathTest.cpp index 22deff80a5..74ca802304 100644 --- a/tests/OSPathTest.cpp +++ b/tests/OSPathTest.cpp @@ -32,7 +32,8 @@ static void test_dir_with_file(skiatest::Reporter* reporter, SkString dir, // fullName should be the combined size of dir and file, plus one if // dir did not include the final path separator. size_t expectedSize = dir.size() + filename.size(); - if (!dir.endsWith(SkOSPath::SEPARATOR) && !dir.isEmpty()) { + if (!dir.endsWith(SkOSPath::SEPARATOR) && ('\\' != SkOSPath::SEPARATOR || + !dir.endsWith('/')) && !dir.isEmpty()) { expectedSize++; } REPORTER_ASSERT(reporter, fullName.size() == expectedSize); @@ -46,7 +47,10 @@ static void test_dir_with_file(skiatest::Reporter* reporter, SkString dir, // dirname should be the same as dir with any trailing seperators removed. // Except when the the string is just "/". SkString strippedDir = dir; - while (strippedDir.size() > 2 && strippedDir[strippedDir.size() - 1] == SkOSPath::SEPARATOR) { + while (strippedDir.size() > 2 && + (strippedDir[strippedDir.size() - 1] == SkOSPath::SEPARATOR || + ('\\' == SkOSPath::SEPARATOR && + strippedDir[strippedDir.size() - 1] == '/'))) { strippedDir.remove(strippedDir.size() - 1, 1); } if (!dirname.equals(strippedDir)) { @@ -102,4 +106,13 @@ DEF_TEST(OSPath, reporter) { // Test that nullptr can be used for the directory and filename. SkString emptyPath = SkOSPath::Join(nullptr, nullptr); REPORTER_ASSERT(reporter, emptyPath.isEmpty()); + +#ifdef SK_BUILD_FOR_WIN + test_dir_with_file(reporter, SkString("dir/"), filename); + test_dir_with_file(reporter, SkString("dir/dir"), filename); + test_dir_with_file(reporter, SkString("dir\\dir/"), filename); + test_dir_with_file(reporter, SkString("dir/dir\\"), filename); + test_dir_with_file(reporter, SkString("dir\\dir/dir"), filename); + test_dir_with_file(reporter, SkString("dir/dir\\dir"), filename); +#endif } |