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:
parent
18eafd922d
commit
7a600416e1
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user