allow both slash types

Windows allows forwards and backwards slashes
for path directory delimiters.

R=halcanary@google.com

Change-Id: Ie6f1257c98ac8e2468d9297b5dc391fd17f4ae82
Reviewed-on: https://skia-review.googlesource.com/90821
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Cary Clark <caryclark@google.com>
This commit is contained in:
Cary Clark 2018-01-05 10:55:28 -05:00 committed by Skia Commit-Bot
parent 18eafd922d
commit 7a600416e1
2 changed files with 30 additions and 4 deletions

View File

@ -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);

View File

@ -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
}