return !path.empty() && path[0] == '/';
}
+bool
+matches_dir_prefix_or_file(nonstd::string_view dir_prefix_or_file,
+ nonstd::string_view path)
+{
+ return !dir_prefix_or_file.empty() && !path.empty()
+ && dir_prefix_or_file.length() <= path.length()
+ && path.starts_with(dir_prefix_or_file)
+ && (dir_prefix_or_file.length() == path.length()
+ || is_dir_separator(path[dir_prefix_or_file.length()])
+ || is_dir_separator(dir_prefix_or_file.back()));
+}
+
std::string
normalize_absolute_path(string_view path)
{
;
}
+// Return whether `path` is equal to `dir_prefix_or_file` or if
+// `dir_prefix_or_file` is a directory prefix of `path`.
+bool matches_dir_prefix_or_file(nonstd::string_view dir_prefix_or_file,
+ nonstd::string_view path);
+
// Normalize absolute path `path`, not taking symlinks into account.
//
// Normalization here means syntactically removing redundant slashes and
#endif
}
+TEST_CASE("Util::matches_dir_prefix_or_file")
+{
+ CHECK(!Util::matches_dir_prefix_or_file("", ""));
+ CHECK(!Util::matches_dir_prefix_or_file("/", ""));
+ CHECK(!Util::matches_dir_prefix_or_file("", "/"));
+
+ CHECK(Util::matches_dir_prefix_or_file("aa", "aa"));
+ CHECK(!Util::matches_dir_prefix_or_file("aaa", "aa"));
+ CHECK(!Util::matches_dir_prefix_or_file("aa", "aaa"));
+ CHECK(!Util::matches_dir_prefix_or_file("aa/", "aa"));
+
+ CHECK(Util::matches_dir_prefix_or_file("/aa/bb", "/aa/bb"));
+ CHECK(!Util::matches_dir_prefix_or_file("/aa/b", "/aa/bb"));
+ CHECK(!Util::matches_dir_prefix_or_file("/aa/bbb", "/aa/bb"));
+
+ CHECK(Util::matches_dir_prefix_or_file("/aa", "/aa/bb"));
+ CHECK(Util::matches_dir_prefix_or_file("/aa/", "/aa/bb"));
+ CHECK(!Util::matches_dir_prefix_or_file("/aa/bb", "/aa"));
+ CHECK(!Util::matches_dir_prefix_or_file("/aa/bb", "/aa/"));
+
+#ifdef _WIN32
+ CHECK(Util::matches_dir_prefix_or_file("\\aa", "\\aa\\bb"));
+ CHECK(Util::matches_dir_prefix_or_file("\\aa\\", "\\aa\\bb"));
+#else
+ CHECK(!Util::matches_dir_prefix_or_file("\\aa", "\\aa\\bb"));
+ CHECK(!Util::matches_dir_prefix_or_file("\\aa\\", "\\aa\\bb"));
+#endif
+}
+
TEST_CASE("Util::normalize_absolute_path")
{
CHECK(Util::normalize_absolute_path("") == "");