diff --git a/renderdoc/strings/string_utils.cpp b/renderdoc/strings/string_utils.cpp index 71d5407c6..c01354813 100644 --- a/renderdoc/strings/string_utils.cpp +++ b/renderdoc/strings/string_utils.cpp @@ -141,6 +141,29 @@ rdcstr strip_extension(const rdcstr &path) return path.substr(0, offs); } +rdcstr standardise_directory_separator(const rdcstr &path) +{ + // Replace '\' -> '/' + // Replace '//' -> '/' + rdcstr ret; + ret.reserve(path.size()); + int slashCount = 0; + for(size_t i = 0; i < path.size(); ++i) + { + char c = path[i]; + if(c == '\\') + c = '/'; + + if(c == '/') + slashCount++; + else + slashCount = 0; + if(slashCount < 2) + ret.push_back(c); + } + return ret; +} + void strip_nonbasic(rdcstr &str) { for(char &c : str) @@ -339,6 +362,17 @@ TEST_CASE("String manipulation", "[string]") CHECK(strip_extension("bar/foo.exe") == "bar/foo"); }; + SECTION("standardise_directory_separator") + { + CHECK(standardise_directory_separator("a/exe.ext") == "a/exe.ext"); + CHECK(standardise_directory_separator("a\\exe.ext") == "a/exe.ext"); + CHECK(standardise_directory_separator("a//exe.ext") == "a/exe.ext"); + CHECK(standardise_directory_separator("a\\\\exe.ext") == "a/exe.ext"); + CHECK(standardise_directory_separator("a\\b/exe.ext") == "a/b/exe.ext"); + CHECK(standardise_directory_separator("a\\/b/\\exe.ext") == "a/b/exe.ext"); + CHECK(standardise_directory_separator("a\\\\/b//exe.ext") == "a/b/exe.ext"); + }; + SECTION("strupper") { CHECK(strupper("foobar") == "FOOBAR"); diff --git a/renderdoc/strings/string_utils.h b/renderdoc/strings/string_utils.h index e409f4974..cb1c29419 100644 --- a/renderdoc/strings/string_utils.h +++ b/renderdoc/strings/string_utils.h @@ -37,6 +37,10 @@ rdcstr get_basename(const rdcstr &path); rdcstr get_dirname(const rdcstr &path); rdcstr strip_extension(const rdcstr &path); +// Replace all directory separators combinations with '/' +// i.e. '\' -> '/' and '//' -> '/' +rdcstr standardise_directory_separator(const rdcstr &path); + // remove everything but alphanumeric ' ' and '.' // It replaces everything else with _ // for logging strings where they might contain garbage characters